From 067cdb35ec2e679329c36e5eab687ae0cb11cb10 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 13 Aug 2026 22:24:53 -0400 Subject: [PATCH 01/44] feat(validation): freeze current comparison targets Centralize immutable framework versions, artifact identities, environment mappings, and scenario membership. Add a validated cross-repository claim inventory for the library, current chapter notebooks, and publication drafts. Closes ml4t/backtest-dev#2 --- .../test_framework_target_manifest.py | 199 ++++++++++++ validation/claim_inventory.toml | 203 +++++++++++++ validation/common/framework_registry.py | 284 ++++++++++++++++++ validation/common/types.py | 10 +- validation/framework_targets.toml | 83 +++++ validation/generate_parity_claims.py | 7 +- validation/release_checks.txt | 1 + validation/run_all_benchmarks.py | 120 ++++---- validation/run_all_correctness.py | 49 +-- validation/scenarios/definitions.py | 5 +- 10 files changed, 847 insertions(+), 114 deletions(-) create mode 100644 tests/contracts/test_framework_target_manifest.py create mode 100644 validation/claim_inventory.toml create mode 100644 validation/common/framework_registry.py create mode 100644 validation/framework_targets.toml diff --git a/tests/contracts/test_framework_target_manifest.py b/tests/contracts/test_framework_target_manifest.py new file mode 100644 index 00000000..2f2b38ad --- /dev/null +++ b/tests/contracts/test_framework_target_manifest.py @@ -0,0 +1,199 @@ +"""Contracts for frozen comparison targets and the comparison-claim inventory.""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + +_PROJECT_ROOT = Path(__file__).parents[2] +_VALIDATION_DIR = _PROJECT_ROOT / "validation" +if str(_VALIDATION_DIR) not in sys.path: + sys.path.insert(0, str(_VALIDATION_DIR)) + +import run_all_benchmarks # noqa: E402 +from common.framework_registry import ( # noqa: E402 + ManifestError, + load_claim_inventory, + load_framework_manifest, +) + + +def test_current_framework_targets_are_exact_and_immutable() -> None: + manifest = load_framework_manifest() + + assert manifest.freeze_date == "2026-08-13" + assert set(manifest.targets) == { + "backtrader", + "lean", + "vectorbt_oss", + "vectorbt_pro", + "zipline", + } + assert {key: target.version for key, target in manifest.targets.items()} == { + "vectorbt_pro": "2026.6.27", + "vectorbt_oss": "1.1.0", + "backtrader": "1.9.78.123", + "zipline": "3.1.1", + "lean": "18001", + } + assert manifest.scenario_framework_ids == ( + "vectorbt_pro", + "vectorbt_oss", + "backtrader", + "zipline", + ) + for target in manifest.targets.values(): + assert not any(operator in target.version for operator in ("<", ">", "=", "*", "~")) + assert target.immutable_id.startswith(("git:", "sha256:")) + assert target.profile + assert target.python + assert target.license + assert target.access in {"public", "licensed"} + + +def test_scenario_targets_define_reproducible_interpreters() -> None: + manifest = load_framework_manifest() + + for framework_id in manifest.scenario_framework_ids: + target = manifest.targets[framework_id] + assert target.environment + assert target.python_env_var.startswith("ML4T_") + + +def test_benchmark_runner_uses_frozen_target_environments() -> None: + manifest = load_framework_manifest() + + assert set(run_all_benchmarks.FRAMEWORKS) == {"ml4t", *manifest.targets} + for framework_id, target in manifest.targets.items(): + assert run_all_benchmarks.FRAMEWORKS[framework_id]["venv"] == target.environment + + +@pytest.mark.parametrize( + ("replacement", "message"), + [ + ('version = "1.1.0"', "missing required field 'immutable_id'"), + ('version = ">=1.1.0"\nimmutable_id = "git:abc"', "must be an exact version"), + ], +) +def test_invalid_framework_targets_are_rejected( + tmp_path: Path, + replacement: str, + message: str, +) -> None: + manifest = tmp_path / "targets.toml" + manifest.write_text( + """ +[metadata] +schema_version = 1 +freeze_date = "2026-08-13" +scenario_frameworks = ["example"] + +[framework.example] +display_name = "Example" +package = "example" +profile = "default" +python = ">=3.11" +license = "MIT" +access = "public" +source = "https://example.com" +environment = ".venv-example" +python_env_var = "ML4T_EXAMPLE_PYTHON" +scenario_matrix = true +""" + + replacement + + "\n", + encoding="utf-8", + ) + + with pytest.raises(ManifestError, match=message): + load_framework_manifest(manifest) + + +def test_duplicate_framework_tables_are_rejected(tmp_path: Path) -> None: + manifest = tmp_path / "targets.toml" + manifest.write_text( + """ +[metadata] +schema_version = 1 +freeze_date = "2026-08-13" + +[framework.example] +display_name = "Example" +package = "example" +version = "1.0" +profile = "default" +python = ">=3.11" +license = "MIT" +access = "public" +source = "https://example.com" +immutable_id = "git:abc" +scenario_matrix = false + +[framework.example] +version = "2.0" +""", + encoding="utf-8", + ) + + with pytest.raises(ManifestError, match="Invalid TOML"): + load_framework_manifest(manifest) + + +def test_claim_inventory_accounts_for_all_repositories_and_known_targets() -> None: + manifest = load_framework_manifest() + inventory = load_claim_inventory(manifest=manifest) + + assert inventory.audit_date == manifest.freeze_date + assert {claim.repository for claim in inventory.claims} == { + "ml4t/backtest", + "ml4t/public", + "ml4t/content-marketing", + } + assert {claim.claim_type for claim in inventory.claims} == { + "behavioral", + "correctness", + "performance", + "qualitative", + } + assert inventory.unresolved + assert all(item.issue.startswith("ml4t/backtest-dev#") for item in inventory.unresolved) + local_paths = { + path + for claim in inventory.claims + if claim.repository == "ml4t/backtest" + for path in claim.paths + } + assert local_paths + assert all((_PROJECT_ROOT / path).is_file() for path in local_paths) + + +def test_claim_inventory_rejects_unknown_framework(tmp_path: Path) -> None: + inventory = tmp_path / "claims.toml" + inventory.write_text( + """ +[metadata] +schema_version = 1 +audit_date = "2026-08-13" + +[[claim]] +id = "unknown-target" +repository = "ml4t/backtest" +paths = ["README.md"] +type = "correctness" +frameworks = ["not-a-framework"] +required_evidence = ["canonical_trade_log"] +status = "unresolved" +issue = "ml4t/backtest-dev#9" + +[[unresolved]] +id = "placeholder" +finding = "Placeholder finding." +issue = "ml4t/backtest-dev#9" +""", + encoding="utf-8", + ) + + with pytest.raises(ManifestError, match="unknown framework"): + load_claim_inventory(inventory) diff --git a/validation/claim_inventory.toml b/validation/claim_inventory.toml new file mode 100644 index 00000000..9ce9f86d --- /dev/null +++ b/validation/claim_inventory.toml @@ -0,0 +1,203 @@ +[metadata] +schema_version = 1 +audit_date = "2026-08-13" + +[[claim]] +id = "library-scenario-equivalence" +repository = "ml4t/backtest" +paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/CORRECTNESS_RESULTS.json"] +type = "correctness" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"] +required_evidence = ["executed_matrix", "canonical_trade_log", "canonical_fill_log", "equity_curve", "environment_identity"] +status = "unresolved" +issue = "ml4t/backtest-dev#3" + +[[claim]] +id = "library-vectorbt-behavior" +repository = "ml4t/backtest" +paths = ["README.md", "docs/concepts/how-it-works.md", "docs/getting-started/quickstart.md", "docs/user-guide/accounts.md", "docs/user-guide/configuration.md", "docs/user-guide/execution-semantics.md", "docs/user-guide/profiles.md", "docs/user-guide/rebalancing.md", "validation/METHODOLOGY.md", "validation/frameworks/vectorbt_oss.py", "validation/frameworks/vectorbt_pro.py"] +type = "behavioral" +frameworks = ["vectorbt_pro", "vectorbt_oss"] +required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] +status = "unresolved" +issue = "ml4t/backtest-dev#5" + +[[claim]] +id = "library-backtrader-behavior" +repository = "ml4t/backtest" +paths = ["README.md", "docs/concepts/how-it-works.md", "docs/getting-started/quickstart.md", "docs/user-guide/accounts.md", "docs/user-guide/configuration.md", "docs/user-guide/execution-semantics.md", "docs/user-guide/profiles.md", "docs/user-guide/rebalancing.md", "validation/METHODOLOGY.md", "validation/frameworks/backtrader.py"] +type = "behavioral" +frameworks = ["backtrader"] +required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] +status = "unresolved" +issue = "ml4t/backtest-dev#6" + +[[claim]] +id = "library-zipline-behavior" +repository = "ml4t/backtest" +paths = ["README.md", "docs/concepts/how-it-works.md", "docs/getting-started/quickstart.md", "docs/user-guide/accounts.md", "docs/user-guide/configuration.md", "docs/user-guide/execution-semantics.md", "docs/user-guide/profiles.md", "validation/METHODOLOGY.md", "validation/frameworks/zipline.py"] +type = "behavioral" +frameworks = ["zipline"] +required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] +status = "unresolved" +issue = "ml4t/backtest-dev#7" + +[[claim]] +id = "library-lean-behavior" +repository = "ml4t/backtest" +paths = ["README.md", "docs/concepts/how-it-works.md", "docs/user-guide/accounts.md", "docs/user-guide/configuration.md", "docs/user-guide/execution-semantics.md", "docs/user-guide/profiles.md", "validation/lean/README.md", "validation/benchmark_suite.py"] +type = "behavioral" +frameworks = ["lean"] +required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] +status = "unresolved" +issue = "ml4t/backtest-dev#8" + +[[claim]] +id = "library-large-scale-equivalence" +repository = "ml4t/backtest" +paths = ["README.md", "docs/index.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/vectorbt_pro/large_scale_parity.json"] +type = "correctness" +frameworks = ["vectorbt_pro"] +required_evidence = ["public_workload", "canonical_trade_log", "canonical_fill_log", "equity_curve", "environment_identity"] +status = "unresolved" +issue = "ml4t/backtest-dev#10" + +[[claim]] +id = "library-controlled-performance" +repository = "ml4t/backtest" +paths = ["validation/benchmark_suite.py", "validation/run_all_benchmarks.py", "validation/performance_baseline.py", "validation/performance_baselines.json"] +type = "performance" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["controlled_workload", "warmup_policy", "repetitions", "machine_identity", "raw_timings"] +status = "unresolved" +issue = "ml4t/backtest-dev#11" + +[[claim]] +id = "library-idiomatic-performance" +repository = "ml4t/backtest" +paths = ["validation/vectorbt_pro/benchmark_performance.py", "validation/backtrader/benchmark_performance.py", "validation/zipline/benchmark_performance.py"] +type = "performance" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["idiomatic_workload", "declared_scope", "warmup_policy", "repetitions", "machine_identity", "raw_timings"] +status = "unresolved" +issue = "ml4t/backtest-dev#12" + +[[claim]] +id = "library-qualitative-comparison" +repository = "ml4t/backtest" +paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validation/README.md", "validation/METHODOLOGY.md"] +type = "qualitative" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["upstream_source_reference", "scope_qualification"] +status = "unresolved" +issue = "ml4t/backtest-dev#13" + +[[claim]] +id = "book-framework-equivalence" +repository = "ml4t/public" +paths = ["16_strategy_simulation/06_framework_parity.py", "16_strategy_simulation/15_lean_engine_parity.py", "16_strategy_simulation/16_case_study_lean_parity.py", "16_strategy_simulation/17_backtrader_zipline_engine_parity.py", "16_strategy_simulation/18_vectorbt_engine_parity.py", "16_strategy_simulation/validation/_library_validation.py", "16_strategy_simulation/validation/adapters/lean_adapter.py", "16_strategy_simulation/validation/adapters/ml4t_adapter.py", "16_strategy_simulation/validation/adapters/vectorbt_adapter.py"] +type = "correctness" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["executed_notebook", "canonical_trade_log", "canonical_fill_log", "equity_curve", "environment_identity"] +status = "unresolved" +issue = "ml4t/backtest-dev#14" + +[[claim]] +id = "book-performance-comparison" +repository = "ml4t/public" +paths = ["16_strategy_simulation/03_single_asset_vectorbt.py", "16_strategy_simulation/04_single_asset_ml4t_backtest.py", "16_strategy_simulation/README.md"] +type = "performance" +frameworks = ["vectorbt_oss"] +required_evidence = ["executed_notebook", "retained_benchmark", "workload_definition", "raw_timings"] +status = "unresolved" +issue = "ml4t/backtest-dev#14" + +[[claim]] +id = "book-framework-tradeoffs" +repository = "ml4t/public" +paths = ["16_strategy_simulation/06_framework_parity.py", "16_strategy_simulation/07_engine_divergence_anatomy.py", "16_strategy_simulation/README.md"] +type = "qualitative" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["executed_notebook", "upstream_source_reference", "scope_qualification"] +status = "unresolved" +issue = "ml4t/backtest-dev#14" + +[[claim]] +id = "content-marketing-correctness" +repository = "ml4t/content-marketing" +paths = ["insights/issues/issue_022/derivatives/hacker-news.md", "insights/issues/issue_022/derivatives/reddit-post.md", "insights/issues/issue_022/reviews/parity-claims-audit.md"] +type = "correctness" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["published_library_evidence", "canonical_comparison", "environment_identity"] +status = "unresolved" +issue = "ml4t/backtest-dev#15" + +[[claim]] +id = "content-marketing-performance" +repository = "ml4t/content-marketing" +paths = ["insights/issues/issue_022/derivatives/hacker-news.md", "insights/issues/issue_022/derivatives/reddit-post.md"] +type = "performance" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["published_library_evidence", "workload_definition", "raw_timings", "scope_qualification"] +status = "unresolved" +issue = "ml4t/backtest-dev#15" + +[[claim]] +id = "content-marketing-qualitative" +repository = "ml4t/content-marketing" +paths = ["insights/issues/issue_022/derivatives/hacker-news.md", "insights/issues/issue_022/derivatives/reddit-post.md", "insights/issues/issue_022/reviews/parity-claims-audit.md"] +type = "qualitative" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["published_library_evidence", "upstream_source_reference", "scope_qualification"] +status = "unresolved" +issue = "ml4t/backtest-dev#15" + +[[unresolved]] +id = "zipline-defaults-table" +finding = "Zipline commission and slippage defaults are misstated." +issue = "ml4t/backtest-dev#7" + +[[unresolved]] +id = "defaults-not-exercised" +finding = "Configured-equivalence scenarios do not test upstream defaults." +issue = "ml4t/backtest-dev#5" + +[[unresolved]] +id = "empty-correctness-details" +finding = "Retained pass records omit compared measurements." +issue = "ml4t/backtest-dev#3" + +[[unresolved]] +id = "stale-correctness-artifact" +finding = "The retained matrix predates current engine and framework targets." +issue = "ml4t/backtest-dev#13" + +[[unresolved]] +id = "scenario-scale-language" +finding = "The scenario matrix covers conventions, not high trade volume." +issue = "ml4t/backtest-dev#9" + +[[unresolved]] +id = "partial-ci-matrix" +finding = "CI does not execute every required framework and scenario pair." +issue = "ml4t/backtest-dev#4" + +[[unresolved]] +id = "mutable-install-ranges" +finding = "Comparison environments use version floors while claims name exact versions." +issue = "ml4t/backtest-dev#4" + +[[unresolved]] +id = "missing-vectorbt-oss-environment" +finding = "The documented VectorBT OSS interpreter path is not provisioned." +issue = "ml4t/backtest-dev#4" + +[[unresolved]] +id = "exact-means-quantized" +finding = "Exact comparisons mean equality after canonical quantization, not bit identity." +issue = "ml4t/backtest-dev#3" + +[[unresolved]] +id = "nonportable-large-scale-data" +finding = "The retained large-scale artifact points to a temporary local dataset path." +issue = "ml4t/backtest-dev#10" diff --git a/validation/common/framework_registry.py b/validation/common/framework_registry.py new file mode 100644 index 00000000..6e970be4 --- /dev/null +++ b/validation/common/framework_registry.py @@ -0,0 +1,284 @@ +"""Validated framework targets and comparison-claim inventory.""" + +from __future__ import annotations + +import re +import tomllib +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +VALIDATION_DIR = Path(__file__).parents[1] +DEFAULT_MANIFEST_PATH = VALIDATION_DIR / "framework_targets.toml" +DEFAULT_CLAIM_INVENTORY_PATH = VALIDATION_DIR / "claim_inventory.toml" +_EXACT_VERSION = re.compile(r"^[0-9][0-9A-Za-z._+-]*$") +_IMMUTABLE_ID = re.compile(r"^(?:git:[0-9a-f]{7,40}|sha256:[0-9a-f]{64})$") +_CLAIM_TYPES = {"behavioral", "correctness", "performance", "qualitative"} +_ACCESS_TYPES = {"public", "licensed"} + + +class ManifestError(ValueError): + """A framework or claim manifest violates its schema.""" + + +@dataclass(frozen=True) +class FrameworkTarget: + """One immutable comparison target.""" + + framework_id: str + display_name: str + package: str + version: str + profile: str + python: str + license: str + access: str + source: str + immutable_id: str + scenario_matrix: bool + source_commit: str | None = None + artifact: str | None = None + environment: str | None = None + python_env_var: str | None = None + platform_artifact: str | None = None + cli_version: str | None = None + cli_immutable_id: str | None = None + + def evidence_metadata(self) -> dict[str, object]: + """Return complete target identity for retained evidence.""" + metadata: dict[str, object] = { + "display_name": self.display_name, + "profile": self.profile, + "package": self.package, + "version": self.version, + "python": self.python, + "license": self.license, + "access": self.access, + "source": self.source, + "immutable_id": self.immutable_id, + } + optional = { + "commit": self.source_commit, + "artifact": self.artifact, + "platform_artifact": self.platform_artifact, + "cli_version": self.cli_version, + "cli_immutable_id": self.cli_immutable_id, + } + metadata.update({key: value for key, value in optional.items() if value is not None}) + return metadata + + +@dataclass(frozen=True) +class FrameworkManifest: + """Frozen comparison target set.""" + + schema_version: int + freeze_date: str + scenario_framework_ids: tuple[str, ...] + targets: dict[str, FrameworkTarget] + + +@dataclass(frozen=True) +class Claim: + """One externally visible comparison claim surface.""" + + claim_id: str + repository: str + paths: tuple[str, ...] + claim_type: str + frameworks: tuple[str, ...] + required_evidence: tuple[str, ...] + status: str + issue: str + + +@dataclass(frozen=True) +class UnresolvedFinding: + """One known audit finding routed to an implementation issue.""" + + finding_id: str + finding: str + issue: str + + +@dataclass(frozen=True) +class ClaimInventory: + """Dated inventory of claims and unresolved findings.""" + + schema_version: int + audit_date: str + claims: tuple[Claim, ...] + unresolved: tuple[UnresolvedFinding, ...] + + +def _load_toml(path: Path) -> dict[str, Any]: + try: + with path.open("rb") as file: + payload = tomllib.load(file) + except tomllib.TOMLDecodeError as error: + raise ManifestError(f"Invalid TOML in {path}: {error}") from error + if not isinstance(payload, dict): + raise ManifestError(f"Manifest must be a TOML table: {path}") + return payload + + +def _required(table: dict[str, Any], field: str, *, context: str) -> Any: + if field not in table: + raise ManifestError(f"{context} missing required field '{field}'") + return table[field] + + +def _string(table: dict[str, Any], field: str, *, context: str) -> str: + value = _required(table, field, context=context) + if not isinstance(value, str) or not value.strip(): + raise ManifestError(f"{context} field '{field}' must be a non-empty string") + return value + + +def _strings(table: dict[str, Any], field: str, *, context: str) -> tuple[str, ...]: + value = _required(table, field, context=context) + if not isinstance(value, list) or not value or not all(isinstance(item, str) for item in value): + raise ManifestError(f"{context} field '{field}' must be a non-empty string array") + return tuple(value) + + +def load_framework_manifest(path: Path = DEFAULT_MANIFEST_PATH) -> FrameworkManifest: + """Load and validate frozen comparison targets.""" + payload = _load_toml(path) + metadata = payload.get("metadata") + frameworks = payload.get("framework") + if not isinstance(metadata, dict) or not isinstance(frameworks, dict) or not frameworks: + raise ManifestError("Framework manifest requires metadata and framework tables") + + schema_version = _required(metadata, "schema_version", context="metadata") + if schema_version != 1: + raise ManifestError(f"Unsupported framework manifest schema: {schema_version}") + freeze_date = _string(metadata, "freeze_date", context="metadata") + scenario_frameworks = _strings(metadata, "scenario_frameworks", context="metadata") + + targets: dict[str, FrameworkTarget] = {} + for framework_id, raw_target in frameworks.items(): + context = f"framework.{framework_id}" + if not isinstance(raw_target, dict): + raise ManifestError(f"{context} must be a table") + version = _string(raw_target, "version", context=context) + if not _EXACT_VERSION.fullmatch(version): + raise ManifestError(f"{context} version must be an exact version: {version!r}") + immutable_id = _string(raw_target, "immutable_id", context=context) + if not _IMMUTABLE_ID.fullmatch(immutable_id): + raise ManifestError(f"{context} immutable_id is not an immutable Git or SHA-256 ID") + access = _string(raw_target, "access", context=context) + if access not in _ACCESS_TYPES: + raise ManifestError(f"{context} access must be one of {sorted(_ACCESS_TYPES)}") + scenario_matrix = _required(raw_target, "scenario_matrix", context=context) + if not isinstance(scenario_matrix, bool): + raise ManifestError(f"{context} scenario_matrix must be a boolean") + + target = FrameworkTarget( + framework_id=framework_id, + display_name=_string(raw_target, "display_name", context=context), + package=_string(raw_target, "package", context=context), + version=version, + profile=_string(raw_target, "profile", context=context), + python=_string(raw_target, "python", context=context), + license=_string(raw_target, "license", context=context), + access=access, + source=_string(raw_target, "source", context=context), + immutable_id=immutable_id, + scenario_matrix=scenario_matrix, + source_commit=raw_target.get("source_commit"), + artifact=raw_target.get("artifact"), + environment=raw_target.get("environment"), + python_env_var=raw_target.get("python_env_var"), + platform_artifact=raw_target.get("platform_artifact"), + cli_version=raw_target.get("cli_version"), + cli_immutable_id=raw_target.get("cli_immutable_id"), + ) + if scenario_matrix and (not target.environment or not target.python_env_var): + raise ManifestError(f"{context} scenario target lacks interpreter configuration") + targets[framework_id] = target + + if len(set(scenario_frameworks)) != len(scenario_frameworks): + raise ManifestError("metadata scenario_frameworks contains duplicates") + unknown = set(scenario_frameworks) - set(targets) + if unknown: + raise ManifestError( + f"metadata scenario_frameworks names unknown targets: {sorted(unknown)}" + ) + declared = {key for key, target in targets.items() if target.scenario_matrix} + if set(scenario_frameworks) != declared: + raise ManifestError("metadata scenario_frameworks disagrees with target declarations") + + return FrameworkManifest(schema_version, freeze_date, scenario_frameworks, targets) + + +def load_claim_inventory( + path: Path = DEFAULT_CLAIM_INVENTORY_PATH, + *, + manifest: FrameworkManifest | None = None, +) -> ClaimInventory: + """Load and validate the dated comparison-claim inventory.""" + target_manifest = manifest or load_framework_manifest() + payload = _load_toml(path) + metadata = payload.get("metadata") + raw_claims = payload.get("claim") + raw_unresolved = payload.get("unresolved") + if not isinstance(metadata, dict) or not isinstance(raw_claims, list) or not raw_claims: + raise ManifestError("Claim inventory requires metadata and claim tables") + if not isinstance(raw_unresolved, list): + raise ManifestError("Claim inventory requires unresolved tables") + + schema_version = _required(metadata, "schema_version", context="metadata") + if schema_version != 1: + raise ManifestError(f"Unsupported claim inventory schema: {schema_version}") + audit_date = _string(metadata, "audit_date", context="metadata") + + claims: list[Claim] = [] + claim_ids: set[str] = set() + for index, raw_claim in enumerate(raw_claims): + context = f"claim[{index}]" + if not isinstance(raw_claim, dict): + raise ManifestError(f"{context} must be a table") + claim_id = _string(raw_claim, "id", context=context) + if claim_id in claim_ids: + raise ManifestError(f"Duplicate claim id: {claim_id}") + claim_ids.add(claim_id) + claim_type = _string(raw_claim, "type", context=context) + if claim_type not in _CLAIM_TYPES: + raise ManifestError(f"{context} has unknown claim type: {claim_type}") + frameworks = _strings(raw_claim, "frameworks", context=context) + unknown = set(frameworks) - set(target_manifest.targets) + if unknown: + raise ManifestError(f"{context} names unknown framework targets: {sorted(unknown)}") + claims.append( + Claim( + claim_id=claim_id, + repository=_string(raw_claim, "repository", context=context), + paths=_strings(raw_claim, "paths", context=context), + claim_type=claim_type, + frameworks=frameworks, + required_evidence=_strings(raw_claim, "required_evidence", context=context), + status=_string(raw_claim, "status", context=context), + issue=_string(raw_claim, "issue", context=context), + ) + ) + + unresolved: list[UnresolvedFinding] = [] + finding_ids: set[str] = set() + for index, raw_finding in enumerate(raw_unresolved): + context = f"unresolved[{index}]" + if not isinstance(raw_finding, dict): + raise ManifestError(f"{context} must be a table") + finding_id = _string(raw_finding, "id", context=context) + if finding_id in finding_ids: + raise ManifestError(f"Duplicate unresolved finding id: {finding_id}") + finding_ids.add(finding_id) + unresolved.append( + UnresolvedFinding( + finding_id=finding_id, + finding=_string(raw_finding, "finding", context=context), + issue=_string(raw_finding, "issue", context=context), + ) + ) + + return ClaimInventory(schema_version, audit_date, tuple(claims), tuple(unresolved)) diff --git a/validation/common/types.py b/validation/common/types.py index 324c4ac1..606920c5 100644 --- a/validation/common/types.py +++ b/validation/common/types.py @@ -6,6 +6,12 @@ from enum import StrEnum from typing import Any +from common.framework_registry import load_framework_manifest + + +def _scenario_frameworks() -> list[str]: + return list(load_framework_manifest().scenario_framework_ids) + class ValidationStatus(StrEnum): """Terminal status for one framework/scenario validation attempt.""" @@ -122,9 +128,7 @@ class ScenarioConfig: default_tolerance: Tolerance | None = None # Which frameworks support this scenario - supported_frameworks: list[str] = field( - default_factory=lambda: ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"] - ) + supported_frameworks: list[str] = field(default_factory=_scenario_frameworks) # Extra comparison checks beyond standard (trade count, final value, pnl) extra_checks: list[str] = field(default_factory=list) diff --git a/validation/framework_targets.toml b/validation/framework_targets.toml new file mode 100644 index 00000000..4651ed7d --- /dev/null +++ b/validation/framework_targets.toml @@ -0,0 +1,83 @@ +[metadata] +schema_version = 1 +freeze_date = "2026-08-13" +scenario_frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"] + +[framework.vectorbt_pro] +display_name = "VectorBT Pro" +package = "vectorbtpro" +version = "2026.6.27" +profile = "vectorbt_strict" +python = ">=3.11" +license = "Proprietary" +access = "licensed" +source = "https://github.com/polakowo/vectorbt.pro" +source_commit = "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4" +immutable_id = "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4" +environment = ".venv-vectorbt-pro" +python_env_var = "ML4T_VECTORBT_PRO_PYTHON" +scenario_matrix = true + +[framework.vectorbt_oss] +display_name = "VectorBT OSS" +package = "vectorbt" +version = "1.1.0" +profile = "vectorbt" +python = ">=3.11,<3.15" +license = "Apache-2.0 WITH Commons-Clause" +access = "public" +source = "https://pypi.org/project/vectorbt/1.1.0/" +source_commit = "259d2d89fe2e7638baf3ca76c394937cd32b656d" +immutable_id = "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b" +artifact = "vectorbt-1.1.0.tar.gz" +environment = ".venv-vectorbt-oss" +python_env_var = "ML4T_VECTORBT_OSS_PYTHON" +scenario_matrix = true + +[framework.backtrader] +display_name = "Backtrader" +package = "backtrader" +version = "1.9.78.123" +profile = "backtrader_strict" +python = "3.12 audit interpreter; upstream package metadata does not declare a range" +license = "GPL-3.0-or-later" +access = "public" +source = "https://pypi.org/project/backtrader/1.9.78.123/" +immutable_id = "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd" +artifact = "backtrader-1.9.78.123-py2.py3-none-any.whl" +environment = ".venv-backtrader" +python_env_var = "ML4T_BACKTRADER_PYTHON" +scenario_matrix = true + +[framework.zipline] +display_name = "Zipline Reloaded" +package = "zipline-reloaded" +version = "3.1.1" +profile = "zipline_strict" +python = ">=3.10" +license = "Apache-2.0" +access = "public" +source = "https://pypi.org/project/zipline-reloaded/3.1.1/" +source_commit = "09885a2ebc7567d40942c891b3879dc03c745070" +immutable_id = "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f" +artifact = "zipline_reloaded-3.1.1.tar.gz" +environment = ".venv-zipline" +python_env_var = "ML4T_ZIPLINE_PYTHON" +scenario_matrix = true + +[framework.lean] +display_name = "LEAN" +package = "lean" +version = "18001" +profile = "lean" +python = "3.11" +license = "Apache-2.0" +access = "public" +source = "https://github.com/QuantConnect/Lean" +source_commit = "278fcb3d1b815b63ccadba68d7ae54422e34b792" +immutable_id = "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70" +artifact = "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70" +platform_artifact = "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307" +cli_version = "1.0.228" +cli_immutable_id = "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c" +scenario_matrix = false diff --git a/validation/generate_parity_claims.py b/validation/generate_parity_claims.py index 3b38410a..3b57ea1f 100644 --- a/validation/generate_parity_claims.py +++ b/validation/generate_parity_claims.py @@ -8,6 +8,8 @@ from pathlib import Path from typing import Any +from common.framework_registry import load_framework_manifest + PROJECT_ROOT = Path(__file__).parent.parent CORRECTNESS_EVIDENCE = PROJECT_ROOT / "validation" / "CORRECTNESS_RESULTS.json" LARGE_SCALE_EVIDENCE = PROJECT_ROOT / "validation" / "vectorbt_pro" / "large_scale_parity.json" @@ -21,6 +23,7 @@ START_MARKER = "" END_MARKER = "" GITHUB_EVIDENCE_ROOT = "https://github.com/ml4t/backtest/blob/main/validation" +SCENARIO_FRAMEWORKS = load_framework_manifest().scenario_framework_ids def _load_json(path: Path) -> dict[str, Any]: @@ -35,7 +38,7 @@ def _validate_evidence(correctness: dict[str, Any], large_scale: dict[str, Any]) records = correctness.get("records") if not isinstance(frameworks, dict) or not isinstance(records, list): raise ValueError("Correctness evidence lacks framework pins or records") - expected = {"vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"} + expected = set(SCENARIO_FRAMEWORKS) if set(frameworks) != expected: raise ValueError("Correctness evidence does not cover the required framework matrix") for framework in expected: @@ -55,7 +58,7 @@ def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> s large_scale_url = f"{GITHUB_EVIDENCE_ROOT}/vectorbt_pro/large_scale_parity.json" rows = [] - for framework in ("vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"): + for framework in SCENARIO_FRAMEWORKS: pin = frameworks[framework] framework_records = [record for record in records if record["framework"] == framework] required = [record for record in framework_records if record["required"]] diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 16c53af8..c04b2444 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -10,6 +10,7 @@ validation/release_candidate.py validation/run_all_correctness.py validation/common/comparator.py validation/common/data_generators.py +validation/common/framework_registry.py validation/common/ml4t_runner.py validation/common/types.py validation/scenarios/definitions.py diff --git a/validation/run_all_benchmarks.py b/validation/run_all_benchmarks.py index f9befe4b..e51f2b31 100644 --- a/validation/run_all_benchmarks.py +++ b/validation/run_all_benchmarks.py @@ -20,7 +20,6 @@ import argparse import gc -import json import subprocess import sys import time @@ -37,40 +36,28 @@ # Add project root to path for ml4t imports sys.path.insert(0, str(PROJECT_ROOT / "src")) +sys.path.insert(0, str(VALIDATION_DIR)) + +from common.framework_registry import load_framework_manifest # noqa: E402 # Framework configurations -FRAMEWORKS = { +FRAMEWORKS: dict[str, dict[str, str | None]] = { "ml4t": { "venv": ".venv", "display_name": "ml4t.backtest", "function": "benchmark_ml4t", - }, - "vectorbt_pro": { - "venv": ".venv-vectorbt-pro", - "display_name": "VectorBT Pro", - "function": "benchmark_vectorbt_pro", - }, - "vectorbt_oss": { - "venv": ".venv", - "display_name": "VectorBT OSS", - "function": "benchmark_vectorbt_oss", - }, - "backtrader": { - "venv": ".venv", - "display_name": "Backtrader", - "function": "benchmark_backtrader", - }, - "zipline": { - "venv": ".venv", - "display_name": "Zipline", - "function": "benchmark_zipline", - }, - "lean": { - "venv": None, # Uses Docker - "display_name": "LEAN CLI", - "function": "benchmark_lean", - }, + } } +FRAMEWORKS.update( + { + framework_id: { + "venv": target.environment, + "display_name": target.display_name, + "function": f"benchmark_{framework_id}", + } + for framework_id, target in load_framework_manifest().targets.items() + } +) # Test configurations (n_bars, n_assets) CONFIGS = { @@ -125,7 +112,14 @@ def benchmark_ml4t(asset_data: dict, entries: np.ndarray, exits: np.ndarray, dat """Benchmark ml4t.backtest.""" import polars as pl - from ml4t.backtest._validation_imports import DataFeed, Engine, ExecutionMode, NoCommission, NoSlippage, Strategy + from ml4t.backtest._validation_imports import ( + DataFeed, + Engine, + ExecutionMode, + NoCommission, + NoSlippage, + Strategy, + ) # Prepare data in polars format rows = [] @@ -219,7 +213,7 @@ def on_data(self, timestamp, data, context, broker): def benchmark_vectorbt_oss( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates + asset_data: dict, entries: np.ndarray, exits: np.ndarray, _dates ) -> dict: """Benchmark VectorBT OSS.""" try: @@ -251,10 +245,7 @@ def benchmark_vectorbt_oss( trades_count = pf.trades.count() # Handle both scalar and Series (multi-asset case) - if hasattr(trades_count, 'sum'): - num_trades = int(trades_count.sum()) - else: - num_trades = int(trades_count) + num_trades = int(trades_count.sum()) if hasattr(trades_count, "sum") else int(trades_count) end_time = time.perf_counter() current, peak = tracemalloc.get_traced_memory() @@ -270,7 +261,7 @@ def benchmark_vectorbt_oss( def benchmark_vectorbt_pro( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates + asset_data: dict, entries: np.ndarray, exits: np.ndarray, _dates ) -> dict: """Benchmark VectorBT Pro.""" try: @@ -302,10 +293,7 @@ def benchmark_vectorbt_pro( trades_count = pf.trades.count() # Handle both scalar and Series (multi-asset case) - if hasattr(trades_count, 'sum'): - num_trades = int(trades_count.sum()) - else: - num_trades = int(trades_count) + num_trades = int(trades_count.sum()) if hasattr(trades_count, "sum") else int(trades_count) end_time = time.perf_counter() current, peak = tracemalloc.get_traced_memory() @@ -320,9 +308,7 @@ def benchmark_vectorbt_pro( } -def benchmark_backtrader( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates -) -> dict: +def benchmark_backtrader(asset_data: dict, entries: np.ndarray, exits: np.ndarray, _dates) -> dict: """Benchmark Backtrader.""" try: import backtrader as bt @@ -389,9 +375,7 @@ def next(self): } -def benchmark_zipline( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates -) -> dict: +def benchmark_zipline(asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates) -> dict: """Benchmark Zipline-Reloaded.""" try: from zipline import run_algorithm @@ -417,7 +401,7 @@ def initialize(context): set_commission(NoCommission()) set_slippage(FixedSlippage(spread=0.0)) - def handle_data(context, data): + def handle_data(context, _data): if context.bar_idx >= len(context.entries): return @@ -470,9 +454,7 @@ def handle_data(context, data): } -def benchmark_lean( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates -) -> dict: +def benchmark_lean(_asset_data: dict, _entries: np.ndarray, _exits: np.ndarray, _dates) -> dict: """Benchmark LEAN CLI (requires Docker).""" lean_workspace = VALIDATION_DIR / "lean" / "workspace" @@ -575,9 +557,7 @@ def run_benchmark(config_name: str, framework: str) -> dict: } -def run_all_benchmarks( - frameworks: list = None, configs: list = None -) -> list: +def run_all_benchmarks(frameworks: list = None, configs: list = None) -> list: """Run all benchmarks and return results.""" if frameworks is None: frameworks = list(FRAMEWORKS.keys()) @@ -592,9 +572,9 @@ def run_all_benchmarks( print(f"Unknown framework: {framework}") continue - print(f"\n{'='*60}") + print(f"\n{'=' * 60}") print(f"Framework: {config['display_name']}") - print(f"{'='*60}") + print(f"{'=' * 60}") for config_name in configs: print(f"\n Config: {config_name}") @@ -645,25 +625,29 @@ def generate_report(results: list) -> str: lines.append(f"| {framework} | {config} | {runtime} | {trades} | {memory} | {status} |") # Add comparison table by config - lines.extend([ - "", - "## Performance Comparison by Configuration", - "", - ]) + lines.extend( + [ + "", + "## Performance Comparison by Configuration", + "", + ] + ) # Group by config - configs_seen = set(r.get("config") for r in results if r.get("config")) + configs_seen = {r.get("config") for r in results if r.get("config")} for config_name in sorted(configs_seen): config_results = [r for r in results if r.get("config") == config_name and r.get("success")] if not config_results: continue - lines.extend([ - f"### {config_name}", - "", - "| Framework | Runtime (s) | vs ml4t |", - "|-----------|-------------|---------|", - ]) + lines.extend( + [ + f"### {config_name}", + "", + "| Framework | Runtime (s) | vs ml4t |", + "|-----------|-------------|---------|", + ] + ) # Find ml4t baseline ml4t_time = None @@ -677,7 +661,7 @@ def generate_report(results: list) -> str: runtime = r["runtime_sec"] if ml4t_time and ml4t_time > 0: speedup = runtime / ml4t_time - vs_ml4t = f"{speedup:.2f}x" if speedup > 1 else f"{1/speedup:.2f}x faster" + vs_ml4t = f"{speedup:.2f}x" if speedup > 1 else f"{1 / speedup:.2f}x faster" else: vs_ml4t = "-" lines.append(f"| {framework} | {runtime:.3f} | {vs_ml4t} |") @@ -723,7 +707,7 @@ def main(): output_path = PROJECT_ROOT / args.output output_path.write_text(report) - print(f"\n{'='*60}") + print(f"\n{'=' * 60}") print(f"Report saved to: {output_path}") print("=" * 60) diff --git a/validation/run_all_correctness.py b/validation/run_all_correctness.py index 4afd3473..9d0cc6b4 100644 --- a/validation/run_all_correctness.py +++ b/validation/run_all_correctness.py @@ -22,53 +22,24 @@ PROJECT_ROOT = VALIDATION_DIR.parent sys.path.insert(0, str(VALIDATION_DIR)) +from common.framework_registry import load_framework_manifest # noqa: E402, I001 from common.types import ValidationRecord, ValidationStatus # noqa: E402, I001 from scenarios.definitions import SCENARIOS # noqa: E402 +FRAMEWORK_MANIFEST = load_framework_manifest() FRAMEWORK_ENVIRONMENTS = { - "vectorbt_pro": ".venv-vectorbt-pro", - "vectorbt_oss": ".venv", - "backtrader": ".venv-backtrader", - "zipline": ".venv-zipline", + framework_id: target.environment + for framework_id, target in FRAMEWORK_MANIFEST.targets.items() + if target.scenario_matrix and target.environment is not None } - FRAMEWORK_PYTHON_ENV_VARS = { - "vectorbt_pro": "ML4T_VECTORBT_PRO_PYTHON", - "vectorbt_oss": "ML4T_VECTORBT_OSS_PYTHON", - "backtrader": "ML4T_BACKTRADER_PYTHON", - "zipline": "ML4T_ZIPLINE_PYTHON", + framework_id: target.python_env_var + for framework_id, target in FRAMEWORK_MANIFEST.targets.items() + if target.scenario_matrix and target.python_env_var is not None } - FRAMEWORK_PINS = { - "vectorbt_pro": { - "display_name": "VectorBT Pro", - "profile": "vectorbt_strict", - "package": "vectorbtpro", - "version": "2025.12.31", - "source": "https://github.com/polakowo/vectorbt.pro", - "commit": "1305a1e1974325db9382eaeacc6452e9b075ca71", - }, - "vectorbt_oss": { - "display_name": "VectorBT OSS", - "profile": "vectorbt", - "package": "vectorbt", - "version": "0.28.2", - "source": "https://pypi.org/project/vectorbt/0.28.2/", - }, - "backtrader": { - "display_name": "Backtrader", - "profile": "backtrader_strict", - "package": "backtrader", - "version": "1.9.78.123", - "source": "https://pypi.org/project/backtrader/1.9.78.123/", - }, - "zipline": { - "display_name": "Zipline Reloaded", - "profile": "zipline_strict", - "package": "zipline-reloaded", - "version": "3.1.1", - "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", - }, + framework_id: FRAMEWORK_MANIFEST.targets[framework_id].evidence_metadata() + for framework_id in FRAMEWORK_MANIFEST.scenario_framework_ids } diff --git a/validation/scenarios/definitions.py b/validation/scenarios/definitions.py index 73a36a4e..4021ba02 100644 --- a/validation/scenarios/definitions.py +++ b/validation/scenarios/definitions.py @@ -15,6 +15,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) +from common.framework_registry import load_framework_manifest from common.types import ScenarioConfig, Tolerance # ============================================================================ @@ -25,8 +26,8 @@ BT_TOLERANCE = Tolerance(trade_count=0, value_pct=0.1, pnl_abs=10.0) ZIPLINE_TOLERANCE = Tolerance(trade_count=0, value_pct=0.01, pnl_abs=5.0) -ALL_FRAMEWORKS = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"] -NO_ZIPLINE = ["vectorbt_pro", "vectorbt_oss", "backtrader"] +ALL_FRAMEWORKS = list(load_framework_manifest().scenario_framework_ids) +NO_ZIPLINE = [framework for framework in ALL_FRAMEWORKS if framework != "zipline"] def _fw_tolerances() -> dict[str, Tolerance]: From ce53d3e53bafc36ac23b232a71bcc13290c2dfe6 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 13 Aug 2026 22:39:17 -0400 Subject: [PATCH 02/44] feat(validation): retain complete correctness evidence Serialize both engine outputs, structured exact checks, runtimes, record counts, framework and Python identity, and content-derived provenance. Validate full candidates, reject stale or dirty evidence, and promote accepted results atomically only after the complete matrix passes. Closes ml4t/backtest-dev#3 --- .gitignore | 1 + tests/contracts/test_correctness_evidence.py | 194 ++++++++++++ .../test_exact_validation_comparator.py | 15 + .../contracts/test_parity_claim_generation.py | 16 +- .../contracts/test_validation_cli_outcomes.py | 2 + validation/common/comparator.py | 25 ++ validation/common/correctness_evidence.py | 282 ++++++++++++++++++ validation/common/provenance.py | 195 ++++++++++++ validation/common/types.py | 203 ++++++++++++- validation/generate_parity_claims.py | 4 + validation/release_checks.txt | 2 + validation/run_all_correctness.py | 51 +++- validation/run_scenario.py | 81 +++-- 13 files changed, 1026 insertions(+), 45 deletions(-) create mode 100644 tests/contracts/test_correctness_evidence.py create mode 100644 validation/common/correctness_evidence.py create mode 100644 validation/common/provenance.py diff --git a/.gitignore b/.gitignore index dbf2c1d3..dccc9f57 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ src/ml4t/backtest/_version.py validation/.zipline/ validation/CORRECTNESS_RESULTS.md validation/BENCHMARK_RESULTS.md +validation/candidates/ validation/trade_logs/ validation/lean/workspace/ validation/nautilus/.venv-nautilus/ diff --git a/tests/contracts/test_correctness_evidence.py b/tests/contracts/test_correctness_evidence.py new file mode 100644 index 00000000..c3a3e9bd --- /dev/null +++ b/tests/contracts/test_correctness_evidence.py @@ -0,0 +1,194 @@ +"""Contracts for complete, current, atomically accepted correctness evidence.""" + +from __future__ import annotations + +import copy +import json +import sys +from pathlib import Path +from typing import Any, cast + +import pytest + +_VALIDATION_DIR = Path(__file__).parents[2] / "validation" +if str(_VALIDATION_DIR) not in sys.path: + sys.path.insert(0, str(_VALIDATION_DIR)) + +from common.comparator import compare_results # noqa: E402 +from common.correctness_evidence import ( # noqa: E402 + build_report, + correctness_report_failures, + promote_candidate, +) +from common.framework_registry import load_framework_manifest # noqa: E402 +from common.provenance import generate_inputs, input_digest, static_digests # noqa: E402 +from common.types import FrameworkResult, ValidationRecord, ValidationStatus # noqa: E402 +from scenarios.definitions import SCENARIOS # noqa: E402 + + +def _complete_record(framework: str, scenario_id: str) -> ValidationRecord: + manifest = load_framework_manifest() + target = manifest.targets[framework] + scenario = SCENARIOS[scenario_id] + prices, entries, exits = generate_inputs(scenario, framework) + extra = {"total_commission": 0.0, "exit_price": 0.0} + expected = FrameworkResult(target.display_name, 100_000.0, 0.0, 0, extra=extra) + actual = FrameworkResult("ml4t.backtest", 100_000.0, 0.0, 0, extra=extra) + comparison = compare_results(scenario, expected, actual) + provenance = { + "framework_target": { + "version": target.version, + "actual_version": target.version, + "immutable_id": target.immutable_id, + }, + "ml4t": {"commit": "a" * 40, "dirty": False}, + "python": {"version": "3.12.11", "implementation": "cpython"}, + "adapter": { + "module": f"frameworks.{framework}", + "path": f"validation/frameworks/{framework}.py", + }, + "digests": static_digests(scenario, framework), + "input_digest": input_digest(prices, entries, exits), + "record_counts": { + "bars": len(prices), + "entry_signals": int(entries.sum()), + "exit_signals": int(exits.sum()) if exits is not None else 0, + "framework_trades": 0, + "ml4t_trades": 0, + }, + } + return ValidationRecord( + framework=framework, + scenario_id=scenario_id, + scenario_name=scenario.name, + status=ValidationStatus.PASS, + required=True, + duration_seconds=0.01, + provenance=provenance, + framework_result=expected, + ml4t_result=actual, + comparison=comparison, + ) + + +def _full_report() -> dict[str, object]: + manifest = load_framework_manifest() + records: list[ValidationRecord] = [] + for framework in manifest.scenario_framework_ids: + for scenario_id, scenario in SCENARIOS.items(): + if framework in scenario.supported_frameworks: + records.append(_complete_record(framework, scenario_id)) + else: + records.append( + ValidationRecord( + framework=framework, + scenario_id=scenario_id, + scenario_name=scenario.name, + status=ValidationStatus.UNSUPPORTED, + required=False, + detail="Scenario explicitly excludes this framework", + duration_seconds=0.001, + ) + ) + return build_report(records) + + +def _first_required_record(report: dict[str, object]) -> dict[str, Any]: + records = cast(list[dict[str, Any]], report["records"]) + return next(record for record in records if record["required"]) + + +def test_complete_record_retains_outputs_checks_runtime_and_provenance() -> None: + payload = _complete_record("backtrader", "01").to_dict() + + assert payload["duration_seconds"] > 0 + assert payload["framework_result"]["final_value"] == 100_000.0 + assert payload["ml4t_result"]["final_value"] == 100_000.0 + assert payload["provenance"]["input_digest"] + assert payload["provenance"]["digests"]["adapter"] + checks = payload["comparison"]["checks"] + assert checks + assert {check["canonical_quantum"] for check in checks} == {"1", "0.00000001"} + assert all( + {"name", "canonical_quantum", "expected", "actual", "difference", "message"} <= check.keys() + for check in checks + ) + + +def test_complete_current_matrix_is_acceptable() -> None: + assert correctness_report_failures(_full_report()) == [] + + +@pytest.mark.parametrize( + ("mutation", "expected_failure"), + [ + ("version", "framework target identity"), + ("input", "generated-input digest"), + ("adapter", "adapter digest"), + ("profile", "profile digest"), + ("comparator", "comparator digest"), + ("expected", "comparison checks differ"), + ("actual", "comparison checks differ"), + ("missing", "comparison evidence must be complete"), + ], +) +def test_evidence_mutations_fail_closed(mutation: str, expected_failure: str) -> None: + report = copy.deepcopy(_full_report()) + record = _first_required_record(report) + if mutation == "version": + record["provenance"]["framework_target"]["actual_version"] = "0.0.0" + elif mutation == "input": + record["provenance"]["input_digest"] = "0" * 64 + elif mutation in {"adapter", "profile", "comparator"}: + record["provenance"]["digests"][mutation] = "0" * 64 + elif mutation in {"expected", "actual"}: + record["comparison"]["checks"][0][mutation] = 12345 + else: + record.pop("comparison") + + failures = correctness_report_failures(report) + + assert any(expected_failure in failure for failure in failures) + + +def test_source_commit_change_without_behavior_change_is_not_stale() -> None: + report = _full_report() + for record in cast(list[dict[str, Any]], report["records"]): + if record["provenance"] is not None: + record["provenance"]["ml4t"]["commit"] = "b" * 40 + + assert correctness_report_failures(report) == [] + + +def test_dirty_source_is_not_acceptable() -> None: + report = _full_report() + _first_required_record(report)["provenance"]["ml4t"]["dirty"] = True + + assert any("dirty ML4T tree" in failure for failure in correctness_report_failures(report)) + + +def test_failed_candidate_does_not_replace_accepted_evidence(tmp_path: Path) -> None: + report = _full_report() + report["release_gate_passed"] = False + candidate = tmp_path / "candidate.json" + accepted = tmp_path / "accepted.json" + candidate.write_text(json.dumps(report), encoding="utf-8") + accepted.write_bytes(b"accepted-before\n") + + failures = promote_candidate(candidate, accepted) + + assert failures + assert accepted.read_bytes() == b"accepted-before\n" + assert candidate.is_file() + + +def test_valid_candidate_atomically_replaces_accepted_evidence(tmp_path: Path) -> None: + report = _full_report() + candidate = tmp_path / "candidate.json" + accepted = tmp_path / "accepted.json" + candidate.write_text(json.dumps(report, sort_keys=True), encoding="utf-8") + accepted.write_bytes(b"accepted-before\n") + + assert promote_candidate(candidate, accepted) == [] + assert accepted.read_bytes() == candidate.read_bytes() + assert candidate.is_file() diff --git a/tests/contracts/test_exact_validation_comparator.py b/tests/contracts/test_exact_validation_comparator.py index af8853c7..bfe69873 100644 --- a/tests/contracts/test_exact_validation_comparator.py +++ b/tests/contracts/test_exact_validation_comparator.py @@ -17,6 +17,8 @@ sys.path.insert(0, str(_VALIDATION_DIR)) from common.comparator import compare_results # noqa: E402 +from common.ml4t_runner import run_ml4t # noqa: E402 +from common.provenance import generate_inputs # noqa: E402 from common.types import FrameworkResult # noqa: E402 from scenarios.definitions import SCENARIOS # noqa: E402 @@ -83,6 +85,19 @@ def test_scenario_trade_fields_require_exact_equality() -> None: assert "exit_price" in trade_check.message +def test_wrong_execution_profile_remains_a_detected_negative_control() -> None: + scenario = SCENARIOS["01"] + prices, entries, exits = generate_inputs(scenario, "backtrader") + reference = run_ml4t(scenario, prices, entries, exits, framework="backtrader") + reference.framework = "Backtrader reference" + wrong_profile = run_ml4t(scenario, prices, entries, exits, framework="vectorbt_oss") + + comparison = compare_results(scenario, reference, wrong_profile) + + assert comparison.passed is False + assert any(not check.passed for check in comparison.checks) + + def _benchmark_result(suite, framework: str): timestamp = pd.Timestamp("2024-01-02") return suite.BenchmarkResult( diff --git a/tests/contracts/test_parity_claim_generation.py b/tests/contracts/test_parity_claim_generation.py index 53508724..74f80c8d 100644 --- a/tests/contracts/test_parity_claim_generation.py +++ b/tests/contracts/test_parity_claim_generation.py @@ -6,6 +6,8 @@ import sys from pathlib import Path +import pytest + _VALIDATION_DIR = Path(__file__).parents[2] / "validation" if str(_VALIDATION_DIR) not in sys.path: sys.path.insert(0, str(_VALIDATION_DIR)) @@ -13,8 +15,13 @@ import generate_parity_claims # noqa: E402 -def test_parity_claim_documents_match_retained_evidence() -> None: - assert generate_parity_claims.synchronize(check=True) == [] +def test_legacy_accepted_evidence_cannot_generate_current_claims() -> None: + before = {path: path.read_bytes() for path in generate_parity_claims.TARGETS} + + with pytest.raises(ValueError, match="Unsupported correctness schema: 1"): + generate_parity_claims.synchronize(check=False) + + assert {path: path.read_bytes() for path in generate_parity_claims.TARGETS} == before def test_every_claim_target_uses_the_same_generated_block() -> None: @@ -30,9 +37,12 @@ def test_every_claim_target_uses_the_same_generated_block() -> None: assert len(set(blocks)) == 1 -def test_claims_pin_every_advertised_framework_and_expose_failures() -> None: +def test_claims_pin_every_advertised_framework_and_expose_failures( + monkeypatch: pytest.MonkeyPatch, +) -> None: correctness = generate_parity_claims._load_json(generate_parity_claims.CORRECTNESS_EVIDENCE) large_scale = generate_parity_claims._load_json(generate_parity_claims.LARGE_SCALE_EVIDENCE) + monkeypatch.setattr(generate_parity_claims, "correctness_report_failures", lambda _: []) claims = generate_parity_claims.render_claims(correctness, large_scale) diff --git a/tests/contracts/test_validation_cli_outcomes.py b/tests/contracts/test_validation_cli_outcomes.py index 70337b90..d6f10b58 100644 --- a/tests/contracts/test_validation_cli_outcomes.py +++ b/tests/contracts/test_validation_cli_outcomes.py @@ -112,6 +112,7 @@ def test_isolated_timeout_is_retained( assert record.status is ValidationStatus.TIMEOUT assert "7" in (record.detail or "") + assert record.duration_seconds is not None def test_isolated_subprocess_failure_without_record_is_retained( @@ -239,4 +240,5 @@ def test_report_retains_framework_pins(tmp_path: Path) -> None: run_all_correctness.write_report(report_path, records) report = json.loads(report_path.read_text(encoding="utf-8")) + assert report["schema_version"] == 2 assert report["frameworks"] == run_all_correctness.FRAMEWORK_PINS diff --git a/validation/common/comparator.py b/validation/common/comparator.py index 1635d51f..1d37ff04 100644 --- a/validation/common/comparator.py +++ b/validation/common/comparator.py @@ -7,6 +7,7 @@ from .types import CheckResult, ComparisonResult, FrameworkResult, ScenarioConfig, Tolerance CANONICAL_QUANTUM = Decimal("0.00000001") +CANONICAL_QUANTUM_TEXT = format(CANONICAL_QUANTUM, "f") def _canonical_number(value: int | float) -> Decimal: @@ -55,6 +56,9 @@ def compare_results( ), expected=framework_result.num_trades, actual=ml4t_result.num_trades, + difference=trade_diff, + canonical_quantum="1", + diagnostic_limit=tolerance.trade_count, ) ) @@ -74,6 +78,9 @@ def compare_results( ), expected=fw_value, actual=ml4t_value, + difference=value_diff, + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=tolerance.value_pct, ) ) @@ -92,6 +99,9 @@ def compare_results( ), expected=fw_pnl, actual=ml4t_pnl, + difference=pnl_diff, + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=tolerance.pnl_abs, ) ) @@ -107,6 +117,9 @@ def compare_results( message="Required commission output is missing", expected=fw_comm, actual=ml4t_comm, + difference="missing", + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=tolerance.commission_abs, ) ) else: @@ -122,6 +135,9 @@ def compare_results( ), expected=fw_comm, actual=ml4t_comm, + difference=comm_diff, + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=tolerance.commission_abs, ) ) @@ -136,6 +152,9 @@ def compare_results( message="Required exit-price output is missing", expected=fw_exit, actual=ml4t_exit, + difference="missing", + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=tolerance.exit_price_abs, ) ) else: @@ -151,6 +170,9 @@ def compare_results( ), expected=fw_exit, actual=ml4t_exit, + difference=exit_diff, + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=tolerance.exit_price_abs, ) ) @@ -196,6 +218,9 @@ def compare_results( message=trade_detail, expected=framework_result.trades, actual=ml4t_result.trades, + difference=None if trade_level_passed else trade_detail, + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=None, ) ) diff --git a/validation/common/correctness_evidence.py b/validation/common/correctness_evidence.py new file mode 100644 index 00000000..2ff7f4e6 --- /dev/null +++ b/validation/common/correctness_evidence.py @@ -0,0 +1,282 @@ +"""Schema validation, staleness checks, and atomic correctness-evidence promotion.""" + +from __future__ import annotations + +import json +import os +import tempfile +from collections import Counter +from datetime import UTC, datetime +from pathlib import Path +from typing import Any, cast + +from scenarios.definitions import SCENARIOS + +from common.comparator import CANONICAL_QUANTUM_TEXT, compare_results +from common.framework_registry import FrameworkManifest, load_framework_manifest +from common.provenance import generate_inputs, input_digest, static_digests +from common.types import ValidationRecord, ValidationStatus + +SCHEMA_VERSION = 2 + + +def _framework_metadata(manifest: FrameworkManifest) -> dict[str, dict[str, object]]: + return { + framework_id: manifest.targets[framework_id].evidence_metadata() + for framework_id in manifest.scenario_framework_ids + } + + +def build_report( + records: list[ValidationRecord], + *, + manifest: FrameworkManifest | None = None, +) -> dict[str, object]: + """Build a correctness candidate without deciding whether it can be accepted.""" + target_manifest = manifest or load_framework_manifest() + counts = Counter(record.status.value for record in records) + required = [record for record in records if record.required] + release_passed = bool(required) and all(record.passed for record in required) + return { + "schema_version": SCHEMA_VERSION, + "generated_at": datetime.now(UTC).isoformat(), + "comparison_policy": { + "canonical_quantum": CANONICAL_QUANTUM_TEXT, + "rounding": "ROUND_HALF_EVEN", + "meaning": "equality after canonical quantization, not bit identity", + }, + "frameworks": _framework_metadata(target_manifest), + "release_gate_passed": release_passed, + "summary": {status.value: counts[status.value] for status in ValidationStatus}, + "records": [record.to_dict() for record in records], + } + + +def _mapping(value: object, *, label: str, failures: list[str]) -> dict[str, Any] | None: + if not isinstance(value, dict) or not all(isinstance(key, str) for key in value): + failures.append(f"{label} must be an object") + return None + return cast(dict[str, Any], value) + + +def _expected_pairs(manifest: FrameworkManifest) -> dict[tuple[str, str], tuple[bool, str]]: + return { + (framework, scenario_id): ( + framework in scenario.supported_frameworks, + scenario.name, + ) + for framework in manifest.scenario_framework_ids + for scenario_id, scenario in SCENARIOS.items() + } + + +def _record_evidence_failures( + record: ValidationRecord, + *, + manifest: FrameworkManifest, +) -> list[str]: + identity = f"{record.framework}/{record.scenario_id}" + failures: list[str] = [] + if record.duration_seconds is None or record.duration_seconds < 0: + failures.append(f"{identity} lacks a valid runtime") + if ( + record.provenance is None + or record.framework_result is None + or record.ml4t_result is None + or record.comparison is None + ): + failures.append(f"{identity} lacks complete comparison evidence") + return failures + + scenario = SCENARIOS[record.scenario_id] + target = manifest.targets[record.framework] + provenance = record.provenance + framework_target = _mapping( + provenance.get("framework_target"), label=f"{identity} framework_target", failures=failures + ) + ml4t = _mapping(provenance.get("ml4t"), label=f"{identity} ml4t", failures=failures) + python = _mapping(provenance.get("python"), label=f"{identity} python", failures=failures) + adapter = _mapping(provenance.get("adapter"), label=f"{identity} adapter", failures=failures) + digests = _mapping(provenance.get("digests"), label=f"{identity} digests", failures=failures) + counts = _mapping( + provenance.get("record_counts"), label=f"{identity} record_counts", failures=failures + ) + if framework_target is not None: + expected_target = { + "version": target.version, + "actual_version": target.version, + "immutable_id": target.immutable_id, + } + if framework_target != expected_target: + failures.append(f"{identity} framework target identity differs from the manifest") + if ml4t is not None: + if ml4t.get("dirty") is not False: + failures.append(f"{identity} was produced from a dirty ML4T tree") + commit = ml4t.get("commit") + if not isinstance(commit, str) or len(commit) != 40: + failures.append(f"{identity} lacks a full ML4T commit") + if python is not None and ( + not isinstance(python.get("version"), str) + or not isinstance(python.get("implementation"), str) + ): + failures.append(f"{identity} lacks Python runtime identity") + expected_adapter = { + "module": f"frameworks.{record.framework}", + "path": f"validation/frameworks/{record.framework}.py", + } + if adapter is not None and adapter != expected_adapter: + failures.append(f"{identity} adapter identity differs") + + expected_digests = static_digests(scenario, record.framework) + if digests is not None: + for name, expected in expected_digests.items(): + if digests.get(name) != expected: + failures.append(f"{identity} {name} digest is stale") + + prices, entries, exits = generate_inputs(scenario, record.framework) + expected_input_digest = input_digest(prices, entries, exits) + if provenance.get("input_digest") != expected_input_digest: + failures.append(f"{identity} generated-input digest is stale") + + expected_counts = { + "bars": len(prices), + "entry_signals": int(entries.sum()), + "exit_signals": int(exits.sum()) if exits is not None else 0, + "framework_trades": record.framework_result.num_trades, + "ml4t_trades": record.ml4t_result.num_trades, + } + if counts is not None and counts != expected_counts: + failures.append(f"{identity} record counts differ from retained inputs or outputs") + + expected_comparison = compare_results( + scenario, + record.framework_result, + record.ml4t_result, + ) + if record.comparison.to_dict() != expected_comparison.to_dict(): + failures.append(f"{identity} comparison checks differ from retained outputs") + expected_passed = record.status is ValidationStatus.PASS + if record.comparison.passed is not expected_passed: + failures.append(f"{identity} status conflicts with its comparison verdict") + return failures + + +def correctness_report_failures( + report: dict[str, object], + *, + manifest: FrameworkManifest | None = None, +) -> list[str]: + """Return every reason a candidate cannot replace accepted evidence.""" + target_manifest = manifest or load_framework_manifest() + failures: list[str] = [] + if report.get("schema_version") != SCHEMA_VERSION: + failures.append(f"Unsupported correctness schema: {report.get('schema_version')!r}") + return failures + if not isinstance(report.get("generated_at"), str): + failures.append("Correctness report lacks a generation timestamp") + expected_policy = { + "canonical_quantum": CANONICAL_QUANTUM_TEXT, + "rounding": "ROUND_HALF_EVEN", + "meaning": "equality after canonical quantization, not bit identity", + } + if report.get("comparison_policy") != expected_policy: + failures.append("Correctness comparison policy differs") + if report.get("frameworks") != _framework_metadata(target_manifest): + failures.append("Correctness framework targets differ from the frozen manifest") + if report.get("release_gate_passed") is not True: + failures.append("Correctness release gate did not pass") + + raw_records = report.get("records") + if not isinstance(raw_records, list): + failures.append("Correctness records must be a list") + return failures + + records: dict[tuple[str, str], ValidationRecord] = {} + for index, payload in enumerate(raw_records): + if not isinstance(payload, dict): + failures.append(f"Correctness record {index} must be an object") + continue + try: + record = ValidationRecord.from_dict(cast(dict[str, Any], payload)) + except (KeyError, TypeError, ValueError) as error: + failures.append(f"Correctness record {index} is invalid: {error}") + continue + key = (record.framework, record.scenario_id) + if key in records: + failures.append( + f"Duplicate correctness record: {record.framework}/{record.scenario_id}" + ) + records[key] = record + + expected_pairs = _expected_pairs(target_manifest) + missing = sorted(set(expected_pairs) - set(records)) + unexpected = sorted(set(records) - set(expected_pairs)) + if missing: + failures.append(f"Correctness matrix is missing pairs: {missing}") + if unexpected: + failures.append(f"Correctness matrix has unknown pairs: {unexpected}") + + for key in sorted(set(expected_pairs) & set(records)): + required, scenario_name = expected_pairs[key] + record = records[key] + identity = f"{record.framework}/{record.scenario_id}" + if record.scenario_name != scenario_name: + failures.append(f"{identity} scenario name differs from its definition") + if record.required is not required: + failures.append(f"{identity} required flag differs from the scenario matrix") + expected_status = ValidationStatus.PASS if required else ValidationStatus.UNSUPPORTED + if record.status is not expected_status: + failures.append( + f"{identity} has status {record.status.value}, expected {expected_status.value}" + ) + if required and record.status is ValidationStatus.PASS: + failures.extend(_record_evidence_failures(record, manifest=target_manifest)) + elif not required and not record.detail: + failures.append(f"{identity} unsupported record lacks a reason") + expected_summary = Counter(record.status.value for record in records.values()) + summary = report.get("summary") + if not isinstance(summary, dict) or any( + summary.get(status.value) != expected_summary[status.value] for status in ValidationStatus + ): + failures.append("Correctness summary differs from retained records") + return failures + + +def write_candidate(path: Path, records: list[ValidationRecord]) -> dict[str, object]: + """Write a complete diagnostic candidate, whether it passes or fails.""" + report = build_report(records) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n", encoding="utf-8") + return report + + +def load_report(path: Path) -> dict[str, object]: + """Load a correctness report with an object root.""" + payload = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(payload, dict): + raise ValueError(f"Correctness report must be an object: {path}") + return cast(dict[str, object], payload) + + +def promote_candidate(candidate: Path, accepted: Path) -> list[str]: + """Atomically copy a valid candidate over accepted evidence.""" + report = load_report(candidate) + failures = correctness_report_failures(report) + if failures: + return failures + accepted.parent.mkdir(parents=True, exist_ok=True) + with tempfile.NamedTemporaryFile( + mode="wb", + dir=accepted.parent, + prefix=f".{accepted.name}.", + suffix=".tmp", + delete=False, + ) as temporary: + temporary.write(candidate.read_bytes()) + temporary_path = Path(temporary.name) + try: + os.replace(temporary_path, accepted) + finally: + if temporary_path.exists(): + temporary_path.unlink() + return [] diff --git a/validation/common/provenance.py b/validation/common/provenance.py new file mode 100644 index 00000000..faf0f06a --- /dev/null +++ b/validation/common/provenance.py @@ -0,0 +1,195 @@ +"""Content-derived provenance for cross-framework correctness evidence.""" + +from __future__ import annotations + +import hashlib +import importlib.metadata +import json +import subprocess +import sys +from dataclasses import asdict +from functools import cache +from pathlib import Path +from typing import Any + +import numpy as np +import pandas as pd + +from common import data_generators +from common.framework_registry import DEFAULT_MANIFEST_PATH, FrameworkTarget +from common.types import FrameworkResult, ScenarioConfig + +VALIDATION_DIR = Path(__file__).parents[1] +PROJECT_ROOT = VALIDATION_DIR.parent +SOURCE_DIR = PROJECT_ROOT / "src" / "ml4t" / "backtest" + + +def _sha256_bytes(value: bytes) -> str: + return hashlib.sha256(value).hexdigest() + + +def file_digest(path: Path) -> str: + """Return a file's SHA-256 digest.""" + return _sha256_bytes(path.read_bytes()) + + +def _json_digest(value: object) -> str: + payload = json.dumps(value, sort_keys=True, separators=(",", ":"), default=str) + return _sha256_bytes(payload.encode("utf-8")) + + +@cache +def _tree_digest(root: Path) -> str: + digest = hashlib.sha256() + for path in sorted(root.rglob("*.py")): + digest.update(path.relative_to(root).as_posix().encode("utf-8")) + digest.update(b"\0") + digest.update(path.read_bytes()) + digest.update(b"\0") + return digest.hexdigest() + + +def generate_inputs( + scenario: ScenarioConfig, + framework: str, +) -> tuple[pd.DataFrame, np.ndarray, np.ndarray | None]: + """Generate and framework-align one scenario input set.""" + generator = getattr(data_generators, scenario.data_generator) + data_result = generator(**scenario.data_kwargs) + if len(data_result) == 3: + prices, entries, exits = data_result + else: + prices, entries = data_result + exits = None + + if framework == "zipline": + import exchange_calendars as xcals + + calendar = xcals.get_calendar("XNYS") + start = prices.index[0] + end = prices.index[-1] + if start.tz is not None: + start = start.tz_convert(None) + end = end.tz_convert(None) + sessions = calendar.sessions_in_range(start, end) + index = prices.index.tz_localize(None) if prices.index.tz else prices.index + valid = index.isin(sessions) + prices = prices[valid].copy() + entries = entries[valid] + if exits is not None: + exits = exits[valid] + return prices, np.asarray(entries), None if exits is None else np.asarray(exits) + + +def input_digest( + prices: pd.DataFrame, + entries: np.ndarray, + exits: np.ndarray | None, +) -> str: + """Hash generated prices and signals without depending on display formatting.""" + digest = hashlib.sha256() + frame_identity = { + "columns": [str(column) for column in prices.columns], + "dtypes": [str(dtype) for dtype in prices.dtypes], + "index_dtype": str(prices.index.dtype), + "shape": prices.shape, + } + digest.update(json.dumps(frame_identity, sort_keys=True).encode("utf-8")) + digest.update(pd.util.hash_pandas_object(prices, index=True).values.tobytes()) + for name, values in (("entries", entries), ("exits", exits)): + digest.update(name.encode("utf-8")) + if values is None: + digest.update(b"none") + continue + array = np.ascontiguousarray(values) + digest.update(str(array.dtype).encode("utf-8")) + digest.update(str(array.shape).encode("utf-8")) + digest.update(array.tobytes()) + return digest.hexdigest() + + +def scenario_digest(scenario: ScenarioConfig) -> str: + """Hash one declarative scenario definition.""" + return _json_digest(asdict(scenario)) + + +def static_digests(scenario: ScenarioConfig, framework: str) -> dict[str, str]: + """Return behavior-relevant source digests for one comparison pair.""" + adapter_path = VALIDATION_DIR / "frameworks" / f"{framework}.py" + profile_inputs = { + "profile_source": file_digest(SOURCE_DIR / "profiles.py"), + "base": scenario.ml4t_config, + "override": scenario.ml4t_overrides.get(framework, {}), + } + return { + "adapter": file_digest(adapter_path), + "comparator": file_digest(VALIDATION_DIR / "common" / "comparator.py"), + "engine": _tree_digest(SOURCE_DIR), + "manifest": file_digest(DEFAULT_MANIFEST_PATH), + "ml4t_runner": file_digest(VALIDATION_DIR / "common" / "ml4t_runner.py"), + "profile": _json_digest(profile_inputs), + "scenario": scenario_digest(scenario), + } + + +def _git_identity() -> dict[str, object]: + commit = subprocess.run( + ["git", "rev-parse", "HEAD"], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.strip() + status = subprocess.run( + ["git", "status", "--porcelain", "--untracked-files=no"], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout + return {"commit": commit, "dirty": bool(status.strip())} + + +def installed_framework_version(target: FrameworkTarget) -> str: + """Return the version imported by the isolated scenario environment.""" + return importlib.metadata.version(target.package) + + +def build_record_provenance( + *, + scenario: ScenarioConfig, + framework: str, + target: FrameworkTarget, + prices: pd.DataFrame, + entries: np.ndarray, + exits: np.ndarray | None, + framework_result: FrameworkResult, + ml4t_result: FrameworkResult, +) -> dict[str, Any]: + """Build complete provenance for one executed comparison.""" + adapter_path = VALIDATION_DIR / "frameworks" / f"{framework}.py" + return { + "framework_target": { + "version": target.version, + "actual_version": installed_framework_version(target), + "immutable_id": target.immutable_id, + }, + "ml4t": _git_identity(), + "python": { + "version": sys.version.split()[0], + "implementation": sys.implementation.name, + }, + "adapter": { + "module": f"frameworks.{framework}", + "path": adapter_path.relative_to(PROJECT_ROOT).as_posix(), + }, + "digests": static_digests(scenario, framework), + "input_digest": input_digest(prices, entries, exits), + "record_counts": { + "bars": len(prices), + "entry_signals": int(entries.sum()), + "exit_signals": int(exits.sum()) if exits is not None else 0, + "framework_trades": framework_result.num_trades, + "ml4t_trades": ml4t_result.num_trades, + }, + } diff --git a/validation/common/types.py b/validation/common/types.py index 606920c5..1c590543 100644 --- a/validation/common/types.py +++ b/validation/common/types.py @@ -2,7 +2,9 @@ from __future__ import annotations +import math from dataclasses import dataclass, field +from decimal import Decimal from enum import StrEnum from typing import Any @@ -13,6 +15,43 @@ def _scenario_frameworks() -> list[str]: return list(load_framework_manifest().scenario_framework_ids) +def _json_value(value: Any) -> Any: + if value is None or isinstance(value, (bool, int, float, str)): + return value + if isinstance(value, Decimal): + return str(value) + if isinstance(value, dict): + return {str(key): _json_value(item) for key, item in value.items()} + if isinstance(value, (list, tuple)): + return [_json_value(item) for item in value] + if hasattr(value, "item"): + return _json_value(value.item()) + if hasattr(value, "isoformat"): + return value.isoformat() + raise TypeError(f"Value is not JSON serializable: {type(value).__name__}") + + +def _required_string(value: object, label: str) -> str: + if not isinstance(value, str) or not value: + raise TypeError(f"{label} must be a nonempty string") + return value + + +def _required_bool(value: object, label: str) -> bool: + if not isinstance(value, bool): + raise TypeError(f"{label} must be a boolean") + return value + + +def _required_number(value: object, label: str) -> float: + if not isinstance(value, (int, float)) or isinstance(value, bool): + raise TypeError(f"{label} must be numeric") + number = float(value) + if not math.isfinite(number): + raise ValueError(f"{label} must be finite") + return number + + class ValidationStatus(StrEnum): """Terminal status for one framework/scenario validation attempt.""" @@ -40,6 +79,11 @@ class ValidationRecord: status: ValidationStatus required: bool detail: str | None = None + duration_seconds: float | None = None + provenance: dict[str, Any] | None = None + framework_result: FrameworkResult | None = None + ml4t_result: FrameworkResult | None = None + comparison: ComparisonResult | None = None @property def passed(self) -> bool: @@ -53,7 +97,7 @@ def release_blocking(self) -> bool: def to_dict(self) -> dict[str, Any]: """Return a JSON-serializable record.""" - return { + payload = { "framework": self.framework, "scenario_id": self.scenario_id, "scenario_name": self.scenario_name, @@ -61,7 +105,15 @@ def to_dict(self) -> dict[str, Any]: "required": self.required, "release_blocking": self.release_blocking, "detail": self.detail, + "duration_seconds": self.duration_seconds, + "provenance": _json_value(self.provenance), + "framework_result": ( + self.framework_result.to_dict() if self.framework_result is not None else None + ), + "ml4t_result": self.ml4t_result.to_dict() if self.ml4t_result is not None else None, + "comparison": self.comparison.to_dict() if self.comparison is not None else None, } + return payload @classmethod def from_dict(cls, payload: dict[str, Any]) -> ValidationRecord: @@ -76,20 +128,66 @@ def from_dict(cls, payload: dict[str, Any]) -> ValidationRecord: scenario_name = payload["scenario_name"] required = payload["required"] detail = payload.get("detail") + duration_seconds = payload.get("duration_seconds") + provenance = payload.get("provenance") if not all(isinstance(value, str) for value in (framework, scenario_id, scenario_name)): raise TypeError("Validation record identifiers must be strings") if not isinstance(required, bool): raise TypeError("Validation record required must be a boolean") if detail is not None and not isinstance(detail, str): raise TypeError("Validation record detail must be a string or null") + if duration_seconds is not None and ( + not isinstance(duration_seconds, (int, float)) or isinstance(duration_seconds, bool) + ): + raise TypeError("Validation record duration_seconds must be numeric or null") + if provenance is not None and not isinstance(provenance, dict): + raise TypeError("Validation record provenance must be an object or null") + + framework_result_payload = payload.get("framework_result") + ml4t_result_payload = payload.get("ml4t_result") + comparison_payload = payload.get("comparison") + framework_result = ( + FrameworkResult.from_dict(framework_result_payload) + if isinstance(framework_result_payload, dict) + else None + ) + ml4t_result = ( + FrameworkResult.from_dict(ml4t_result_payload) + if isinstance(ml4t_result_payload, dict) + else None + ) + comparison = ( + ComparisonResult.from_dict(comparison_payload) + if isinstance(comparison_payload, dict) + else None + ) + evidence_fields = (framework_result_payload, ml4t_result_payload, comparison_payload) + if any(value is not None for value in evidence_fields) and any( + value is None for value in evidence_fields + ): + raise ValueError("Validation record comparison evidence must be complete") + status = ValidationStatus(payload["status"]) + if status in {ValidationStatus.PASS, ValidationStatus.COMPARISON_FAILURE} and ( + provenance is None + or duration_seconds is None + or framework_result is None + or ml4t_result is None + or comparison is None + ): + raise ValueError("Compared validation record lacks complete evidence") return cls( framework=framework, scenario_id=scenario_id, scenario_name=scenario_name, - status=ValidationStatus(payload["status"]), + status=status, required=required, detail=detail, + duration_seconds=float(duration_seconds) if duration_seconds is not None else None, + provenance=provenance, + framework_result=framework_result, + ml4t_result=ml4t_result, + comparison=comparison, ) @@ -168,6 +266,40 @@ class FrameworkResult: trades: list[dict[str, Any]] = field(default_factory=list) extra: dict[str, Any] = field(default_factory=dict) + def to_dict(self) -> dict[str, Any]: + return { + "framework": self.framework, + "final_value": self.final_value, + "total_pnl": self.total_pnl, + "num_trades": self.num_trades, + "trades": _json_value(self.trades), + "extra": _json_value(self.extra), + } + + @classmethod + def from_dict(cls, payload: dict[str, Any]) -> FrameworkResult: + required = {"framework", "final_value", "total_pnl", "num_trades", "trades", "extra"} + missing = sorted(required - payload.keys()) + if missing: + raise ValueError(f"Framework result missing fields: {', '.join(missing)}") + trades = payload["trades"] + extra = payload["extra"] + num_trades = payload["num_trades"] + if not isinstance(trades, list) or not all(isinstance(trade, dict) for trade in trades): + raise TypeError("Framework result trades must be an object array") + if not isinstance(extra, dict): + raise TypeError("Framework result trades and extra have invalid types") + if not isinstance(num_trades, int) or isinstance(num_trades, bool) or num_trades < 0: + raise TypeError("Framework result num_trades must be a nonnegative integer") + return cls( + framework=_required_string(payload["framework"], "Framework result framework"), + final_value=_required_number(payload["final_value"], "Framework result final_value"), + total_pnl=_required_number(payload["total_pnl"], "Framework result total_pnl"), + num_trades=num_trades, + trades=trades, + extra=extra, + ) + @dataclass class ComparisonResult: @@ -178,6 +310,30 @@ class ComparisonResult: passed: bool checks: list[CheckResult] = field(default_factory=list) + def to_dict(self) -> dict[str, Any]: + return { + "scenario_id": self.scenario_id, + "framework": self.framework, + "passed": self.passed, + "checks": [check.to_dict() for check in self.checks], + } + + @classmethod + def from_dict(cls, payload: dict[str, Any]) -> ComparisonResult: + required = {"scenario_id", "framework", "passed", "checks"} + missing = sorted(required - payload.keys()) + if missing: + raise ValueError(f"Comparison result missing fields: {', '.join(missing)}") + checks = payload.get("checks") + if not isinstance(checks, list) or not all(isinstance(check, dict) for check in checks): + raise TypeError("Comparison checks must be an object array") + return cls( + scenario_id=_required_string(payload["scenario_id"], "Comparison scenario_id"), + framework=_required_string(payload["framework"], "Comparison framework"), + passed=_required_bool(payload["passed"], "Comparison passed"), + checks=[CheckResult.from_dict(check) for check in checks], + ) + @property def summary(self) -> str: status = "PASS" if self.passed else "FAIL" @@ -197,3 +353,46 @@ class CheckResult: message: str expected: Any = None actual: Any = None + difference: Any = None + canonical_quantum: str | None = None + diagnostic_limit: Any = None + + def to_dict(self) -> dict[str, Any]: + return { + "name": self.name, + "passed": self.passed, + "canonical_quantum": self.canonical_quantum, + "expected": _json_value(self.expected), + "actual": _json_value(self.actual), + "difference": _json_value(self.difference), + "diagnostic_limit": _json_value(self.diagnostic_limit), + "message": self.message, + } + + @classmethod + def from_dict(cls, payload: dict[str, Any]) -> CheckResult: + required = { + "name", + "passed", + "canonical_quantum", + "expected", + "actual", + "difference", + "diagnostic_limit", + "message", + } + missing = sorted(required - payload.keys()) + if missing: + raise ValueError(f"Comparison check missing fields: {', '.join(missing)}") + return cls( + name=_required_string(payload["name"], "Comparison check name"), + passed=_required_bool(payload["passed"], "Comparison check passed"), + message=_required_string(payload["message"], "Comparison check message"), + expected=payload["expected"], + actual=payload["actual"], + difference=payload["difference"], + canonical_quantum=_required_string( + payload["canonical_quantum"], "Comparison check canonical_quantum" + ), + diagnostic_limit=payload["diagnostic_limit"], + ) diff --git a/validation/generate_parity_claims.py b/validation/generate_parity_claims.py index 3b57ea1f..4c61a86c 100644 --- a/validation/generate_parity_claims.py +++ b/validation/generate_parity_claims.py @@ -8,6 +8,7 @@ from pathlib import Path from typing import Any +from common.correctness_evidence import correctness_report_failures from common.framework_registry import load_framework_manifest PROJECT_ROOT = Path(__file__).parent.parent @@ -34,6 +35,9 @@ def _load_json(path: Path) -> dict[str, Any]: def _validate_evidence(correctness: dict[str, Any], large_scale: dict[str, Any]) -> None: + failures = correctness_report_failures(correctness) + if failures: + raise ValueError("Accepted correctness evidence is invalid: " + "; ".join(failures)) frameworks = correctness.get("frameworks") records = correctness.get("records") if not isinstance(frameworks, dict) or not isinstance(records, list): diff --git a/validation/release_checks.txt b/validation/release_checks.txt index c04b2444..4641d4e3 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -9,8 +9,10 @@ validation/performance_baseline.py validation/release_candidate.py validation/run_all_correctness.py validation/common/comparator.py +validation/common/correctness_evidence.py validation/common/data_generators.py validation/common/framework_registry.py validation/common/ml4t_runner.py +validation/common/provenance.py validation/common/types.py validation/scenarios/definitions.py diff --git a/validation/run_all_correctness.py b/validation/run_all_correctness.py index 9d0cc6b4..c056e6d7 100644 --- a/validation/run_all_correctness.py +++ b/validation/run_all_correctness.py @@ -14,15 +14,20 @@ import subprocess import sys import tempfile +import time from collections import Counter -from datetime import UTC, datetime from pathlib import Path VALIDATION_DIR = Path(__file__).parent PROJECT_ROOT = VALIDATION_DIR.parent sys.path.insert(0, str(VALIDATION_DIR)) -from common.framework_registry import load_framework_manifest # noqa: E402, I001 +from common.correctness_evidence import ( # noqa: E402, I001 + build_report, + promote_candidate, + write_candidate, +) +from common.framework_registry import load_framework_manifest # noqa: E402 from common.types import ValidationRecord, ValidationStatus # noqa: E402, I001 from scenarios.definitions import SCENARIOS # noqa: E402 @@ -50,6 +55,7 @@ def _record( *, required: bool = True, detail: str | None = None, + started_at: float | None = None, ) -> ValidationRecord: scenario = SCENARIOS.get(scenario_id) return ValidationRecord( @@ -59,6 +65,7 @@ def _record( status=status, required=required, detail=detail, + duration_seconds=time.perf_counter() - started_at if started_at is not None else None, ) @@ -88,6 +95,7 @@ def run_isolated( timeout: int = 180, ) -> ValidationRecord: """Run one pair in its framework environment and retain its exact terminal status.""" + started_at = time.perf_counter() scenario = SCENARIOS.get(scenario_id) if scenario is None: return _record( @@ -95,6 +103,7 @@ def run_isolated( scenario_id, ValidationStatus.MISSING_SCENARIO, detail=f"Scenario {scenario_id} is not defined", + started_at=started_at, ) if framework not in scenario.supported_frameworks: return _record( @@ -103,6 +112,7 @@ def run_isolated( ValidationStatus.UNSUPPORTED, required=False, detail="Scenario explicitly excludes this framework", + started_at=started_at, ) interpreter = python_path or resolve_python(framework) @@ -112,6 +122,7 @@ def run_isolated( scenario_id, ValidationStatus.UNAVAILABLE, detail=f"Framework interpreter not found: {interpreter}", + started_at=started_at, ) with tempfile.TemporaryDirectory(prefix="ml4t-validation-") as temporary_directory: @@ -141,6 +152,7 @@ def run_isolated( scenario_id, ValidationStatus.TIMEOUT, detail=f"Validation subprocess timed out after {timeout} seconds", + started_at=started_at, ) except OSError as error: return _record( @@ -148,6 +160,7 @@ def run_isolated( scenario_id, ValidationStatus.SUBPROCESS_FAILURE, detail=f"Could not execute validation subprocess: {error}", + started_at=started_at, ) if not result_path.is_file(): @@ -156,6 +169,7 @@ def run_isolated( scenario_id, ValidationStatus.SUBPROCESS_FAILURE, detail=_process_detail(result), + started_at=started_at, ) try: @@ -169,6 +183,7 @@ def run_isolated( scenario_id, ValidationStatus.MALFORMED_OUTPUT, detail=f"Invalid validation record: {error}", + started_at=started_at, ) if record.framework != framework or record.scenario_id != scenario_id: @@ -180,6 +195,7 @@ def run_isolated( "Validation record identity mismatch: " f"received {record.framework}/{record.scenario_id}" ), + started_at=started_at, ) expected_returncode = 1 if record.release_blocking else 0 if result.returncode != expected_returncode: @@ -191,6 +207,7 @@ def run_isolated( f"Record status {record.status.value} conflicts with subprocess " f"exit code {result.returncode}" ), + started_at=started_at, ) return record @@ -228,14 +245,7 @@ def release_gate_passed(records: list[ValidationRecord]) -> bool: def write_report(path: Path, records: list[ValidationRecord]) -> None: """Retain the complete machine-readable release-gate result.""" - payload = { - "schema_version": 1, - "generated_at": datetime.now(UTC).isoformat(), - "frameworks": FRAMEWORK_PINS, - "release_gate_passed": release_gate_passed(records), - "summary": summarize(records), - "records": [record.to_dict() for record in records], - } + payload = build_report(records, manifest=FRAMEWORK_MANIFEST) path.parent.mkdir(parents=True, exist_ok=True) path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8") @@ -254,8 +264,14 @@ def main() -> int: parser.add_argument( "--output", type=Path, + default=VALIDATION_DIR / "candidates" / "CORRECTNESS_RESULTS.candidate.json", + help="Diagnostic candidate path", + ) + parser.add_argument( + "--accepted-output", + type=Path, default=VALIDATION_DIR / "CORRECTNESS_RESULTS.json", - help="Machine-readable result path", + help="Accepted evidence path, replaced only by a complete passing matrix", ) parser.add_argument("--timeout", type=int, default=180, help="Per-scenario timeout in seconds") args = parser.parse_args() @@ -263,11 +279,20 @@ def main() -> int: frameworks = [args.framework] if args.framework else None scenarios = args.scenarios.split(",") if args.scenarios else None records = run_all_validations(frameworks, scenarios, timeout=args.timeout) - write_report(args.output, records) + write_candidate(args.output, records) nonzero = [f"{status}={count}" for status, count in summarize(records).items() if count] print(f"Results: {', '.join(nonzero)}") - print(f"Report: {args.output}") + print(f"Candidate: {args.output}") + full_matrix = frameworks is None and scenarios is None + if full_matrix: + promotion_failures = promote_candidate(args.output, args.accepted_output) + if promotion_failures: + print("Accepted evidence unchanged:") + for failure in promotion_failures: + print(f"- {failure}") + return 1 + print(f"Accepted evidence: {args.accepted_output}") return 0 if release_gate_passed(records) else 1 diff --git a/validation/run_scenario.py b/validation/run_scenario.py index 93294529..0b9de24f 100644 --- a/validation/run_scenario.py +++ b/validation/run_scenario.py @@ -25,7 +25,9 @@ import json import math import sys +import time from pathlib import Path +from typing import Any # Ensure project root is on path PROJECT_ROOT = Path(__file__).parent.parent @@ -33,10 +35,12 @@ sys.path.insert(0, str(PROJECT_ROOT / "src")) sys.path.insert(0, str(VALIDATION_DIR)) -from common import data_generators # noqa: E402 from common.comparator import compare_results, print_comparison # noqa: E402 +from common.framework_registry import load_framework_manifest # noqa: E402 from common.ml4t_runner import run_ml4t # noqa: E402 +from common.provenance import build_record_provenance, generate_inputs # noqa: E402 from common.types import ( # noqa: E402 + ComparisonResult, FrameworkResult, ValidationRecord, ValidationSkipped, @@ -51,6 +55,7 @@ "backtrader": "frameworks.backtrader", "zipline": "frameworks.zipline", } +FRAMEWORK_MANIFEST = load_framework_manifest() def _record( @@ -60,6 +65,11 @@ def _record( *, required: bool = True, detail: str | None = None, + started_at: float | None = None, + provenance: dict[str, Any] | None = None, + framework_result: FrameworkResult | None = None, + ml4t_result: FrameworkResult | None = None, + comparison: ComparisonResult | None = None, ) -> ValidationRecord: scenario = SCENARIOS.get(scenario_id) return ValidationRecord( @@ -69,6 +79,11 @@ def _record( status=status, required=required, detail=detail, + duration_seconds=time.perf_counter() - started_at if started_at is not None else None, + provenance=provenance, + framework_result=framework_result, + ml4t_result=ml4t_result, + comparison=comparison, ) @@ -101,6 +116,7 @@ def run_single( Returns: A terminal, machine-readable validation record. """ + started_at = time.perf_counter() scenario = SCENARIOS.get(scenario_id) if not scenario: print(f"Unknown scenario: {scenario_id}") @@ -109,6 +125,7 @@ def run_single( framework, ValidationStatus.MISSING_SCENARIO, detail=f"Scenario {scenario_id} is not defined", + started_at=started_at, ) if framework not in scenario.supported_frameworks: @@ -119,6 +136,7 @@ def run_single( ValidationStatus.UNSUPPORTED, required=False, detail="Scenario explicitly excludes this framework", + started_at=started_at, ) print(f"\n{'=' * 70}") @@ -128,8 +146,7 @@ def run_single( # Generate data print("\nGenerating test data...") try: - gen_func = getattr(data_generators, scenario.data_generator) - data_result = gen_func(**scenario.data_kwargs) + prices_df, entries, exits = generate_inputs(scenario, framework) except Exception as error: print(f" ERROR: data generation failed: {error}") return _record( @@ -137,32 +154,9 @@ def run_single( framework, ValidationStatus.ADAPTER_FAILURE, detail=f"Data generation failed: {error}", + started_at=started_at, ) - if len(data_result) == 3: - prices_df, entries, exits = data_result - else: - prices_df, entries = data_result - exits = None - - # Align to NYSE calendar for Zipline (which only operates on NYSE sessions) - if framework == "zipline": - import exchange_calendars as xcals - - nyse = xcals.get_calendar("XNYS") - start_ts = prices_df.index[0] - end_ts = prices_df.index[-1] - if start_ts.tz is not None: - start_ts = start_ts.tz_convert(None) - end_ts = end_ts.tz_convert(None) - sessions = nyse.sessions_in_range(start_ts, end_ts) - naive_idx = prices_df.index.tz_localize(None) if prices_df.index.tz else prices_df.index - valid_mask = naive_idx.isin(sessions) - prices_df = prices_df[valid_mask].copy() - entries = entries[valid_mask] - if exits is not None: - exits = exits[valid_mask] - print(f" Bars: {len(prices_df)}") print(f" Entry signals: {entries.sum()}") if exits is not None: @@ -179,6 +173,7 @@ def run_single( framework, ValidationStatus.ADAPTER_IMPORT_FAILURE, detail=str(error), + started_at=started_at, ) try: @@ -190,6 +185,7 @@ def run_single( framework, ValidationStatus.SKIPPED, detail=str(error), + started_at=started_at, ) except ImportError as error: print(f" UNAVAILABLE: {error}") @@ -198,6 +194,7 @@ def run_single( framework, ValidationStatus.UNAVAILABLE, detail=str(error), + started_at=started_at, ) except Exception as error: print(f" ERROR: {error}") @@ -206,6 +203,7 @@ def run_single( framework, ValidationStatus.ADAPTER_FAILURE, detail=str(error), + started_at=started_at, ) malformed_detail = _malformed_result_detail(fw_result) @@ -216,6 +214,7 @@ def run_single( framework, ValidationStatus.MALFORMED_OUTPUT, detail=malformed_detail, + started_at=started_at, ) try: @@ -227,6 +226,7 @@ def run_single( framework, ValidationStatus.MALFORMED_OUTPUT, detail=f"Could not render adapter result: {error}", + started_at=started_at, ) # Run ml4t @@ -242,6 +242,7 @@ def run_single( framework, ValidationStatus.ML4T_FAILURE, detail=str(error), + started_at=started_at, ) # Compare @@ -255,6 +256,27 @@ def run_single( framework, ValidationStatus.MALFORMED_OUTPUT, detail=f"Could not compare validation results: {error}", + started_at=started_at, + ) + + try: + provenance = build_record_provenance( + scenario=scenario, + framework=framework, + target=FRAMEWORK_MANIFEST.targets[framework], + prices=prices_df, + entries=entries, + exits=exits, + framework_result=fw_result, + ml4t_result=ml4t_result, + ) + except Exception as error: + return _record( + scenario_id, + framework, + ValidationStatus.MALFORMED_OUTPUT, + detail=f"Could not retain validation provenance: {error}", + started_at=started_at, ) status = ValidationStatus.PASS if result.passed else ValidationStatus.COMPARISON_FAILURE @@ -263,6 +285,11 @@ def run_single( framework, status, detail=None if result.passed else result.summary, + started_at=started_at, + provenance=provenance, + framework_result=fw_result, + ml4t_result=ml4t_result, + comparison=result, ) From 3379f476125c17c1095536f684a0d2dcc7e68283 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 13 Aug 2026 22:53:02 -0400 Subject: [PATCH 03/44] feat(validation): lock framework environments and CI matrices --- .github/workflows/ci.yml | 45 +- .github/workflows/private-comparisons.yml | 90 ++ .github/workflows/release.yml | 7 +- .../test_framework_environment_builder.py | 174 +++ .../test_framework_target_manifest.py | 5 + tests/contracts/test_python_support_policy.py | 5 +- tests/contracts/test_release_workflow.py | 35 +- tests/contracts/test_security_policy.py | 5 +- .../contracts/test_validation_cli_outcomes.py | 64 + validation/README.md | 50 +- validation/build_framework_env.py | 248 ++++ validation/common/framework_registry.py | 15 + .../environments/backtrader/pyproject.toml | 11 + validation/environments/backtrader/uv.lock | 306 +++++ validation/environments/lean/pyproject.toml | 11 + validation/environments/lean/uv.lock | 829 +++++++++++++ .../environments/vectorbt_oss/pyproject.toml | 11 + validation/environments/vectorbt_oss/uv.lock | 1039 ++++++++++++++++ .../environments/vectorbt_pro/pyproject.toml | 14 + validation/environments/vectorbt_pro/uv.lock | 743 ++++++++++++ .../environments/zipline/pyproject.toml | 11 + validation/environments/zipline/uv.lock | 1062 +++++++++++++++++ validation/framework_targets.toml | 12 + validation/frameworks/vectorbt_oss.py | 2 +- validation/release_checks.txt | 1 + validation/run_all_correctness.py | 52 + 26 files changed, 4799 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/private-comparisons.yml create mode 100644 tests/contracts/test_framework_environment_builder.py create mode 100644 validation/build_framework_env.py create mode 100644 validation/environments/backtrader/pyproject.toml create mode 100644 validation/environments/backtrader/uv.lock create mode 100644 validation/environments/lean/pyproject.toml create mode 100644 validation/environments/lean/uv.lock create mode 100644 validation/environments/vectorbt_oss/pyproject.toml create mode 100644 validation/environments/vectorbt_oss/uv.lock create mode 100644 validation/environments/vectorbt_pro/pyproject.toml create mode 100644 validation/environments/vectorbt_pro/uv.lock create mode 100644 validation/environments/zipline/pyproject.toml create mode 100644 validation/environments/zipline/uv.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6fc3f7f7..bf3c0f08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -178,9 +178,19 @@ jobs: release-performance-evidence.json if-no-files-found: error - contracts: - name: Cross-Engine Contracts + public-parity: + name: Public Parity (${{ matrix.framework }}) runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - framework: vectorbt_oss + environment: .venv-vectorbt-oss + - framework: backtrader + environment: .venv-backtrader + - framework: zipline + environment: .venv-zipline steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -192,22 +202,27 @@ jobs: - name: Set up Python run: uv python install ${{ env.PYTHON_VERSION }} - - name: Install dependencies (with comparison frameworks) - run: uv sync --dev --extra comparison + - name: Build the locked framework environment + run: >- + python validation/build_framework_env.py + --framework ${{ matrix.framework }} + --evidence-output environment-evidence.json - - name: Run cross-engine contract tests - env: - ML4T_COMPARISON_INPROC: "1" + - name: Run the complete required scenario matrix run: >- - uv run pytest tests/contracts/test_cross_engine_contracts.py -v --tb=short --no-cov - --junitxml=parity-contracts.xml + "${{ matrix.environment }}/bin/python" + validation/run_all_correctness.py + --framework ${{ matrix.framework }} + --output correctness-candidate.json - - name: Retain cross-engine parity evidence + - name: Retain public parity evidence if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: parity-contracts - path: parity-contracts.xml + name: parity-${{ matrix.framework }} + path: | + environment-evidence.json + correctness-candidate.json if-no-files-found: error documentation: @@ -249,7 +264,7 @@ jobs: name: Build Package runs-on: ubuntu-latest needs: - [lint, typecheck, compatibility, security, coverage, runtime, contracts, documentation] + [lint, typecheck, compatibility, security, coverage, runtime, public-parity, documentation] steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -289,12 +304,12 @@ jobs: --commit "$GITHUB_SHA" \ --repository "$GITHUB_REPOSITORY" \ --gate compatibility=${{ needs.compatibility.result }} \ - --gate correctness=${{ needs.coverage.result }} \ + --gate correctness=${{ needs.public-parity.result }} \ --gate coverage=${{ needs.coverage.result }} \ --gate documentation=${{ needs.documentation.result }} \ --gate lint=${{ needs.lint.result }} \ --gate packaging=success \ - --gate parity=${{ needs.contracts.result }} \ + --gate parity=${{ needs.public-parity.result }} \ --gate performance=${{ needs.runtime.result }} \ --gate security=${{ needs.security.result }} \ --gate typecheck=${{ needs.typecheck.result }} \ diff --git a/.github/workflows/private-comparisons.yml b/.github/workflows/private-comparisons.yml new file mode 100644 index 00000000..9ca9a3fe --- /dev/null +++ b/.github/workflows/private-comparisons.yml @@ -0,0 +1,90 @@ +name: Private Comparison Evidence + +on: + workflow_call: + secrets: + VECTORBT_PRO_DEPLOY_KEY: + required: true + workflow_dispatch: + +permissions: + contents: read + +env: + PYTHON_VERSION: "3.12" + +jobs: + vectorbt-pro: + name: VectorBT Pro Parity + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Install uv + uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 + with: + version: "latest" + + - name: Set up Python + run: uv python install ${{ env.PYTHON_VERSION }} + + - name: Configure licensed source access + env: + VECTORBT_PRO_DEPLOY_KEY: ${{ secrets.VECTORBT_PRO_DEPLOY_KEY }} + run: | + install -m 700 -d "$HOME/.ssh" + printf '%s\n' "$VECTORBT_PRO_DEPLOY_KEY" > "$HOME/.ssh/id_ed25519" + chmod 600 "$HOME/.ssh/id_ed25519" + ssh-keyscan github.com >> "$HOME/.ssh/known_hosts" + + - name: Build the locked VectorBT Pro environment + run: >- + python validation/build_framework_env.py + --framework vectorbt_pro + --evidence-output vectorbt-pro-environment.json + + - name: Run the complete VectorBT Pro scenario matrix + run: >- + .venv-vectorbt-pro/bin/python + validation/run_all_correctness.py + --framework vectorbt_pro + --output vectorbt-pro-correctness.json + + - name: Retain VectorBT Pro evidence + if: always() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: vectorbt-pro-comparison-${{ github.sha }} + path: | + vectorbt-pro-environment.json + vectorbt-pro-correctness.json + if-no-files-found: error + retention-days: 90 + + lean: + name: LEAN Engine Identity + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Install uv + uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 + with: + version: "latest" + + - name: Set up Python + run: uv python install ${{ env.PYTHON_VERSION }} + + - name: Verify locked LEAN CLI and engine image + run: >- + python validation/build_framework_env.py + --framework lean + --evidence-output lean-environment.json + + - name: Retain LEAN provenance + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: lean-comparison-${{ github.sha }} + path: lean-environment.json + if-no-files-found: error + retention-days: 90 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 36fc195c..26ca9bf5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,10 +24,15 @@ jobs: name: Qualify Release Candidate uses: ./.github/workflows/ci.yml + private-comparisons: + name: Qualify Licensed and Container Comparisons + uses: ./.github/workflows/private-comparisons.yml + secrets: inherit + publish: name: Publish to PyPI runs-on: ubuntu-latest - needs: [ecosystem-qualification, qualification] + needs: [ecosystem-qualification, private-comparisons, qualification] environment: pypi permissions: contents: read diff --git a/tests/contracts/test_framework_environment_builder.py b/tests/contracts/test_framework_environment_builder.py new file mode 100644 index 00000000..0063378b --- /dev/null +++ b/tests/contracts/test_framework_environment_builder.py @@ -0,0 +1,174 @@ +"""Contracts for locked framework comparison environments.""" + +from __future__ import annotations + +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +_PROJECT_ROOT = Path(__file__).parents[2] +_VALIDATION_DIR = _PROJECT_ROOT / "validation" +if str(_VALIDATION_DIR) not in sys.path: + sys.path.insert(0, str(_VALIDATION_DIR)) + +import build_framework_env # noqa: E402 +from common.framework_registry import FrameworkTarget, load_framework_manifest # noqa: E402 + + +@pytest.fixture +def targets() -> dict[str, FrameworkTarget]: + return load_framework_manifest().targets + + +def test_all_environment_definitions_match_frozen_targets( + targets: dict[str, FrameworkTarget], +) -> None: + for framework in build_framework_env.BUILDABLE_FRAMEWORKS: + assert build_framework_env.definition_failures(framework, targets[framework]) == [] + + +def test_public_build_uses_locked_isolated_environment( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + targets: dict[str, FrameworkTarget], +) -> None: + calls: list[tuple[list[str], dict[str, str]]] = [] + + def run(command: list[str], **kwargs): + calls.append((command, kwargs["env"])) + return subprocess.CompletedProcess(command, 0) + + monkeypatch.setattr(build_framework_env.subprocess, "run", run) + + def verify(framework: str, _target: FrameworkTarget, *, root: Path): + assert root == tmp_path + return {"framework": framework} + + monkeypatch.setattr(build_framework_env, "verify_environment", verify) + + result = build_framework_env.build_environment( + "backtrader", targets["backtrader"], root=tmp_path + ) + + assert result == {"framework": "backtrader"} + command, environment = calls[0] + assert command[-2:] == ["--locked", "--no-dev"] + assert environment["UV_PROJECT_ENVIRONMENT"] == str(tmp_path / ".venv-backtrader") + + +def test_definition_rejects_wrong_public_version( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + targets: dict[str, FrameworkTarget], +) -> None: + project = tmp_path / "backtrader" + project.mkdir() + (project / "uv.lock").write_text(targets["backtrader"].immutable_id, encoding="utf-8") + (project / "pyproject.toml").write_text( + '[project]\ndependencies = ["backtrader==1.9.78.122"]\n', encoding="utf-8" + ) + monkeypatch.setattr(build_framework_env, "ENVIRONMENTS_DIR", tmp_path) + + failures = build_framework_env.definition_failures("backtrader", targets["backtrader"]) + + assert any("backtrader==1.9.78.123" in failure for failure in failures) + + +def test_definition_rejects_wrong_private_commit( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + targets: dict[str, FrameworkTarget], +) -> None: + project = tmp_path / "vectorbt_pro" + project.mkdir() + (project / "uv.lock").write_text("wrong-commit", encoding="utf-8") + (project / "pyproject.toml").write_text( + '[project]\ndependencies = ["vectorbtpro @ git+ssh://example.invalid/repo@wrong"]\n', + encoding="utf-8", + ) + monkeypatch.setattr(build_framework_env, "ENVIRONMENTS_DIR", tmp_path) + + failures = build_framework_env.definition_failures("vectorbt_pro", targets["vectorbt_pro"]) + + assert "VectorBT Pro environment does not pin the manifest commit" in failures + assert any("artifact identity" in failure for failure in failures) + + +def test_private_build_reports_missing_licensed_access( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + targets: dict[str, FrameworkTarget], +) -> None: + monkeypatch.setattr(build_framework_env, "definition_failures", lambda *_: []) + monkeypatch.setattr( + build_framework_env.subprocess, + "run", + lambda *args, **_kwargs: (_ for _ in ()).throw(subprocess.CalledProcessError(1, args[0])), + ) + + with pytest.raises(RuntimeError, match="Authorized SSH access"): + build_framework_env.build_environment( + "vectorbt_pro", targets["vectorbt_pro"], root=tmp_path + ) + + +def test_lean_verification_separates_cli_and_engine_provenance( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + targets: dict[str, FrameworkTarget], +) -> None: + target = targets["lean"] + interpreter = tmp_path / ".venv-lean" / "bin" / "python" + interpreter.parent.mkdir(parents=True) + interpreter.touch() + monkeypatch.setattr(build_framework_env, "definition_failures", lambda *_: []) + monkeypatch.setattr( + build_framework_env, + "_probe", + lambda *_: { + "version": target.cli_version, + "ml4t_path": str(_PROJECT_ROOT / "src/ml4t/backtest/__init__.py"), + "python": "3.12.11", + }, + ) + commands: list[list[str]] = [] + + def run(command: list[str], **_kwargs): + commands.append(command) + return subprocess.CompletedProcess(command, 0, "", "") + + monkeypatch.setattr(build_framework_env.subprocess, "run", run) + + evidence = build_framework_env.verify_environment("lean", target, root=tmp_path) + + assert evidence["data_preparation"]["cli_version"] == target.cli_version + assert evidence["engine_execution"]["image_digest"] == target.immutable_id + assert commands == [["docker", "buildx", "imagetools", "inspect", target.artifact]] + + +def test_private_environment_rejects_wrong_installed_commit( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, + targets: dict[str, FrameworkTarget], +) -> None: + target = targets["vectorbt_pro"] + interpreter = tmp_path / ".venv-vectorbt-pro" / "bin" / "python" + interpreter.parent.mkdir(parents=True) + interpreter.touch() + monkeypatch.setattr(build_framework_env, "definition_failures", lambda *_: []) + monkeypatch.setattr( + build_framework_env, + "_probe", + lambda *_: { + "version": target.version, + "direct_url": json.dumps({"vcs_info": {"commit_id": "wrong"}}), + "ml4t_path": str(_PROJECT_ROOT / "src/ml4t/backtest/__init__.py"), + "python": "3.12.11", + }, + ) + + with pytest.raises(ValueError, match="commit differs"): + build_framework_env.verify_environment("vectorbt_pro", target, root=tmp_path) diff --git a/tests/contracts/test_framework_target_manifest.py b/tests/contracts/test_framework_target_manifest.py index 2f2b38ad..d54132fc 100644 --- a/tests/contracts/test_framework_target_manifest.py +++ b/tests/contracts/test_framework_target_manifest.py @@ -60,6 +60,7 @@ def test_scenario_targets_define_reproducible_interpreters() -> None: target = manifest.targets[framework_id] assert target.environment assert target.python_env_var.startswith("ML4T_") + assert target.required_scenarios + target.unsupported_scenarios == 16 def test_benchmark_runner_uses_frozen_target_environments() -> None: @@ -101,6 +102,8 @@ def test_invalid_framework_targets_are_rejected( environment = ".venv-example" python_env_var = "ML4T_EXAMPLE_PYTHON" scenario_matrix = true +required_scenarios = 1 +unsupported_scenarios = 0 """ + replacement + "\n", @@ -130,6 +133,8 @@ def test_duplicate_framework_tables_are_rejected(tmp_path: Path) -> None: source = "https://example.com" immutable_id = "git:abc" scenario_matrix = false +required_scenarios = 0 +unsupported_scenarios = 0 [framework.example] version = "2.0" diff --git a/tests/contracts/test_python_support_policy.py b/tests/contracts/test_python_support_policy.py index 3d287166..b11c79e0 100644 --- a/tests/contracts/test_python_support_policy.py +++ b/tests/contracts/test_python_support_policy.py @@ -122,4 +122,7 @@ def test_merge_and_release_builds_depend_on_compatibility_gate() -> None: assert ci_jobs["compatibility"]["uses"] == "./.github/workflows/compatibility.yml" assert "compatibility" in ci_jobs["build"]["needs"] assert release_jobs["qualification"]["uses"] == "./.github/workflows/ci.yml" - assert release_jobs["publish"]["needs"] == ["ecosystem-qualification", "qualification"] + assert set(release_jobs["publish"]["needs"]) >= { + "ecosystem-qualification", + "qualification", + } diff --git a/tests/contracts/test_release_workflow.py b/tests/contracts/test_release_workflow.py index 1a7d69a5..5d97a9ce 100644 --- a/tests/contracts/test_release_workflow.py +++ b/tests/contracts/test_release_workflow.py @@ -146,9 +146,19 @@ def test_release_reuses_all_ci_gates_and_publishes_the_exact_candidate() -> None "security", "coverage", "runtime", - "contracts", + "public-parity", "documentation", } + parity = jobs["public-parity"] + assert {entry["framework"] for entry in parity["strategy"]["matrix"]["include"]} == { + "vectorbt_oss", + "backtrader", + "zipline", + } + parity_commands = "\n".join(step.get("run", "") for step in parity["steps"]) + assert "validation/build_framework_env.py" in parity_commands + assert "validation/run_all_correctness.py" in parity_commands + assert "--extra comparison" not in parity_commands build_commands = "\n".join(step.get("run", "") for step in jobs["build"]["steps"]) assert "git rev-parse HEAD" in build_commands assert "validation/release_candidate.py create" in build_commands @@ -157,7 +167,14 @@ def test_release_reuses_all_ci_gates_and_publishes_the_exact_candidate() -> None assert f"--gate {gate}=" in build_commands assert release_jobs["qualification"]["uses"] == "./.github/workflows/ci.yml" - assert release_jobs["publish"]["needs"] == ["ecosystem-qualification", "qualification"] + assert release_jobs["private-comparisons"]["uses"] == ( + "./.github/workflows/private-comparisons.yml" + ) + assert release_jobs["publish"]["needs"] == [ + "ecosystem-qualification", + "private-comparisons", + "qualification", + ] assert release_jobs["publish"]["permissions"] == { "contents": "read", "id-token": "write", @@ -172,3 +189,17 @@ def test_release_reuses_all_ci_gates_and_publishes_the_exact_candidate() -> None assert release_jobs["verify-pypi"]["needs"] == "publish" assert release_jobs["github-release"]["needs"] == "verify-pypi" assert "if" not in release_jobs["github-release"] + + +def test_private_comparison_workflow_pins_and_retains_evidence() -> None: + workflow = _workflow("private-comparisons.yml") + jobs = workflow["jobs"] + + assert workflow["on"]["workflow_call"]["secrets"]["VECTORBT_PRO_DEPLOY_KEY"]["required"] + pro_commands = "\n".join(step.get("run", "") for step in jobs["vectorbt-pro"]["steps"]) + assert "validation/build_framework_env.py" in pro_commands + assert "validation/run_all_correctness.py" in pro_commands + assert "--framework vectorbt_pro" in pro_commands + lean_commands = "\n".join(step.get("run", "") for step in jobs["lean"]["steps"]) + assert "--framework lean" in lean_commands + assert "run_all_correctness.py" not in lean_commands diff --git a/tests/contracts/test_security_policy.py b/tests/contracts/test_security_policy.py index 21e7055e..62271734 100644 --- a/tests/contracts/test_security_policy.py +++ b/tests/contracts/test_security_policy.py @@ -161,7 +161,10 @@ def test_ci_and_release_both_require_the_evidence_retaining_security_workflow() assert ci_jobs["security"]["uses"] == "./.github/workflows/security.yml" assert "security" in ci_jobs["build"]["needs"] assert release_jobs["qualification"]["uses"] == "./.github/workflows/ci.yml" - assert release_jobs["publish"]["needs"] == ["ecosystem-qualification", "qualification"] + assert set(release_jobs["publish"]["needs"]) >= { + "ecosystem-qualification", + "qualification", + } scan = security["jobs"]["scan"] commands = "\n".join(step.get("run", "") for step in scan["steps"]) diff --git a/tests/contracts/test_validation_cli_outcomes.py b/tests/contracts/test_validation_cli_outcomes.py index d6f10b58..aa28d0a2 100644 --- a/tests/contracts/test_validation_cli_outcomes.py +++ b/tests/contracts/test_validation_cli_outcomes.py @@ -242,3 +242,67 @@ def test_report_retains_framework_pins(tmp_path: Path) -> None: report = json.loads(report_path.read_text(encoding="utf-8")) assert report["schema_version"] == 2 assert report["frameworks"] == run_all_correctness.FRAMEWORK_PINS + + +def _matrix_records(framework: str) -> list[ValidationRecord]: + return [ + ValidationRecord( + framework, + scenario_id, + scenario.name, + ( + ValidationStatus.PASS + if framework in scenario.supported_frameworks + else ValidationStatus.UNSUPPORTED + ), + framework in scenario.supported_frameworks, + ) + for scenario_id, scenario in run_all_correctness.SCENARIOS.items() + ] + + +def test_complete_public_matrices_match_declared_counts() -> None: + frameworks = ["vectorbt_oss", "backtrader", "zipline"] + records = [record for framework in frameworks for record in _matrix_records(framework)] + + failures = run_all_correctness.matrix_coverage_failures( + records, + frameworks, + list(run_all_correctness.SCENARIOS), + ) + + assert failures == [] + + +def test_matrix_coverage_rejects_an_omitted_pair() -> None: + records = _matrix_records("backtrader")[:-1] + + failures = run_all_correctness.matrix_coverage_failures( + records, + ["backtrader"], + list(run_all_correctness.SCENARIOS), + ) + + assert any("Missing matrix pairs" in failure for failure in failures) + assert any("required count differs" in failure for failure in failures) + + +def test_matrix_coverage_rejects_a_misclassified_pair() -> None: + records = _matrix_records("vectorbt_oss") + unsupported = next(record for record in records if not record.required) + records[records.index(unsupported)] = ValidationRecord( + unsupported.framework, + unsupported.scenario_id, + unsupported.scenario_name, + ValidationStatus.PASS, + True, + ) + + failures = run_all_correctness.matrix_coverage_failures( + records, + ["vectorbt_oss"], + list(run_all_correctness.SCENARIOS), + ) + + assert any("required count differs" in failure for failure in failures) + assert any("unsupported count differs" in failure for failure in failures) diff --git a/validation/README.md b/validation/README.md index 80fca992..7bbea361 100644 --- a/validation/README.md +++ b/validation/README.md @@ -12,8 +12,9 @@ ml4t-backtest validates framework-specific behavior through configurable profile claims require a zero-gap retained result. See [METHODOLOGY.md](METHODOLOGY.md) for the full approach. -Validation is performed per-framework in **isolated virtual environments** due to dependency -conflicts between frameworks (VBT Pro, Backtrader, Zipline). +Validation is performed per-framework in isolated, locked environments. VectorBT OSS 1.1.0 +requires pandas 3 while Zipline Reloaded 3.1.1 requires pandas below 3, so a shared comparison +environment cannot reproduce the current target set. ## Retained Parity Claims @@ -70,10 +71,12 @@ python validation/run_all_correctness.py python validation/run_all_correctness.py --framework backtrader --scenarios 01,03,05,09 ``` -The isolated runner writes `validation/CORRECTNESS_RESULTS.json` and distinguishes comparison -failures, unsupported pairs, unavailable environments, adapter failures, subprocess failures, -timeouts, skips, malformed records, and missing scenarios. Every status except `pass` and an -explicitly optional `unsupported` record fails the release gate. +The isolated runner always writes a diagnostic candidate under `validation/candidates/`. It +replaces `validation/CORRECTNESS_RESULTS.json` only after the complete required matrix passes with +the declared pair counts. Records retain both frameworks' measurements, canonical comparisons, +runtime identity, input digests, adapter identity, and source provenance. Comparison failures, +unavailable environments, adapter failures, subprocess failures, timeouts, skips, malformed +records, missing pairs, duplicates, and incorrect required or unsupported counts fail the gate. ### Large-scale benchmarks @@ -88,29 +91,22 @@ python validation/run_full_validation.py ## Virtual Environment Setup ```bash -# VectorBT Pro 2025.12.31, commit 1305a1e1974325db9382eaeacc6452e9b075ca71 -# Requires an authorized VectorBT Pro license and GitHub SSH access. -uv venv .venv-vectorbt-pro --python 3.12 -uv pip install --python .venv-vectorbt-pro/bin/python \ - "vectorbtpro @ git+ssh://git@github.com/polakowo/vectorbt.pro.git@1305a1e1974325db9382eaeacc6452e9b075ca71" -uv pip install --python .venv-vectorbt-pro/bin/python -e . -uv run python validation/run_all_correctness.py --framework vectorbt_pro - -# VectorBT OSS -python3 -m venv .venv-vectorbt -.venv-vectorbt/bin/pip install vectorbt pandas numpy polars pyyaml pydantic numba - -# Backtrader -python3 -m venv .venv-backtrader -.venv-backtrader/bin/pip install backtrader pandas numpy polars pyyaml pydantic numba exchange_calendars - -# Zipline -python3 -m venv .venv-zipline -.venv-zipline/bin/pip install zipline-reloaded pandas numpy polars pyyaml pydantic numba exchange_calendars - -# Never mix VBT OSS and Pro in the same environment +# Build and verify all public targets from their committed uv locks +python validation/build_framework_env.py --all-public + +# Licensed VectorBT Pro requires authorized SSH access to the frozen source commit +python validation/build_framework_env.py --framework vectorbt_pro + +# Verify the locked LEAN data-preparation CLI and immutable engine image separately +python validation/build_framework_env.py --framework lean ``` +The target versions, artifact hashes, source commits, interpreter paths, and expected matrix counts +are defined in `framework_targets.toml`. Each lock is under `validation/environments/`. CI builds +those locks and executes all 16 declared pairs for each public framework; an omitted pair fails. +The release workflow separately requires licensed VectorBT Pro execution and LEAN image +verification. Repository workflows never store licensed credentials. + ## File Organization ``` diff --git a/validation/build_framework_env.py b/validation/build_framework_env.py new file mode 100644 index 00000000..3d70dc1b --- /dev/null +++ b/validation/build_framework_env.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python3 +"""Build and verify isolated, locked comparison-framework environments.""" + +from __future__ import annotations + +import argparse +import json +import os +import subprocess +import sys +import tomllib +from pathlib import Path +from typing import Any + +VALIDATION_DIR = Path(__file__).parent +PROJECT_ROOT = VALIDATION_DIR.parent +ENVIRONMENTS_DIR = VALIDATION_DIR / "environments" +sys.path.insert(0, str(VALIDATION_DIR)) + +from common.framework_registry import FrameworkTarget, load_framework_manifest # noqa: E402 + +PUBLIC_FRAMEWORKS = ("vectorbt_oss", "backtrader", "zipline") +BUILDABLE_FRAMEWORKS = (*PUBLIC_FRAMEWORKS, "vectorbt_pro", "lean") + + +def project_directory(framework: str) -> Path: + """Return the locked uv project for one framework.""" + return ENVIRONMENTS_DIR / framework + + +def environment_path(target: FrameworkTarget, root: Path = PROJECT_ROOT) -> Path: + """Resolve a target environment below an explicit root.""" + if target.environment is None: + raise ValueError(f"Framework has no environment path: {target.framework_id}") + return root / target.environment + + +def definition_failures(framework: str, target: FrameworkTarget) -> list[str]: + """Check that the lock input names the frozen target exactly.""" + project = project_directory(framework) + failures: list[str] = [] + lock_path = project / "uv.lock" + if not lock_path.is_file(): + failures.append(f"Missing lockfile: {lock_path}") + lock_text = "" + else: + lock_text = lock_path.read_text(encoding="utf-8") + try: + with (project / "pyproject.toml").open("rb") as file: + payload = tomllib.load(file) + dependencies = payload["project"]["dependencies"] + except (KeyError, OSError, tomllib.TOMLDecodeError) as error: + return [f"Invalid environment definition for {framework}: {error}"] + if not isinstance(dependencies, list) or not all( + isinstance(dependency, str) for dependency in dependencies + ): + return [f"Environment dependencies must be a string array: {framework}"] + normalized_package = target.package.lower().replace("_", "-") + matching = [ + dependency + for dependency in dependencies + if dependency.split("@", 1)[0].split("=", 1)[0].strip().lower().replace("_", "-") + == normalized_package + ] + if len(matching) != 1: + failures.append(f"Environment must define one {target.package} dependency: {framework}") + elif framework == "vectorbt_pro": + if target.source_commit is None or f"@{target.source_commit}" not in matching[0]: + failures.append("VectorBT Pro environment does not pin the manifest commit") + else: + expected_version = target.cli_version if framework == "lean" else target.version + if expected_version is None or f"=={expected_version}" not in matching[0]: + failures.append(f"Environment does not pin {target.package}=={expected_version}") + expected_lock_id = target.cli_immutable_id if framework == "lean" else target.immutable_id + if expected_lock_id is None: + failures.append(f"Manifest lacks an artifact identity: {framework}") + elif expected_lock_id.removeprefix("git:") not in lock_text: + failures.append(f"Lockfile does not contain the manifest artifact identity: {framework}") + return failures + + +def _probe(interpreter: Path, target: FrameworkTarget) -> dict[str, Any]: + code = """ +import importlib.metadata +import json +from pathlib import Path +import ml4t.backtest +import sys + +distribution = importlib.metadata.distribution(sys.argv[1]) +print(json.dumps({ + "version": distribution.version, + "direct_url": distribution.read_text("direct_url.json"), + "ml4t_path": str(Path(ml4t.backtest.__file__).resolve()), + "python": sys.version.split()[0], +}, sort_keys=True)) +""" + result = subprocess.run( + [str(interpreter), "-c", code, target.package], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ) + payload = json.loads(result.stdout) + if not isinstance(payload, dict): + raise ValueError("Environment probe did not return an object") + return payload + + +def verify_environment( + framework: str, + target: FrameworkTarget, + *, + root: Path = PROJECT_ROOT, +) -> dict[str, Any]: + """Verify installed package, source checkout, and private or engine identity.""" + failures = definition_failures(framework, target) + if failures: + raise ValueError("; ".join(failures)) + interpreter = environment_path(target, root) / "bin" / "python" + if not interpreter.is_file(): + raise ValueError(f"Environment interpreter is missing: {interpreter}") + payload = _probe(interpreter, target) + if payload.get("version") != target.version and framework != "lean": + raise ValueError( + f"Installed {target.package} version differs: {payload.get('version')} != {target.version}" + ) + ml4t_path = Path(str(payload.get("ml4t_path"))) + if not ml4t_path.is_relative_to(PROJECT_ROOT): + raise ValueError(f"Environment does not import the current checkout: {ml4t_path}") + + evidence: dict[str, Any] = { + "framework": framework, + "environment": str(environment_path(target, root)), + "python": payload.get("python"), + "package": target.package, + "version": payload.get("version"), + "immutable_id": target.immutable_id, + } + if framework == "vectorbt_pro": + direct_url = json.loads(payload.get("direct_url") or "{}") + commit = direct_url.get("vcs_info", {}).get("commit_id") + if commit != target.source_commit: + raise ValueError(f"Installed VectorBT Pro commit differs: {commit}") + evidence["source_commit"] = commit + if framework == "lean": + if payload.get("version") != target.cli_version: + raise ValueError( + f"Installed LEAN CLI differs: {payload.get('version')} != {target.cli_version}" + ) + if target.artifact is None: + raise ValueError("LEAN target lacks an immutable engine image") + subprocess.run( + ["docker", "buildx", "imagetools", "inspect", target.artifact], + check=True, + capture_output=True, + text=True, + ) + evidence = { + "framework": framework, + "data_preparation": { + "cli_package": target.package, + "cli_version": payload.get("version"), + "cli_immutable_id": target.cli_immutable_id, + "python": payload.get("python"), + }, + "engine_execution": { + "image": target.artifact, + "image_digest": target.immutable_id, + "platform_artifact": target.platform_artifact, + }, + } + return evidence + + +def build_environment( + framework: str, + target: FrameworkTarget, + *, + root: Path = PROJECT_ROOT, +) -> dict[str, Any]: + """Synchronize one locked environment and verify its installed identity.""" + failures = definition_failures(framework, target) + if failures: + raise ValueError("; ".join(failures)) + destination = environment_path(target, root) + command_environment = os.environ.copy() + command_environment["UV_PROJECT_ENVIRONMENT"] = str(destination) + command_environment["UV_NO_SOURCES"] = "0" + try: + subprocess.run( + ["uv", "sync", "--project", str(project_directory(framework)), "--locked", "--no-dev"], + cwd=PROJECT_ROOT, + check=True, + env=command_environment, + ) + except subprocess.CalledProcessError as error: + if framework == "vectorbt_pro": + raise RuntimeError( + "VectorBT Pro is unavailable. Authorized SSH access to the licensed source is " + "required; no credentials are stored in this repository." + ) from error + raise + return verify_environment(framework, target, root=root) + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + selection = parser.add_mutually_exclusive_group(required=True) + selection.add_argument("--framework", choices=BUILDABLE_FRAMEWORKS) + selection.add_argument("--all-public", action="store_true") + parser.add_argument("--verify-only", action="store_true") + parser.add_argument("--environment-root", type=Path, default=PROJECT_ROOT) + parser.add_argument("--evidence-output", type=Path) + args = parser.parse_args() + + manifest = load_framework_manifest() + frameworks = PUBLIC_FRAMEWORKS if args.all_public else (args.framework,) + evidence: list[dict[str, Any]] = [] + try: + for framework in frameworks: + if framework is None: + continue + target = manifest.targets[framework] + result = ( + verify_environment(framework, target, root=args.environment_root) + if args.verify_only + else build_environment(framework, target, root=args.environment_root) + ) + evidence.append(result) + print(f"Verified {framework}: {json.dumps(result, sort_keys=True)}") + except (OSError, RuntimeError, ValueError, subprocess.CalledProcessError) as error: + print(f"Environment validation failed: {error}", file=sys.stderr) + return 2 + + if args.evidence_output is not None: + args.evidence_output.parent.mkdir(parents=True, exist_ok=True) + args.evidence_output.write_text( + json.dumps({"schema_version": 1, "environments": evidence}, indent=2, sort_keys=True) + + "\n", + encoding="utf-8", + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/common/framework_registry.py b/validation/common/framework_registry.py index 6e970be4..69f06565 100644 --- a/validation/common/framework_registry.py +++ b/validation/common/framework_registry.py @@ -36,6 +36,8 @@ class FrameworkTarget: source: str immutable_id: str scenario_matrix: bool + required_scenarios: int + unsupported_scenarios: int source_commit: str | None = None artifact: str | None = None environment: str | None = None @@ -173,6 +175,17 @@ def load_framework_manifest(path: Path = DEFAULT_MANIFEST_PATH) -> FrameworkMani scenario_matrix = _required(raw_target, "scenario_matrix", context=context) if not isinstance(scenario_matrix, bool): raise ManifestError(f"{context} scenario_matrix must be a boolean") + required_scenarios = _required(raw_target, "required_scenarios", context=context) + unsupported_scenarios = _required(raw_target, "unsupported_scenarios", context=context) + if ( + not isinstance(required_scenarios, int) + or isinstance(required_scenarios, bool) + or required_scenarios < 0 + or not isinstance(unsupported_scenarios, int) + or isinstance(unsupported_scenarios, bool) + or unsupported_scenarios < 0 + ): + raise ManifestError(f"{context} scenario counts must be nonnegative integers") target = FrameworkTarget( framework_id=framework_id, @@ -186,6 +199,8 @@ def load_framework_manifest(path: Path = DEFAULT_MANIFEST_PATH) -> FrameworkMani source=_string(raw_target, "source", context=context), immutable_id=immutable_id, scenario_matrix=scenario_matrix, + required_scenarios=required_scenarios, + unsupported_scenarios=unsupported_scenarios, source_commit=raw_target.get("source_commit"), artifact=raw_target.get("artifact"), environment=raw_target.get("environment"), diff --git a/validation/environments/backtrader/pyproject.toml b/validation/environments/backtrader/pyproject.toml new file mode 100644 index 00000000..0d85ce03 --- /dev/null +++ b/validation/environments/backtrader/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "ml4t-backtest-validation-backtrader" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = ["backtrader==1.9.78.123", "ml4t-backtest"] + +[tool.uv] +package = false + +[tool.uv.sources] +ml4t-backtest = { path = "../../..", editable = true } diff --git a/validation/environments/backtrader/uv.lock b/validation/environments/backtrader/uv.lock new file mode 100644 index 00000000..d900298e --- /dev/null +++ b/validation/environments/backtrader/uv.lock @@ -0,0 +1,306 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "sys_platform == 'win32'", + "sys_platform == 'emscripten'", + "sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "backtrader" +version = "1.9.78.123" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/ef/328c6ec332435f63b3e18febd263686b8ba07e990676a862cc8522ba38f5/backtrader-1.9.78.123-py2.py3-none-any.whl", hash = "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", size = 419517, upload-time = "2023-04-19T14:13:18.842Z" }, +] + +[[package]] +name = "exchange-calendars" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "korean-lunar-calendar" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyluach" }, + { name = "toolz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, +] + +[[package]] +name = "korean-lunar-calendar" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/9f/6160e95f3934026194dc7a0b5c78fe5c6e74761830ddea3e9cfc38e3f983/korean_lunar_calendar-0.4.0.tar.gz", hash = "sha256:be56f27bc0594fdbbdf7bbe00f504a9f929a31e311bd7d9bb93561b645afade7", size = 13425, upload-time = "2026-06-15T14:19:57.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/88/f56033b09fdca5c8c5e5fc2f3513950a05cd62caa9bd8e6d2750a887c86e/korean_lunar_calendar-0.4.0-py3-none-any.whl", hash = "sha256:c042e20de0bb702add6bec8d0f6da1ea8d3b170838e63846f70420cf341fe4e7", size = 11323, upload-time = "2026-06-15T14:19:56.089Z" }, +] + +[[package]] +name = "ml4t-backtest" +source = { editable = "../../../" } +dependencies = [ + { name = "ml4t-specs" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pandas-market-calendars" }, + { name = "polars" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=1.9.0" }, + { name = "cvxpy", marker = "extra == 'advanced'", specifier = ">=1.3.0" }, + { name = "cvxpy", marker = "extra == 'all'", specifier = ">=1.3.0" }, + { name = "dash", marker = "extra == 'all'", specifier = ">=2.11.0" }, + { name = "dash", marker = "extra == 'viz'", specifier = ">=2.11.0" }, + { name = "hypothesis", marker = "extra == 'all'", specifier = ">=6.80.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.80.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.7.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.7.0" }, + { name = "mkdocs", marker = "extra == 'all'", specifier = ">=1.6,<2" }, + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6,<2" }, + { name = "mkdocs-material", marker = "extra == 'all'", specifier = ">=9.5.0" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, + { name = "ml4t-diagnostic", marker = "extra == 'all'", specifier = ">=0.1.0b4" }, + { name = "ml4t-diagnostic", marker = "extra == 'dev'", specifier = ">=0.1.0b4" }, + { name = "ml4t-specs", specifier = ">=0.1.2,<0.2" }, + { name = "networkx", marker = "extra == 'advanced'", specifier = ">=3.0" }, + { name = "networkx", marker = "extra == 'all'", specifier = ">=3.0" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, + { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, + { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, + { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, + { name = "polars", specifier = ">=1.36.1" }, + { name = "pre-commit", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyfolio-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.9.9" }, + { name = "pytest", marker = "extra == 'all'", specifier = ">=7.4.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", marker = "extra == 'all'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-benchmark", marker = "extra == 'all'", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'all'", specifier = ">=4.1.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "pytest-timeout", marker = "extra == 'all'", specifier = ">=2.1.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.1.0" }, + { name = "pytest-xdist", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "ruff", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, + { name = "ty", marker = "extra == 'all'" }, + { name = "ty", marker = "extra == 'dev'" }, + { name = "vectorbt", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.24.0" }, + { name = "zipline-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=2.4.0" }, +] +provides-extras = ["advanced", "all", "comparison", "dev", "docs", "viz"] + +[package.metadata.requires-dev] +dev = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "ml4t-diagnostic", specifier = ">=0.1.0b4" }, + { name = "pre-commit", specifier = ">=3.3.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, + { name = "ruff", specifier = ">=0.8.0" }, + { name = "twine", specifier = ">=6.0.0" }, + { name = "ty" }, +] +test = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, +] + +[[package]] +name = "ml4t-backtest-validation-backtrader" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "backtrader" }, + { name = "ml4t-backtest" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", specifier = "==1.9.78.123" }, + { name = "ml4t-backtest", editable = "../../../" }, +] + +[[package]] +name = "ml4t-specs" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/ca/aba7ea1f4e9a1da0b4f465dea03d3e4320d63db348245a2a9976096407ac/ml4t_specs-0.1.3.tar.gz", hash = "sha256:9578038af96d59cd50317e78f8781772833b308076da13ad24c0b304bb20961d", size = 50758, upload-time = "2026-08-12T02:27:14.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6c/0a35ee16313441a68a14d811ffa8b79eb63a013d548b6bbb50dfd208c6b1/ml4t_specs-0.1.3-py3-none-any.whl", hash = "sha256:2b9302d27746f5859b62c6748bf217ca4eae76d4842c783575c58f4880d1568f", size = 33860, upload-time = "2026-08-12T02:27:12.929Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" }, + { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" }, + { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9a/ffbd852d58bd74a617fe2f8ee6a58a96982271ce41cf981eab22190b4a4b/pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce", size = 7197652, upload-time = "2026-07-22T22:18:22.502Z" }, + { url = "https://files.pythonhosted.org/packages/70/b5/d2d3e9ae73362ba4229651b0ee1455cf78073a1ce585f6ff693782ce263e/pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41", size = 9831691, upload-time = "2026-07-22T22:18:24.534Z" }, + { url = "https://files.pythonhosted.org/packages/52/51/dea1e89d6a6796b9c43f85a09b484ee03edb8a4c4842e73e200a8c11301c/pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49", size = 9105796, upload-time = "2026-07-22T22:18:27.064Z" }, +] + +[[package]] +name = "pandas-market-calendars" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exchange-calendars" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, +] + +[[package]] +name = "polars" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" }, + { url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" }, + { url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" }, + { url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" }, +] + +[[package]] +name = "pyluach" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/11/42568c1568a75f8803c59f26d29af01a0890352b7a8e03d41ecda8bfb5dd/pyluach-2.3.0.tar.gz", hash = "sha256:ec6e30669d1df50c9ca160486da44a8195bb4c7a5d3d533990d0c5b03accd281", size = 26910, upload-time = "2025-09-09T20:24:39.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c8/f96208ade3ca4c23b372497d0788bcf0f2e0ff4310e5ee693366bc33fdf0/pyluach-2.3.0-py3-none-any.whl", hash = "sha256:4497b731aef59508b079dbf5f00bc5bf4329ac45090a6cd37b5a83756f0e69ab", size = 25914, upload-time = "2025-09-09T20:24:37.831Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] diff --git a/validation/environments/lean/pyproject.toml b/validation/environments/lean/pyproject.toml new file mode 100644 index 00000000..63d1ed41 --- /dev/null +++ b/validation/environments/lean/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "ml4t-backtest-validation-lean" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = ["lean==1.0.228", "ml4t-backtest"] + +[tool.uv] +package = false + +[tool.uv.sources] +ml4t-backtest = { path = "../../..", editable = true } diff --git a/validation/environments/lean/uv.lock b/validation/environments/lean/uv.lock new file mode 100644 index 00000000..665b7854 --- /dev/null +++ b/validation/environments/lean/uv.lock @@ -0,0 +1,829 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "sys_platform == 'win32'", + "sys_platform == 'emscripten'", + "sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, + { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, + { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, + { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, + { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, + { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/31/4971872b3ed8715346231fb6eb4da8fcba65a4143c189db151ee28a2812b/charset_normalizer-3.5.0.tar.gz", hash = "sha256:49bd5feb59b0bf3cbf6ebcf4352e371c95b9da9bacd4449f8b64d0ad2c10a26e", size = 169295, upload-time = "2026-08-12T14:35:31.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/3c/045ea64ea5a550870dd8ab60b2242870328d53f17d2be593b4f9f3121474/charset_normalizer-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:98820e1ceb25c6df7a80c4fd8efa59cb121f99bc7c4c1693ad94a2caff5b311d", size = 343861, upload-time = "2026-08-12T14:32:27.254Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/7502be709db899d5b4801509829188b3a5a10969411da9c846115a5f1b70/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:608553f476fca509537e804c4a71f5eb166ce63b75141f89c2c686ce1aa36956", size = 237550, upload-time = "2026-08-12T14:32:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ce/66392661375148d9455c17bee25509a54e28c39969e34befa48ec8777936/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6753de11eef42f1c321b26d682957d92c7f7bbce6530f34bbe0f9291dd37cc6f", size = 229673, upload-time = "2026-08-12T14:32:29.668Z" }, + { url = "https://files.pythonhosted.org/packages/6a/64/f58c32a8d4ecf55b82ee61ee9aa6a664d4afcd36c72feb4c926fd6fe9af8/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f76dc0a47f94cb9b69d86f01e477f4b0371ca70208b9ccea7e063c41eed9046", size = 260768, upload-time = "2026-08-12T14:32:30.891Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ea/36c90e59a96386174377e855479ec154221ef001e96637e0b23be92489c4/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c387c6bf91b4774e359a48a179e2872b8e8bf741e4fde06ba8d1665eb9a4760a", size = 257880, upload-time = "2026-08-12T14:32:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/23/35/5b85772eb82528ef22ba29487ad544a7049dfd27f35b1a5a55dbc0843048/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14f6904a3cf870abf044df3a8c4924ac6c8ef77e9896586fd37e73ae96cff2af", size = 247547, upload-time = "2026-08-12T14:32:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/b6/14/ba11a99c2a22ab04c2d5383a700b378cb463a78ab15f36444cabc10cd671/charset_normalizer-3.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cce46dd29d73e135e8087b96eb62a4aca6d69391b7f97808c6588ebed3178f3", size = 243326, upload-time = "2026-08-12T14:32:34.794Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4a/cadba3f2400b45aa1d62a4ae0298bf58a3b30b1158baf15c338c7ce5b601/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b476cdb63df22da2b91837593380be3ddbe406f36c506c1c91d80e7196b66288", size = 238820, upload-time = "2026-08-12T14:32:35.984Z" }, + { url = "https://files.pythonhosted.org/packages/47/41/d5188b9342d75b72c2b05d3ee373f01a691397e770f001ee05e3b37925f5/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1f56ce84b317ef2a59d7d3461891c7597c79247d2192bb8114c68a1a1debfcc0", size = 231661, upload-time = "2026-08-12T14:32:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/13/5f/df38fa972c4e945c3d8cee2bc4e610613af522fd359c7dc7a74c419f0278/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ce0f885239357379d92fd9a5fddbe20f0e30e0527c29ba69f8e99eeb1304a76", size = 261459, upload-time = "2026-08-12T14:32:38.369Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d7/043ff7720067a3beee05523465ac9c1c846c68b7884930dd483f72ee5ab6/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:96ae7ab5d8155fde927aa0864fbc8ba3cc4fde6d41ab0c7cea9d6012b4978603", size = 242300, upload-time = "2026-08-12T14:32:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/33980b7b802a048e546a6d9ad2ea783a6cf6b10a86aaccd10db462d8b913/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf91921009025e96ce57a03ced6d14604fc3baf0530351638e9504a55da6fa3b", size = 259101, upload-time = "2026-08-12T14:32:41.02Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b7/0d19bde844bff9165377c1da9ef3c4792a4c24bd49b5b7094d9e6f6ab58b/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0b2e44e6d42d1a4ff78ccc219a93c5449105d10b16198d1aea581080df8073f9", size = 249246, upload-time = "2026-08-12T14:32:42.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/2c34fdfaacdf0e96e880ef562cbf80a9b5f8ea97e0dd9e57ba348a9c65cf/charset_normalizer-3.5.0-cp312-cp312-win32.whl", hash = "sha256:deb99535e9bf0bea8e274c6413eb939a21be35a3f492678dba4d5b1f4d70f142", size = 178025, upload-time = "2026-08-12T14:32:43.909Z" }, + { url = "https://files.pythonhosted.org/packages/76/d0/c34dbd1df23bcbdc1b5d2f48256340d72fa747f1eb03924a9d2fa35ed85b/charset_normalizer-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54dd1a66fa4bce0ccaf0db9dde336e49b3eec646dc4c1c0991279369d373a14", size = 200143, upload-time = "2026-08-12T14:32:45.254Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/4e6bf1465d60c3d8f488d5bde140d0cb91cd23ccab0dc2895cc6c6982047/charset_normalizer-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:b8ea208b304587d47931b36481342d20336e0d338ab052f8b4305926482598d6", size = 180046, upload-time = "2026-08-12T14:32:46.545Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f3/7b523d807cb5e73562ef8acf21d39cdb9d704955327362c781bc3478a73d/charset_normalizer-3.5.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a4ee37248dfac25107c758bda99d545ce73e60b44d2dd39e4a2bb9f2831e9f5", size = 330840, upload-time = "2026-08-12T14:34:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/f0/de/fc68978fe78ca97063c96d764e41ff92ca639948f319271e0ff450e577a2/charset_normalizer-3.5.0-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a864bdcacd8bff58bb4845304e031f821a3ec64b2b7259f2d409cd49c9e59ca3", size = 251862, upload-time = "2026-08-12T14:34:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/a9/cb/82b41a0ab7fb1a88065f1d78ad32696ad88ea3fe8e25b8189d08833938de/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84b736e3b391601bc47b86da381c749c0f894e9191aaca9f31f30c2632206df3", size = 239484, upload-time = "2026-08-12T14:34:47.869Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0c/19608b631f4538f908098d4a2d56a8f79a665e27cc58e9d90479761a9227/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6abb1f356fb865baeb6ebc3fadd843e9a96fbf49b9adcca55037f3cceccb7438", size = 230602, upload-time = "2026-08-12T14:34:49.265Z" }, + { url = "https://files.pythonhosted.org/packages/29/db/f648eb30e14eba301aed61e11672156f137905c1bdbb530151abe8065943/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d366548d2ee28a8cfdcc4296363978cc644a728333be9824d2de4652e83df0a", size = 259208, upload-time = "2026-08-12T14:34:50.632Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e0/ed2c8bdbac484d69614d6993143aeb6cb0f4dd1561c883402517b623c8ef/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d672f329ae504ee240eb39b6effb3318aa8e7e8924c0ce8eee5760b3fad98539", size = 253659, upload-time = "2026-08-12T14:34:52.11Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/b4907cb9ec5b521d9d024ced13611240b86ef065c2eb15b3ad2334dc9940/charset_normalizer-3.5.0-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54036a518748b6c02e666f6d46c3817561998fb904c3be25b56fb4fe3dc5706", size = 248821, upload-time = "2026-08-12T14:34:53.399Z" }, + { url = "https://files.pythonhosted.org/packages/12/b2/e2d1abcfbc05822f0030869efb4e9f8a3658e13b4821796d4b62da917327/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:22a1889f1c9b752c63c36758a0c2145458e3cadb20fced7a0790002e9dd12b26", size = 240271, upload-time = "2026-08-12T14:34:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f9/4ba127ad610542fa3eabfa41c45bf12d357860a815b3566374ec0188e213/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b7eb3eab5c646d3de7dcb14a7c9caebace5249c5767da39e1761cb1576e521a3", size = 232155, upload-time = "2026-08-12T14:34:56.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/68/40613182366d00bd6dbd5f6c84a926cbd120960e038a8269e9ae7d782762/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2080aa129a28267984cdc902898993d788c995c384e285d0d19199f56760d52e", size = 259674, upload-time = "2026-08-12T14:34:57.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/53/4574a14fa4c9de4a6c9f31725354bfa40b67f653e6d594ce1654f9a41b32/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:fd68c825548a611158230e2f9222e210ceb2e3391995c0aa5865cbdf3ab4bd49", size = 246122, upload-time = "2026-08-12T14:34:59.337Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/bd8030d13d92c058ca7b2b9615bbb3169569e144db64d65c149cd45abf5e/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:d8a9316f4da85e937242642b537c6d55d7e9287dd38e5634732f8233932aff45", size = 255221, upload-time = "2026-08-12T14:35:00.71Z" }, + { url = "https://files.pythonhosted.org/packages/77/9d/10ecd3bcbe2666b3d4d4026c97b48f73990682815db516052a1e8f4a31c5/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d90254c8f609338c53ec180fcd4c4f9c16502e238e3fc88ca7fd4c2f38d445b8", size = 253450, upload-time = "2026-08-12T14:35:02.217Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/d044c4872c0938a84f87b5027a698c0e61bacfc5c3551a4e749ca9b7bc5c/charset_normalizer-3.5.0-cp37-abi3-win32.whl", hash = "sha256:8b3e9e29b8b07cc461b9ce7768db7693a93979d0dadf22046f6f3555ded2f516", size = 173594, upload-time = "2026-08-12T14:35:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/10/6b/6046773901f1944b9a89436351529811ee958afc7b774563be9d74a6f0c3/charset_normalizer-3.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:0c8953d9d1617794cfc40d81179571c9ba3805dd029623a15c93f1fb70e60a74", size = 198959, upload-time = "2026-08-12T14:35:05.187Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/b57708ac92aefc8e8389d51d5178129b81f03196da61ee2c23e687b8178a/charset_normalizer-3.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:562d24ca7797c1af8852994950c2e623a907b201fc4b0ed29e92af173d3828ca", size = 267055, upload-time = "2026-08-12T14:35:06.533Z" }, + { url = "https://files.pythonhosted.org/packages/22/c7/754d09943a616937df61e4ba367c409ded2a987e872972098d51a6fcf73b/charset_normalizer-3.5.0-py3-none-any.whl", hash = "sha256:993dfcbe75a85a3784abb5084f2c41b915767c90546fcc92803cffa28611baea", size = 67943, upload-time = "2026-08-12T14:35:30.363Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, +] + +[[package]] +name = "cryptography" +version = "50.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz", hash = "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", size = 880201, upload-time = "2026-07-31T14:25:10.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/5c/59086b4aac5e879d38ddbcf74e4be7ade89cebc3eb199a55da998c3bb46a/cryptography-50.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:031e2d5dd4bb9caa3ca9c82e5a197fd8ae680232cee62603d1a813f3f07e3d03", size = 4001252, upload-time = "2026-07-31T14:23:33.331Z" }, + { url = "https://files.pythonhosted.org/packages/57/ef/8f2df13c7216bcad3e1c74e07f6e193d93e998e114f524a53877c9af27ad/cryptography-50.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd9192b7b70c573d7f214eb1ae35e00d359f6f5e4b27c7e21e30de1fc6204645", size = 4719554, upload-time = "2026-07-31T14:23:35.611Z" }, + { url = "https://files.pythonhosted.org/packages/d9/41/029086c34d91052fc3b88bcc8056f709a7c915c7a23b235a54eb800b1c97/cryptography-50.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:06a32a980526a6ab9a4b9bf8f7385800791e2bb960903cb6b530e4817509a3b7", size = 4702130, upload-time = "2026-07-31T14:23:37.635Z" }, + { url = "https://files.pythonhosted.org/packages/7d/ff/b6ce0954962e7f7b969f850a883744197bb3910bdfd7b6da162eab7d9f68/cryptography-50.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a1b30560f2acc95aa8b2e06e716a13dbfc97314747b80d9707e307f77b40d6b3", size = 4725244, upload-time = "2026-07-31T14:23:39.471Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/63a1027cb7fec360a182208e1b7767d5aa1fe57be3d6aa856e69a321edc0/cryptography-50.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:8d89f3976b10b4ce31118de72329025f70d2c6ead14a8217c5514dd2c6d5a78f", size = 5342265, upload-time = "2026-07-31T14:23:41.286Z" }, + { url = "https://files.pythonhosted.org/packages/6b/72/a1116d683a6d7ece94590013882515de087edf9ef0e6292aae615a44df73/cryptography-50.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b42a28c1844fd9de8f3f7d540e36b66f3a9c83fceac7170ebc7a6a19edd9dcae", size = 4734609, upload-time = "2026-07-31T14:23:43.139Z" }, + { url = "https://files.pythonhosted.org/packages/15/37/36a9c479bbe49acea2636c7fd3360d20f7b7e079c300352011c44850b181/cryptography-50.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:900131fafd8aead39ac7dd3a7e833be754c17a95cfd91221636949fe4eb0aa8a", size = 4356517, upload-time = "2026-07-31T14:23:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/32/98/8a151d64367204cbc63ec65d37502f1d9c53cf4bfc6ec3c532614dbec60d/cryptography-50.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:07949c449a1abcf60d1ee6e88956d89404c7df3c8258f46589e912988e551987", size = 4724529, upload-time = "2026-07-31T14:23:46.93Z" }, + { url = "https://files.pythonhosted.org/packages/22/f6/ec13b470172126464a86bf54d2294a46d29837fc51ba3e45d4047946fb5e/cryptography-50.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:f89831ef99dd7dd169ab06d63a831adb9e20a87aac6d380266bbda5823349169", size = 5299852, upload-time = "2026-07-31T14:23:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/da/3a/f05e32c99d440c9bb891ea0e36c9091891e36be5a9a87ab2ee6ea20729f6/cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:82148ec5bddac30b51a5b3c1945075f896fa022cb93f8e4a01e9f6ee95292c5f", size = 4734462, upload-time = "2026-07-31T14:23:50.861Z" }, + { url = "https://files.pythonhosted.org/packages/ca/dc/bd72b26be8953f80625f63151efd38eee71c76ca6cf591c08ff34615a79e/cryptography-50.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1489e263a8048bb8b6a8bac662eb2d402ea5d2b7b4699b72f385f1e2772db105", size = 4852708, upload-time = "2026-07-31T14:23:52.715Z" }, + { url = "https://files.pythonhosted.org/packages/27/20/c930314a2ab476d15dec966ec87e2e9637bb02b06106b12c0396c57bb603/cryptography-50.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7cec5b856506da6defb290f30c9ee687d5f5e8cb0bd3f6459dde43b0b4fa40ef", size = 5004179, upload-time = "2026-07-31T14:23:54.887Z" }, + { url = "https://files.pythonhosted.org/packages/32/2e/c9db68a0c4bfa28e310707527c0ee3a2bd254104d2e02e68f368e197aa4c/cryptography-50.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:bd1c592e4d5974f0d08d4888e432157adba757c66da0246918e43677fafa2d30", size = 3840395, upload-time = "2026-07-31T14:23:56.677Z" }, + { url = "https://files.pythonhosted.org/packages/03/37/73d005be173aff344af30e9fd2a576575cb2391a7101d9cd3842e1fa8cce/cryptography-50.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ccdc4a71a4dabae05de219404f9f4abc38e3b58422177ff93d0da05967dafa07", size = 4036009, upload-time = "2026-07-31T14:24:24.122Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c6/7a6202a534e32103a285b7834a120869557fe198d51d7cfe59754c8bda9c/cryptography-50.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:910e1d2668e7de9648f2bcee30e180db2a6b15c30f887d7c4c93ddf96e3992e3", size = 4745252, upload-time = "2026-07-31T14:24:26.118Z" }, + { url = "https://files.pythonhosted.org/packages/85/4f/0fa8c2f4428198f15d9ff8d63400e27afbf94ce833f6108da1eb3753f945/cryptography-50.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a91296cb61e8df6f86d0c19cc4068228da256bf59bf86049fbd821084565327f", size = 4728939, upload-time = "2026-07-31T14:24:27.994Z" }, + { url = "https://files.pythonhosted.org/packages/d1/63/54dd723490ba2dc09b299682c10b38db38f159728bcaae8c591b8af2f22d/cryptography-50.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e722f16708d854fe924790e051061f6704a472c3bac347b6fd88033ea8dd0dc5", size = 4748483, upload-time = "2026-07-31T14:24:30.254Z" }, + { url = "https://files.pythonhosted.org/packages/1d/dd/7c77d26285cc7f6991efce64a0f5b4f9383bfa5dd8c5033003eaf7db4cdb/cryptography-50.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:d764dcf130c428ef66786f866dd750f53182bc608813489915e9fc106bb0c82f", size = 5367599, upload-time = "2026-07-31T14:24:32.457Z" }, + { url = "https://files.pythonhosted.org/packages/46/c9/f60aed34c013f317f92817b6c171c2d22a78270fa41109bd4b08af26b194/cryptography-50.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:105110f43a471dbd0060b9c9516cb8a6a79233631a04cc2ba16f28323ac6e025", size = 4762647, upload-time = "2026-07-31T14:24:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/be/f3/f9a0173b139372c3a48ed98154b45cc6b9de17c789d5ab552e621c293609/cryptography-50.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:828743d939e9629bc267b8e2d08d8bb67cd4319c771a33d4b18b22dd8fb7440a", size = 4385197, upload-time = "2026-07-31T14:24:36.647Z" }, + { url = "https://files.pythonhosted.org/packages/d8/36/83bb81f6e569bc38e1e4a7bc80f29b46bb9601920bc455fc8e888f5d5742/cryptography-50.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a8183b489dc1f7f80f135780fadc1108f14b31b8a40411c7a5b17425f65f28b", size = 4748095, upload-time = "2026-07-31T14:24:39.493Z" }, + { url = "https://files.pythonhosted.org/packages/6b/16/d3008eff98c764979865834c3d386d4fd041b5f52e7f34fc29ac1a5eb515/cryptography-50.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6e7d61120573a7f2cd94cc095f9e81f6967c61ccdf194285aa143ecec8e0b708", size = 5325948, upload-time = "2026-07-31T14:24:41.556Z" }, + { url = "https://files.pythonhosted.org/packages/9c/f8/d97f9603efda3888187bfdb893f26c41be4735c10631d05d284ee6b047c4/cryptography-50.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:37fdb0d0111f1e2ff07139dfb79f1b49531f8e213c46f1163dd7642979b58c47", size = 4762400, upload-time = "2026-07-31T14:24:43.636Z" }, + { url = "https://files.pythonhosted.org/packages/64/a2/4615c8f7d81a00b1d6e6afe19f694e1543582349fb5f4076f6cb5dc36485/cryptography-50.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87f62a3d3b9888ed0fdde100ec06aa61ca9cd44bad9057d1dff9a516b5f5bb9", size = 4878208, upload-time = "2026-07-31T14:24:45.522Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1a/efcfb02f91407149a0dacffffab791f7e19bf6385f63b3666dc8b5e5c9c8/cryptography-50.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:65c2c3add92b45fd0709db8594536aea39c2a67af0e27ffcf049c498501140b7", size = 5037050, upload-time = "2026-07-31T14:24:47.697Z" }, + { url = "https://files.pythonhosted.org/packages/57/30/4a22984d4f1bdfb8c054f07a92bc176b97a3134cc1d6c4b3bffb1f3688b4/cryptography-50.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:d24fead1d4d076e1bfb006dcec392074a3cd8d7b4fc8a595aa64073b2b7a96ba", size = 3874135, upload-time = "2026-07-31T14:24:50.085Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "docker" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/7f/731ff914b0255d3d065f45fd4e626d4b8c95dbcbaada049f337a6ac16410/docker-7.2.0.tar.gz", hash = "sha256:cebb93773d334f778e023a7ee352a8d6e13ab1bd3b863a4d4a59dec897df43ac", size = 118731, upload-time = "2026-07-09T14:53:46.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/23/529140fe1aab80fc6992f93a706deec709140a6397439139a054e1515c45/docker-7.2.0-py3-none-any.whl", hash = "sha256:a3f45fdeb9165e2d25d9a1d02ddf3bc70fb572cf5ebbf9b58558c22caf29b71f", size = 148775, upload-time = "2026-07-09T14:53:45.224Z" }, +] + +[[package]] +name = "exchange-calendars" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "korean-lunar-calendar" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyluach" }, + { name = "toolz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, +] + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "json5" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/7d/05c46a96a78147ae3bf99c2f4169ce144a70220b8d6fcd56f6ec368b8ce9/json5-0.15.0.tar.gz", hash = "sha256:7424d1f1eb1d56da6e3d70643f53619862b4ce81440bdb8ecfd6f875e5ba4a71", size = 53278, upload-time = "2026-06-19T20:08:27.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/be/59527c99478aade6bb33a68d72e6e18dd4e6ff6eacfc7d01bdb15bc76912/json5-0.15.0-py3-none-any.whl", hash = "sha256:56636a30c0e8a4665fe2179c0212f32eae3796dea89ea6f649b9436ecdb39618", size = 36570, upload-time = "2026-06-19T20:08:26.748Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + +[[package]] +name = "korean-lunar-calendar" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/9f/6160e95f3934026194dc7a0b5c78fe5c6e74761830ddea3e9cfc38e3f983/korean_lunar_calendar-0.4.0.tar.gz", hash = "sha256:be56f27bc0594fdbbdf7bbe00f504a9f929a31e311bd7d9bb93561b645afade7", size = 13425, upload-time = "2026-06-15T14:19:57.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/88/f56033b09fdca5c8c5e5fc2f3513950a05cd62caa9bd8e6d2750a887c86e/korean_lunar_calendar-0.4.0-py3-none-any.whl", hash = "sha256:c042e20de0bb702add6bec8d0f6da1ea8d3b170838e63846f70420cf341fe4e7", size = 11323, upload-time = "2026-06-15T14:19:56.089Z" }, +] + +[[package]] +name = "lean" +version = "1.0.228" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "cryptography" }, + { name = "docker" }, + { name = "joblib" }, + { name = "json5" }, + { name = "lxml" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "python-dateutil" }, + { name = "quantconnect-stubs" }, + { name = "requests" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/fe/78ca8cbe7cf725a2a3733201757a9c1f5062a1406ed6d8f8179e814c20b8/lean-1.0.228.tar.gz", hash = "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", size = 250308, upload-time = "2026-08-12T21:06:08.688Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/30/927d761921cb82745589975b5df71aa0bf3509d7014888cb36e99f4b8e9b/lean-1.0.228-py3-none-any.whl", hash = "sha256:4684bafbbb24df22fbbabd6f490bc321f09f24258866e69ef7b8059c0afcace1", size = 332862, upload-time = "2026-08-12T21:06:07.234Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, + { url = "https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" }, + { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" }, + { url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" }, + { url = "https://files.pythonhosted.org/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/64/f9a391af28f518b11ad45a8a712353c94a0aefce09d3703200e5c54b610a/matplotlib-3.11.1.tar.gz", hash = "sha256:69647db5746941c793d6e445a4cd349323ffb87d9cc958c2ad84a659b4832d30", size = 32612045, upload-time = "2026-07-18T03:39:46.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/6c/7ef7ebcb2bd9739b2b66b18b076e077f44bb46fdbe28ca0506edb3c62c79/matplotlib-3.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e15ef41507f3d525f46154ac9e3ae785dacde9f20e593a25de8986267892ef74", size = 9453849, upload-time = "2026-07-18T03:38:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/6d0c312c8d9738e7d9677f09fe5c986b3239e651a7b73a2deb38b65e4a71/matplotlib-3.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21a67b961a6d597bca54fae826cd20695ba4a6e4d05424a08da6e13e3176fd6b", size = 9283113, upload-time = "2026-07-18T03:38:21.95Z" }, + { url = "https://files.pythonhosted.org/packages/c9/cf/b4ad2cc81b6672ea29ea04e64e350a9f9b493b0908ccd884c67eeff8f7b2/matplotlib-3.11.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba8f811b8ddfac493734d6af0b2dff96919d0c28ca0d641858dab4262777c6ea", size = 10035615, upload-time = "2026-07-18T03:38:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/88/90/4e10e033d9b66589d8ed98b84c95cdbb57033d57c1f41339d7393dbd2f2e/matplotlib-3.11.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c52f7ad20ef476806ed212380b1d54d20310c8b86bdc2c9a68b51f0024a44472", size = 10842559, upload-time = "2026-07-18T03:38:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/88/eb/799612d0f8cd3e816a10fec59329fca52cd2353264df80378dfc541ae855/matplotlib-3.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b14eb22961fe865efb0e4ff167e333e428908b00115a8d800ccb65ee108e481", size = 10927532, upload-time = "2026-07-18T03:38:28.532Z" }, + { url = "https://files.pythonhosted.org/packages/88/89/56649bbaa2fd12e20f3be03dbcc135b0c8676d88bac17977599e3eb442a0/matplotlib-3.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:88a2a27dd9691ae448dfae4b26f59036be90c3c28757edd3553a29559d00859f", size = 9333886, upload-time = "2026-07-18T03:38:30.477Z" }, + { url = "https://files.pythonhosted.org/packages/c1/11/4d124efbbad677b7b7552f6f85a3bd432d4232f95400cea98fcd2ae36ef3/matplotlib-3.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:480194afceca4df2f137c2721227d3cba67121fbf4397b69cee7f83714b0a58a", size = 9007545, upload-time = "2026-07-18T03:38:32.833Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml4t-backtest" +source = { editable = "../../../" } +dependencies = [ + { name = "ml4t-specs" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pandas-market-calendars" }, + { name = "polars" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=1.9.0" }, + { name = "cvxpy", marker = "extra == 'advanced'", specifier = ">=1.3.0" }, + { name = "cvxpy", marker = "extra == 'all'", specifier = ">=1.3.0" }, + { name = "dash", marker = "extra == 'all'", specifier = ">=2.11.0" }, + { name = "dash", marker = "extra == 'viz'", specifier = ">=2.11.0" }, + { name = "hypothesis", marker = "extra == 'all'", specifier = ">=6.80.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.80.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.7.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.7.0" }, + { name = "mkdocs", marker = "extra == 'all'", specifier = ">=1.6,<2" }, + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6,<2" }, + { name = "mkdocs-material", marker = "extra == 'all'", specifier = ">=9.5.0" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, + { name = "ml4t-diagnostic", marker = "extra == 'all'", specifier = ">=0.1.0b4" }, + { name = "ml4t-diagnostic", marker = "extra == 'dev'", specifier = ">=0.1.0b4" }, + { name = "ml4t-specs", specifier = ">=0.1.2,<0.2" }, + { name = "networkx", marker = "extra == 'advanced'", specifier = ">=3.0" }, + { name = "networkx", marker = "extra == 'all'", specifier = ">=3.0" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, + { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, + { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, + { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, + { name = "polars", specifier = ">=1.36.1" }, + { name = "pre-commit", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyfolio-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.9.9" }, + { name = "pytest", marker = "extra == 'all'", specifier = ">=7.4.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", marker = "extra == 'all'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-benchmark", marker = "extra == 'all'", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'all'", specifier = ">=4.1.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "pytest-timeout", marker = "extra == 'all'", specifier = ">=2.1.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.1.0" }, + { name = "pytest-xdist", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "ruff", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, + { name = "ty", marker = "extra == 'all'" }, + { name = "ty", marker = "extra == 'dev'" }, + { name = "vectorbt", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.24.0" }, + { name = "zipline-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=2.4.0" }, +] +provides-extras = ["advanced", "all", "comparison", "dev", "docs", "viz"] + +[package.metadata.requires-dev] +dev = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "ml4t-diagnostic", specifier = ">=0.1.0b4" }, + { name = "pre-commit", specifier = ">=3.3.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, + { name = "ruff", specifier = ">=0.8.0" }, + { name = "twine", specifier = ">=6.0.0" }, + { name = "ty" }, +] +test = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, +] + +[[package]] +name = "ml4t-backtest-validation-lean" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "lean" }, + { name = "ml4t-backtest" }, +] + +[package.metadata] +requires-dist = [ + { name = "lean", specifier = "==1.0.228" }, + { name = "ml4t-backtest", editable = "../../../" }, +] + +[[package]] +name = "ml4t-specs" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/ca/aba7ea1f4e9a1da0b4f465dea03d3e4320d63db348245a2a9976096407ac/ml4t_specs-0.1.3.tar.gz", hash = "sha256:9578038af96d59cd50317e78f8781772833b308076da13ad24c0b304bb20961d", size = 50758, upload-time = "2026-08-12T02:27:14.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6c/0a35ee16313441a68a14d811ffa8b79eb63a013d548b6bbb50dfd208c6b1/ml4t_specs-0.1.3-py3-none-any.whl", hash = "sha256:2b9302d27746f5859b62c6748bf217ca4eae76d4842c783575c58f4880d1568f", size = 33860, upload-time = "2026-08-12T02:27:12.929Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" }, + { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" }, + { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9a/ffbd852d58bd74a617fe2f8ee6a58a96982271ce41cf981eab22190b4a4b/pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce", size = 7197652, upload-time = "2026-07-22T22:18:22.502Z" }, + { url = "https://files.pythonhosted.org/packages/70/b5/d2d3e9ae73362ba4229651b0ee1455cf78073a1ce585f6ff693782ce263e/pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41", size = 9831691, upload-time = "2026-07-22T22:18:24.534Z" }, + { url = "https://files.pythonhosted.org/packages/52/51/dea1e89d6a6796b9c43f85a09b484ee03edb8a4c4842e73e200a8c11301c/pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49", size = 9105796, upload-time = "2026-07-22T22:18:27.064Z" }, +] + +[[package]] +name = "pandas-market-calendars" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exchange-calendars" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, +] + +[[package]] +name = "polars" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" }, + { url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" }, + { url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" }, + { url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyluach" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/11/42568c1568a75f8803c59f26d29af01a0890352b7a8e03d41ecda8bfb5dd/pyluach-2.3.0.tar.gz", hash = "sha256:ec6e30669d1df50c9ca160486da44a8195bb4c7a5d3d533990d0c5b03accd281", size = 26910, upload-time = "2025-09-09T20:24:39.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c8/f96208ade3ca4c23b372497d0788bcf0f2e0ff4310e5ee693366bc33fdf0/pyluach-2.3.0-py3-none-any.whl", hash = "sha256:4497b731aef59508b079dbf5f00bc5bf4329ac45090a6cd37b5a83756f0e69ab", size = 25914, upload-time = "2025-09-09T20:24:37.831Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pywin32" +version = "312" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/ff/32aa7d2ed0ab12b323aaa64f9b75e6ad4f8fd09f9ccfc28c79414d46838d/pywin32-312-cp312-cp312-win32.whl", hash = "sha256:dab4f65ac9c4e48400a2a0530c46c3c579cd5905ecd11b80692373915269208b", size = 6371877, upload-time = "2026-06-04T07:49:28.836Z" }, + { url = "https://files.pythonhosted.org/packages/03/d9/77040d3b43df3f3be32ea289433d660d2727f5ba327bc73be835127d9d60/pywin32-312-cp312-cp312-win_amd64.whl", hash = "sha256:b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc", size = 6914841, upload-time = "2026-06-04T07:49:31.85Z" }, + { url = "https://files.pythonhosted.org/packages/e3/cc/7b1ec671775756020a0ee7f4feeaf3c568f0ab86bd3900088cf986937a92/pywin32-312-cp312-cp312-win_arm64.whl", hash = "sha256:6017c58e12f6809fbb0555b75df144c2922a9ffd18e4b9b5afa863b6c1a9d950", size = 6727901, upload-time = "2026-06-04T07:49:34.244Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "quantconnect-stubs" +version = "18001" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/e8/9ed36cb373d28d2d01e2ffe9c271ac87fffb70c37d65935e2cfe540a37f7/quantconnect_stubs-18001.tar.gz", hash = "sha256:f30f412801687776abea66619db65d9bc7b1cbf11df15909f2eabd59211db83c", size = 1362280, upload-time = "2026-08-13T23:28:05.823Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/17/945ffdad1bf4e33f6cd395cabdf1c43f1f42f58ff909eba6fbd36eaf3d81/quantconnect_stubs-18001-py3-none-any.whl", hash = "sha256:02a51d98303d2b22e49b40c1cfb4c1b1da546d78b121e2c5c258ee317a7f4e85", size = 1571614, upload-time = "2026-08-13T23:28:03.013Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] diff --git a/validation/environments/vectorbt_oss/pyproject.toml b/validation/environments/vectorbt_oss/pyproject.toml new file mode 100644 index 00000000..018c38cc --- /dev/null +++ b/validation/environments/vectorbt_oss/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "ml4t-backtest-validation-vectorbt-oss" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = ["ml4t-backtest", "vectorbt==1.1.0"] + +[tool.uv] +package = false + +[tool.uv.sources] +ml4t-backtest = { path = "../../..", editable = true } diff --git a/validation/environments/vectorbt_oss/uv.lock b/validation/environments/vectorbt_oss/uv.lock new file mode 100644 index 00000000..65c1f71e --- /dev/null +++ b/validation/environments/vectorbt_oss/uv.lock @@ -0,0 +1,1039 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "sys_platform == 'win32'", + "sys_platform == 'emscripten'", + "sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "anywidget" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipywidgets" }, + { name = "psygnal" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/31/0491d707c674b34267f55d96d6a7148e55e7b6718a271686232cf295fbe2/anywidget-0.11.0.tar.gz", hash = "sha256:6695fbef9449cf8c27f421b96c5837aa37f909ec1f60cfa33add333e1b70b169", size = 426999, upload-time = "2026-04-27T23:42:09.576Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/c2/8fec8e8e2eb920cc2280f569144080cd58622a2eda83bfa4c0c354a63264/anywidget-0.11.0-py3-none-any.whl", hash = "sha256:c574d9acc6503ad27b37a9acea48f957a8ba7c9c9876cfcb37898931c098ce9d", size = 317341, upload-time = "2026-04-27T23:42:08.356Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/25/1e/faf0f247f6f881b98fc4d6d07e14085cb89d13665084e6d6ac1dc2c03d0b/asttokens-3.0.2.tar.gz", hash = "sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2", size = 63136, upload-time = "2026-07-12T03:31:49.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/2b/04b8a15f3a1c77bc79ddf5c73875327f34b4fa75982df2b76e45e402d364/asttokens-3.0.2-py3-none-any.whl", hash = "sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933", size = 28702, upload-time = "2026-07-12T03:31:47.542Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/31/4971872b3ed8715346231fb6eb4da8fcba65a4143c189db151ee28a2812b/charset_normalizer-3.5.0.tar.gz", hash = "sha256:49bd5feb59b0bf3cbf6ebcf4352e371c95b9da9bacd4449f8b64d0ad2c10a26e", size = 169295, upload-time = "2026-08-12T14:35:31.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/3c/045ea64ea5a550870dd8ab60b2242870328d53f17d2be593b4f9f3121474/charset_normalizer-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:98820e1ceb25c6df7a80c4fd8efa59cb121f99bc7c4c1693ad94a2caff5b311d", size = 343861, upload-time = "2026-08-12T14:32:27.254Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/7502be709db899d5b4801509829188b3a5a10969411da9c846115a5f1b70/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:608553f476fca509537e804c4a71f5eb166ce63b75141f89c2c686ce1aa36956", size = 237550, upload-time = "2026-08-12T14:32:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ce/66392661375148d9455c17bee25509a54e28c39969e34befa48ec8777936/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6753de11eef42f1c321b26d682957d92c7f7bbce6530f34bbe0f9291dd37cc6f", size = 229673, upload-time = "2026-08-12T14:32:29.668Z" }, + { url = "https://files.pythonhosted.org/packages/6a/64/f58c32a8d4ecf55b82ee61ee9aa6a664d4afcd36c72feb4c926fd6fe9af8/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f76dc0a47f94cb9b69d86f01e477f4b0371ca70208b9ccea7e063c41eed9046", size = 260768, upload-time = "2026-08-12T14:32:30.891Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ea/36c90e59a96386174377e855479ec154221ef001e96637e0b23be92489c4/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c387c6bf91b4774e359a48a179e2872b8e8bf741e4fde06ba8d1665eb9a4760a", size = 257880, upload-time = "2026-08-12T14:32:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/23/35/5b85772eb82528ef22ba29487ad544a7049dfd27f35b1a5a55dbc0843048/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14f6904a3cf870abf044df3a8c4924ac6c8ef77e9896586fd37e73ae96cff2af", size = 247547, upload-time = "2026-08-12T14:32:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/b6/14/ba11a99c2a22ab04c2d5383a700b378cb463a78ab15f36444cabc10cd671/charset_normalizer-3.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cce46dd29d73e135e8087b96eb62a4aca6d69391b7f97808c6588ebed3178f3", size = 243326, upload-time = "2026-08-12T14:32:34.794Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4a/cadba3f2400b45aa1d62a4ae0298bf58a3b30b1158baf15c338c7ce5b601/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b476cdb63df22da2b91837593380be3ddbe406f36c506c1c91d80e7196b66288", size = 238820, upload-time = "2026-08-12T14:32:35.984Z" }, + { url = "https://files.pythonhosted.org/packages/47/41/d5188b9342d75b72c2b05d3ee373f01a691397e770f001ee05e3b37925f5/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1f56ce84b317ef2a59d7d3461891c7597c79247d2192bb8114c68a1a1debfcc0", size = 231661, upload-time = "2026-08-12T14:32:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/13/5f/df38fa972c4e945c3d8cee2bc4e610613af522fd359c7dc7a74c419f0278/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ce0f885239357379d92fd9a5fddbe20f0e30e0527c29ba69f8e99eeb1304a76", size = 261459, upload-time = "2026-08-12T14:32:38.369Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d7/043ff7720067a3beee05523465ac9c1c846c68b7884930dd483f72ee5ab6/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:96ae7ab5d8155fde927aa0864fbc8ba3cc4fde6d41ab0c7cea9d6012b4978603", size = 242300, upload-time = "2026-08-12T14:32:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/33980b7b802a048e546a6d9ad2ea783a6cf6b10a86aaccd10db462d8b913/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf91921009025e96ce57a03ced6d14604fc3baf0530351638e9504a55da6fa3b", size = 259101, upload-time = "2026-08-12T14:32:41.02Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b7/0d19bde844bff9165377c1da9ef3c4792a4c24bd49b5b7094d9e6f6ab58b/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0b2e44e6d42d1a4ff78ccc219a93c5449105d10b16198d1aea581080df8073f9", size = 249246, upload-time = "2026-08-12T14:32:42.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/2c34fdfaacdf0e96e880ef562cbf80a9b5f8ea97e0dd9e57ba348a9c65cf/charset_normalizer-3.5.0-cp312-cp312-win32.whl", hash = "sha256:deb99535e9bf0bea8e274c6413eb939a21be35a3f492678dba4d5b1f4d70f142", size = 178025, upload-time = "2026-08-12T14:32:43.909Z" }, + { url = "https://files.pythonhosted.org/packages/76/d0/c34dbd1df23bcbdc1b5d2f48256340d72fa747f1eb03924a9d2fa35ed85b/charset_normalizer-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54dd1a66fa4bce0ccaf0db9dde336e49b3eec646dc4c1c0991279369d373a14", size = 200143, upload-time = "2026-08-12T14:32:45.254Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/4e6bf1465d60c3d8f488d5bde140d0cb91cd23ccab0dc2895cc6c6982047/charset_normalizer-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:b8ea208b304587d47931b36481342d20336e0d338ab052f8b4305926482598d6", size = 180046, upload-time = "2026-08-12T14:32:46.545Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f3/7b523d807cb5e73562ef8acf21d39cdb9d704955327362c781bc3478a73d/charset_normalizer-3.5.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a4ee37248dfac25107c758bda99d545ce73e60b44d2dd39e4a2bb9f2831e9f5", size = 330840, upload-time = "2026-08-12T14:34:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/f0/de/fc68978fe78ca97063c96d764e41ff92ca639948f319271e0ff450e577a2/charset_normalizer-3.5.0-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a864bdcacd8bff58bb4845304e031f821a3ec64b2b7259f2d409cd49c9e59ca3", size = 251862, upload-time = "2026-08-12T14:34:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/a9/cb/82b41a0ab7fb1a88065f1d78ad32696ad88ea3fe8e25b8189d08833938de/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84b736e3b391601bc47b86da381c749c0f894e9191aaca9f31f30c2632206df3", size = 239484, upload-time = "2026-08-12T14:34:47.869Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0c/19608b631f4538f908098d4a2d56a8f79a665e27cc58e9d90479761a9227/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6abb1f356fb865baeb6ebc3fadd843e9a96fbf49b9adcca55037f3cceccb7438", size = 230602, upload-time = "2026-08-12T14:34:49.265Z" }, + { url = "https://files.pythonhosted.org/packages/29/db/f648eb30e14eba301aed61e11672156f137905c1bdbb530151abe8065943/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d366548d2ee28a8cfdcc4296363978cc644a728333be9824d2de4652e83df0a", size = 259208, upload-time = "2026-08-12T14:34:50.632Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e0/ed2c8bdbac484d69614d6993143aeb6cb0f4dd1561c883402517b623c8ef/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d672f329ae504ee240eb39b6effb3318aa8e7e8924c0ce8eee5760b3fad98539", size = 253659, upload-time = "2026-08-12T14:34:52.11Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/b4907cb9ec5b521d9d024ced13611240b86ef065c2eb15b3ad2334dc9940/charset_normalizer-3.5.0-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54036a518748b6c02e666f6d46c3817561998fb904c3be25b56fb4fe3dc5706", size = 248821, upload-time = "2026-08-12T14:34:53.399Z" }, + { url = "https://files.pythonhosted.org/packages/12/b2/e2d1abcfbc05822f0030869efb4e9f8a3658e13b4821796d4b62da917327/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:22a1889f1c9b752c63c36758a0c2145458e3cadb20fced7a0790002e9dd12b26", size = 240271, upload-time = "2026-08-12T14:34:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f9/4ba127ad610542fa3eabfa41c45bf12d357860a815b3566374ec0188e213/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b7eb3eab5c646d3de7dcb14a7c9caebace5249c5767da39e1761cb1576e521a3", size = 232155, upload-time = "2026-08-12T14:34:56.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/68/40613182366d00bd6dbd5f6c84a926cbd120960e038a8269e9ae7d782762/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2080aa129a28267984cdc902898993d788c995c384e285d0d19199f56760d52e", size = 259674, upload-time = "2026-08-12T14:34:57.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/53/4574a14fa4c9de4a6c9f31725354bfa40b67f653e6d594ce1654f9a41b32/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:fd68c825548a611158230e2f9222e210ceb2e3391995c0aa5865cbdf3ab4bd49", size = 246122, upload-time = "2026-08-12T14:34:59.337Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/bd8030d13d92c058ca7b2b9615bbb3169569e144db64d65c149cd45abf5e/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:d8a9316f4da85e937242642b537c6d55d7e9287dd38e5634732f8233932aff45", size = 255221, upload-time = "2026-08-12T14:35:00.71Z" }, + { url = "https://files.pythonhosted.org/packages/77/9d/10ecd3bcbe2666b3d4d4026c97b48f73990682815db516052a1e8f4a31c5/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d90254c8f609338c53ec180fcd4c4f9c16502e238e3fc88ca7fd4c2f38d445b8", size = 253450, upload-time = "2026-08-12T14:35:02.217Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/d044c4872c0938a84f87b5027a698c0e61bacfc5c3551a4e749ca9b7bc5c/charset_normalizer-3.5.0-cp37-abi3-win32.whl", hash = "sha256:8b3e9e29b8b07cc461b9ce7768db7693a93979d0dadf22046f6f3555ded2f516", size = 173594, upload-time = "2026-08-12T14:35:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/10/6b/6046773901f1944b9a89436351529811ee958afc7b774563be9d74a6f0c3/charset_normalizer-3.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:0c8953d9d1617794cfc40d81179571c9ba3805dd029623a15c93f1fb70e60a74", size = 198959, upload-time = "2026-08-12T14:35:05.187Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/b57708ac92aefc8e8389d51d5178129b81f03196da61ee2c23e687b8178a/charset_normalizer-3.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:562d24ca7797c1af8852994950c2e623a907b201fc4b0ed29e92af173d3828ca", size = 267055, upload-time = "2026-08-12T14:35:06.533Z" }, + { url = "https://files.pythonhosted.org/packages/22/c7/754d09943a616937df61e4ba367c409ded2a987e872972098d51a6fcf73b/charset_normalizer-3.5.0-py3-none-any.whl", hash = "sha256:993dfcbe75a85a3784abb5084f2c41b915767c90546fcc92803cffa28611baea", size = 67943, upload-time = "2026-08-12T14:35:30.363Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dateparser" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "regex" }, + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/6a/9f06999c4f27e9192c5eb38bfffadc2e6752df8178e97e88b10b9eb4c682/dateparser-1.4.2.tar.gz", hash = "sha256:bed2a3fd9bad8f2fb2d72b57748bada260b3a9349a264c22ffc23c3249d7049a", size = 338363, upload-time = "2026-08-04T12:11:03.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/1b/349e07ad184d64e81109e85a3557d7e05631fa3d05344169114ba743c4d3/dateparser-1.4.2-py3-none-any.whl", hash = "sha256:752f3d49d477cf7f60a7a9c8bcb19c882496ede0e377d5a3d80014cdfeca7050", size = 316546, upload-time = "2026-08-04T12:11:01.396Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + +[[package]] +name = "exchange-calendars" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "korean-lunar-calendar" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyluach" }, + { name = "toolz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/62/aa770a9307508d2a2a2c62d536a49347bffe9e55322db27838d3c93d0b07/imageio-2.37.4.tar.gz", hash = "sha256:e45cbc5e83502047fb138f7f585f7f105a136a57eea5f4b3cfc6ce1b52720bd3", size = 390173, upload-time = "2026-07-20T05:26:11.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/2d/ca050652104bab2cf55e569db2a178b1b61cb041fef28307f2db383f6d9f/imageio-2.37.4-py3-none-any.whl", hash = "sha256:1ab2e22c8debf700f24c3ac43e8f95f3b3a8110c83b93411e97b4b0b2cd1c7e6", size = 318000, upload-time = "2026-07-20T05:26:09.874Z" }, +] + +[[package]] +name = "ipython" +version = "9.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "psutil", marker = "sys_platform != 'cygwin' and sys_platform != 'emscripten'" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/96/b150fe7e25a5a29ae9ac1374e71488639605d39a1ea4abb74c9ce33af235/ipython-9.16.1.tar.gz", hash = "sha256:5a3d1f9a47ff216d6cf9cf863124f6a2c1a198d1354c546a4d24a370a283b64c", size = 4515302, upload-time = "2026-08-03T08:36:15.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8e/1239df488393d61076653bfb29f759d0f60cab8e030abdf7c17c31539b51/ipython-9.16.1-py3-none-any.whl", hash = "sha256:4acae635506f6d352d94c4899a19d5f85f8bc4d230932342dca556fdab1c69b4", size = 625974, upload-time = "2026-08-03T08:36:13.654Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + +[[package]] +name = "korean-lunar-calendar" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/9f/6160e95f3934026194dc7a0b5c78fe5c6e74761830ddea3e9cfc38e3f983/korean_lunar_calendar-0.4.0.tar.gz", hash = "sha256:be56f27bc0594fdbbdf7bbe00f504a9f929a31e311bd7d9bb93561b645afade7", size = 13425, upload-time = "2026-06-15T14:19:57.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/88/f56033b09fdca5c8c5e5fc2f3513950a05cd62caa9bd8e6d2750a887c86e/korean_lunar_calendar-0.4.0-py3-none-any.whl", hash = "sha256:c042e20de0bb702add6bec8d0f6da1ea8d3b170838e63846f70420cf341fe4e7", size = 11323, upload-time = "2026-06-15T14:19:56.089Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.49.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/27/72ae94ea5c8f7349ec1c229d4cd058feb799cbd0833ad6d1b47c919b37b7/llvmlite-0.49.0.tar.gz", hash = "sha256:00f16db782f4a13c78c5804aedc434e46794a77e89999a168f9401106270e50a", size = 194467, upload-time = "2026-08-11T16:26:00.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ae/3f699ebe3590e15e023a6372dd147526fd8ec398aacf9ceb844e854964a8/llvmlite-0.49.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b541c8fac3450db7574d1f53cf9dff83f285bfed9d69bf81fe71fc2a7d4f97fe", size = 40479231, upload-time = "2026-08-11T16:23:56.773Z" }, + { url = "https://files.pythonhosted.org/packages/be/3c/e97f69c62a2d972066d9a2612ce1f3de313035ac897a5b9f787cad8b55f7/llvmlite-0.49.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6acba646d88abbc87d5c113a3d62c1fbf8b8fee11c6493f516803e30f21ae870", size = 59890658, upload-time = "2026-08-11T16:24:05.451Z" }, + { url = "https://files.pythonhosted.org/packages/69/e6/e942ee08605fc0526ff3854260c384d8315a5830e16c4c2a5aebc14dc9bf/llvmlite-0.49.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ec8ad805e7515cb8440a690eb3cef4d34acb29eef80b705ec4e1c1ad3c43c68", size = 58344481, upload-time = "2026-08-11T16:24:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/49/2a44871cac6b5a2fd4aabd68cfdaf6de9a5c7edb36dee5d47b77bda4b50f/llvmlite-0.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a9c9e3af4e214acfefa4f73ebe7bc3fb35854a62b654edb3953f5ae33c08ba3", size = 41865543, upload-time = "2026-08-11T16:24:20.41Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/64/f9a391af28f518b11ad45a8a712353c94a0aefce09d3703200e5c54b610a/matplotlib-3.11.1.tar.gz", hash = "sha256:69647db5746941c793d6e445a4cd349323ffb87d9cc958c2ad84a659b4832d30", size = 32612045, upload-time = "2026-07-18T03:39:46.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/6c/7ef7ebcb2bd9739b2b66b18b076e077f44bb46fdbe28ca0506edb3c62c79/matplotlib-3.11.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e15ef41507f3d525f46154ac9e3ae785dacde9f20e593a25de8986267892ef74", size = 9453849, upload-time = "2026-07-18T03:38:19.593Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/6d0c312c8d9738e7d9677f09fe5c986b3239e651a7b73a2deb38b65e4a71/matplotlib-3.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:21a67b961a6d597bca54fae826cd20695ba4a6e4d05424a08da6e13e3176fd6b", size = 9283113, upload-time = "2026-07-18T03:38:21.95Z" }, + { url = "https://files.pythonhosted.org/packages/c9/cf/b4ad2cc81b6672ea29ea04e64e350a9f9b493b0908ccd884c67eeff8f7b2/matplotlib-3.11.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba8f811b8ddfac493734d6af0b2dff96919d0c28ca0d641858dab4262777c6ea", size = 10035615, upload-time = "2026-07-18T03:38:24.315Z" }, + { url = "https://files.pythonhosted.org/packages/88/90/4e10e033d9b66589d8ed98b84c95cdbb57033d57c1f41339d7393dbd2f2e/matplotlib-3.11.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c52f7ad20ef476806ed212380b1d54d20310c8b86bdc2c9a68b51f0024a44472", size = 10842559, upload-time = "2026-07-18T03:38:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/88/eb/799612d0f8cd3e816a10fec59329fca52cd2353264df80378dfc541ae855/matplotlib-3.11.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b14eb22961fe865efb0e4ff167e333e428908b00115a8d800ccb65ee108e481", size = 10927532, upload-time = "2026-07-18T03:38:28.532Z" }, + { url = "https://files.pythonhosted.org/packages/88/89/56649bbaa2fd12e20f3be03dbcc135b0c8676d88bac17977599e3eb442a0/matplotlib-3.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:88a2a27dd9691ae448dfae4b26f59036be90c3c28757edd3553a29559d00859f", size = 9333886, upload-time = "2026-07-18T03:38:30.477Z" }, + { url = "https://files.pythonhosted.org/packages/c1/11/4d124efbbad677b7b7552f6f85a3bd432d4232f95400cea98fcd2ae36ef3/matplotlib-3.11.1-cp312-cp312-win_arm64.whl", hash = "sha256:480194afceca4df2f137c2721227d3cba67121fbf4397b69cee7f83714b0a58a", size = 9007545, upload-time = "2026-07-18T03:38:32.833Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "ml4t-backtest" +source = { editable = "../../../" } +dependencies = [ + { name = "ml4t-specs" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pandas-market-calendars" }, + { name = "polars" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=1.9.0" }, + { name = "cvxpy", marker = "extra == 'advanced'", specifier = ">=1.3.0" }, + { name = "cvxpy", marker = "extra == 'all'", specifier = ">=1.3.0" }, + { name = "dash", marker = "extra == 'all'", specifier = ">=2.11.0" }, + { name = "dash", marker = "extra == 'viz'", specifier = ">=2.11.0" }, + { name = "hypothesis", marker = "extra == 'all'", specifier = ">=6.80.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.80.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.7.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.7.0" }, + { name = "mkdocs", marker = "extra == 'all'", specifier = ">=1.6,<2" }, + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6,<2" }, + { name = "mkdocs-material", marker = "extra == 'all'", specifier = ">=9.5.0" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, + { name = "ml4t-diagnostic", marker = "extra == 'all'", specifier = ">=0.1.0b4" }, + { name = "ml4t-diagnostic", marker = "extra == 'dev'", specifier = ">=0.1.0b4" }, + { name = "ml4t-specs", specifier = ">=0.1.2,<0.2" }, + { name = "networkx", marker = "extra == 'advanced'", specifier = ">=3.0" }, + { name = "networkx", marker = "extra == 'all'", specifier = ">=3.0" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, + { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, + { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, + { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, + { name = "polars", specifier = ">=1.36.1" }, + { name = "pre-commit", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyfolio-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.9.9" }, + { name = "pytest", marker = "extra == 'all'", specifier = ">=7.4.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", marker = "extra == 'all'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-benchmark", marker = "extra == 'all'", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'all'", specifier = ">=4.1.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "pytest-timeout", marker = "extra == 'all'", specifier = ">=2.1.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.1.0" }, + { name = "pytest-xdist", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "ruff", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, + { name = "ty", marker = "extra == 'all'" }, + { name = "ty", marker = "extra == 'dev'" }, + { name = "vectorbt", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.24.0" }, + { name = "zipline-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=2.4.0" }, +] +provides-extras = ["advanced", "all", "comparison", "dev", "docs", "viz"] + +[package.metadata.requires-dev] +dev = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "ml4t-diagnostic", specifier = ">=0.1.0b4" }, + { name = "pre-commit", specifier = ">=3.3.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, + { name = "ruff", specifier = ">=0.8.0" }, + { name = "twine", specifier = ">=6.0.0" }, + { name = "ty" }, +] +test = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, +] + +[[package]] +name = "ml4t-backtest-validation-vectorbt-oss" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "ml4t-backtest" }, + { name = "vectorbt" }, +] + +[package.metadata] +requires-dist = [ + { name = "ml4t-backtest", editable = "../../../" }, + { name = "vectorbt", specifier = "==1.1.0" }, +] + +[[package]] +name = "ml4t-specs" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/ca/aba7ea1f4e9a1da0b4f465dea03d3e4320d63db348245a2a9976096407ac/ml4t_specs-0.1.3.tar.gz", hash = "sha256:9578038af96d59cd50317e78f8781772833b308076da13ad24c0b304bb20961d", size = 50758, upload-time = "2026-08-12T02:27:14.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6c/0a35ee16313441a68a14d811ffa8b79eb63a013d548b6bbb50dfd208c6b1/ml4t_specs-0.1.3-py3-none-any.whl", hash = "sha256:2b9302d27746f5859b62c6748bf217ca4eae76d4842c783575c58f4880d1568f", size = 33860, upload-time = "2026-08-12T02:27:12.929Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "narwhals" +version = "2.24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/1d/58946e5aab18393e793bd4add6985b95d0e01c3a2d832f38f54468b10dcd/narwhals-2.24.0.tar.gz", hash = "sha256:b5c0f684ccd9d7475b564111e319a4964abcf2baf79d3cf6b1003d06ac9b828d", size = 661143, upload-time = "2026-07-13T10:49:19.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/85/a5bfaebfd305ac18b57b0854d74e37e586809061a91fda62f0bd50c8518e/narwhals-2.24.0-py3-none-any.whl", hash = "sha256:42fdedf44e5b2ca7505630d45b4ac3058f38d8485cba9fe1652ca23152df7489", size = 461030, upload-time = "2026-07-13T10:49:17.571Z" }, +] + +[[package]] +name = "numba" +version = "0.67.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/90/2544f4e3a61e501d6c9a5418fd4b905323222693d54a02cab0106a0af865/numba-0.67.0.tar.gz", hash = "sha256:cd75aa535b33fa05d9d930b1ae8af9f97a2881e96d72dfb38ec9b78284d9f851", size = 2836515, upload-time = "2026-08-11T23:04:00.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/58/915cddba90010348ed0444451132fdde9b000bcbaff1582029b5bf115d11/numba-0.67.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6004d8d5f28d4028687fb2d972d629295b13685943bd2ed5cd8810c3b848e219", size = 2745050, upload-time = "2026-08-11T23:03:25.607Z" }, + { url = "https://files.pythonhosted.org/packages/bb/38/926757caaac18a66f057d7544a63620bf360a07d281c9f7ecadd2aa83963/numba-0.67.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f63d43db06b4756424d6d2484737c902e0ae944a0eec3e8b0b4de2c695b15caa", size = 3884596, upload-time = "2026-08-11T23:03:27.688Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6d/58291dc58da39d98b32db7f044729f6d8d4920cd9622fbab3179b54ff4c4/numba-0.67.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76d3335aaeffb9dc88309420890e73497a00be08a7530441bc2b58ffe025bfa5", size = 3585290, upload-time = "2026-08-11T23:03:29.684Z" }, + { url = "https://files.pythonhosted.org/packages/6e/63/ab21828b4056afed71f9ecb40f4de26c2c19de731cc001961aca74b79464/numba-0.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:50e2b72406c18cda5dd7431b0082cb85ea94e06c64c33607248fc8bef92cfb81", size = 2815645, upload-time = "2026-08-11T23:03:31.732Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" }, + { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" }, + { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9a/ffbd852d58bd74a617fe2f8ee6a58a96982271ce41cf981eab22190b4a4b/pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce", size = 7197652, upload-time = "2026-07-22T22:18:22.502Z" }, + { url = "https://files.pythonhosted.org/packages/70/b5/d2d3e9ae73362ba4229651b0ee1455cf78073a1ce585f6ff693782ce263e/pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41", size = 9831691, upload-time = "2026-07-22T22:18:24.534Z" }, + { url = "https://files.pythonhosted.org/packages/52/51/dea1e89d6a6796b9c43f85a09b484ee03edb8a4c4842e73e200a8c11301c/pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49", size = 9105796, upload-time = "2026-07-22T22:18:27.064Z" }, +] + +[[package]] +name = "pandas-market-calendars" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exchange-calendars" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, +] + +[[package]] +name = "plotly" +version = "6.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/96/07/795c79dbce40c39bece88e69d049babbd23ffa95b5d117f248db8ea03abb/plotly-6.9.0.tar.gz", hash = "sha256:967ad33e8c704fed051800d11d985eb206a9c795c14206b30a6f463ed9c67d0d", size = 6919903, upload-time = "2026-07-09T14:55:59.982Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/18/d8544811ab076f876c4892b3714f5b0dad335e1dc33aef826df431b8325d/plotly-6.9.0-py3-none-any.whl", hash = "sha256:36bebe2f1bb13884774fe61689c329071446f6ce4a8927fb1f0d6fb24f581236", size = 9909646, upload-time = "2026-07-09T14:55:55.421Z" }, +] + +[[package]] +name = "polars" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" }, + { url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" }, + { url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" }, + { url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.53" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/ea/39b988c938f75cb75d7045b5c69f8bfed47ee2152c8837fb403de29d6fb8/prompt_toolkit-3.0.53.tar.gz", hash = "sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6", size = 435492, upload-time = "2026-07-26T20:56:14.758Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/6f/84908cad2d6aa5144abcf7b42709fe4fdb459bc640ec7ac5786e7693dabc/prompt_toolkit-3.0.53-py3-none-any.whl", hash = "sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2", size = 392288, upload-time = "2026-07-26T20:56:12.512Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "psygnal" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/79/20c3e23e75272e9ddf018097cf872ab088bccba978888472656629efa4a3/psygnal-0.15.1.tar.gz", hash = "sha256:f64f62dee2306fc1c22050a59b6c6cdad126e04b0cf50e393ff858a1da719096", size = 123147, upload-time = "2026-01-04T16:38:41.959Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/65/b7bbca96bc477aa9ac2264e5907b2f4ccfcd1319f776dd1f35eec06cc2f4/psygnal-0.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d56f0f35eaf4a21f660de76885222faf9e8c7112454528d3394d464f3d4d1a3", size = 598340, upload-time = "2026-01-04T16:38:19.752Z" }, + { url = "https://files.pythonhosted.org/packages/40/f2/56577465a1b42a5e6780bb5fab53fb68f8bfd72f0131ed397576529af724/psygnal-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0febcf757a1323d9b8bd75735ee3569213d8110012a7bf0f478e85c5ab459fc6", size = 575311, upload-time = "2026-01-04T16:38:21.137Z" }, + { url = "https://files.pythonhosted.org/packages/79/81/f642ac08104049383076f83480ed412c9626e068769a1c34873c595bec0e/psygnal-0.15.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b5e4837dfbfa4974dabe0795e32be9aadcd87603adf734738ce1114f72238a05", size = 889770, upload-time = "2026-01-04T16:38:22.629Z" }, + { url = "https://files.pythonhosted.org/packages/de/43/e571fa40b72780abed080ef829e5ad98017b6fe48d28c15a2404e006b676/psygnal-0.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07b4c4e03bbf4e8cad7e25f4fbc1ba9575fb9c3d14991bc7edfeb8b09c8d6d54", size = 881105, upload-time = "2026-01-04T16:38:23.896Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/ef3ab825eb08eaecbbceeeb56383694fe64ce399dbfd1d0767bb85688785/psygnal-0.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:4f0ce91b9c18e92281bf2c3fc4bb4e808d90f0b023d0a37b302d354188520338", size = 418969, upload-time = "2026-01-04T16:38:25.731Z" }, + { url = "https://files.pythonhosted.org/packages/46/49/7742544684bee728ec123515d2694cee859aa2a705951a461230b00f18cc/psygnal-0.15.1-py3-none-any.whl", hash = "sha256:4221140e633e45b076953c64bcb9b41a744833527f9a037c1ca98bc270798cbf", size = 90638, upload-time = "2026-01-04T16:38:40.841Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyluach" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/11/42568c1568a75f8803c59f26d29af01a0890352b7a8e03d41ecda8bfb5dd/pyluach-2.3.0.tar.gz", hash = "sha256:ec6e30669d1df50c9ca160486da44a8195bb4c7a5d3d533990d0c5b03accd281", size = 26910, upload-time = "2025-09-09T20:24:39.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c8/f96208ade3ca4c23b372497d0788bcf0f2e0ff4310e5ee693366bc33fdf0/pyluach-2.3.0-py3-none-any.whl", hash = "sha256:4497b731aef59508b079dbf5f00bc5bf4329ac45090a6cd37b5a83756f0e69ab", size = 25914, upload-time = "2025-09-09T20:24:37.831Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.3.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "schedule" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/91/b525790063015759f34447d4cf9d2ccb52cdee0f1dd6ff8764e863bcb74c/schedule-1.2.2.tar.gz", hash = "sha256:15fe9c75fe5fd9b9627f3f19cc0ef1420508f9f9a46f45cd0769ef75ede5f0b7", size = 26452, upload-time = "2024-06-18T20:03:14.633Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/a7/84c96b61fd13205f2cafbe263cdb2745965974bdf3e0078f121dfeca5f02/schedule-1.2.2-py3-none-any.whl", hash = "sha256:5bef4a2a0183abf44046ae0d164cadcac21b1db011bdd8102e4a0c1e91e06a7d", size = 12220, upload-time = "2024-05-25T18:41:59.121Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "narwhals" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac", size = 8741122, upload-time = "2026-06-02T11:53:24.08Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/83/a4/c8e67227c680e2259c8864ae72ff48b06e16a6f51253a22167aa02a8aa4e/scikit_learn-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4306775fad04cc4b472a1b15af1ae9cede1540fbfcc17fbce3767cd8dc7ae283", size = 8211173, upload-time = "2026-06-02T11:53:36.602Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fd/3c0863792e98e67e9184aa4029288a175935eb65443afcd30d4f143450cf/scikit_learn-1.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:26e22435f63bcdcf396b574273f29f13dd531f5ea035801f5be10ba1540a4e60", size = 7867451, upload-time = "2026-06-02T11:53:39.075Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a", size = 31056519, upload-time = "2026-06-19T14:59:45.203Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1e6442a00cd2924d361aa1b642ab6373ec35c6fabf311a760be9f76e0f13/scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b", size = 28681889, upload-time = "2026-06-19T14:59:48.103Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2d/11dd93d21e147a73ba22bd75c0b9208d3a2e0ec76d53170ce7d9029b1015/scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9", size = 20423580, upload-time = "2026-06-19T14:59:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/93552f75e0d2a7dd115a45e59209c51e8d514daff02fc887d2623be06fe1/scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8", size = 23054441, upload-time = "2026-06-19T14:59:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/21f5e703643d66f21faa6b4c73195bfcad70c55efcb4f1ab327cd7c4101a/scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab", size = 33968720, upload-time = "2026-06-19T14:59:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2", size = 35287115, upload-time = "2026-06-19T14:59:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ff/eec46be7e9234208f801062b53e1983085eddebd693f6c9bfb03b459830d/scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11", size = 35577989, upload-time = "2026-06-19T15:00:02.235Z" }, + { url = "https://files.pythonhosted.org/packages/84/ca/210d4759c7210bb7d269437421959b39a33434e2776b60c5cb8a763bb30a/scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de", size = 37421717, upload-time = "2026-06-19T15:00:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/9a9edb45345bd6744da5ddfb6628e5d5185920494c6a67ec45b6381004cb/scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132", size = 36597428, upload-time = "2026-06-19T15:00:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/99/0e/33f32a2a58987e26aec0f7df252cbbad1e90ae77bdbc76f40dd4ed0cf0ea/scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76", size = 24351481, upload-time = "2026-06-19T15:00:11.103Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953", size = 80184, upload-time = "2026-07-27T11:33:13.167Z" }, +] + +[[package]] +name = "traitlets" +version = "5.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/2e/a7fbfe268c8a3b32546930c0297c101d65a4a14c304ad5790a9f478f0e4e/traitlets-5.16.1.tar.gz", hash = "sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1", size = 166137, upload-time = "2026-08-03T08:32:36.848Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/66/0d785f0bc5e4315a96c989bb476d0fc07ea4f85132550c7b156ca2035d52/traitlets-5.16.1-py3-none-any.whl", hash = "sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b", size = 86211, upload-time = "2026-08-03T08:32:34.48Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170, upload-time = "2026-06-29T08:03:40.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115, upload-time = "2026-06-29T08:03:38.666Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "vectorbt" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anywidget" }, + { name = "dateparser" }, + { name = "dill" }, + { name = "imageio" }, + { name = "ipywidgets" }, + { name = "matplotlib" }, + { name = "mypy-extensions" }, + { name = "numba" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "plotly" }, + { name = "pytz" }, + { name = "requests" }, + { name = "schedule" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/3f/45e6620b63cf0c7ce7728b387eb2ab1d81e280afd31efb669880fdfa7950/vectorbt-1.1.0.tar.gz", hash = "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", size = 551935, upload-time = "2026-07-05T17:21:10.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/45/0e74e23845d5f1d48f33fca84ec7f01add3caad6d91af473cc8bcf946ca1/vectorbt-1.1.0-py3-none-any.whl", hash = "sha256:7fa055ccdb16a266b349e7b322410525c2923b119e13ac292b99bc4a9a5b2885", size = 455305, upload-time = "2026-07-05T17:21:08.372Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] diff --git a/validation/environments/vectorbt_pro/pyproject.toml b/validation/environments/vectorbt_pro/pyproject.toml new file mode 100644 index 00000000..a546f1de --- /dev/null +++ b/validation/environments/vectorbt_pro/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "ml4t-backtest-validation-vectorbt-pro" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "ml4t-backtest", + "vectorbtpro @ git+ssh://git@github.com/polakowo/vectorbt.pro.git@6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", +] + +[tool.uv] +package = false + +[tool.uv.sources] +ml4t-backtest = { path = "../../..", editable = true } diff --git a/validation/environments/vectorbt_pro/uv.lock b/validation/environments/vectorbt_pro/uv.lock new file mode 100644 index 00000000..0d0e0671 --- /dev/null +++ b/validation/environments/vectorbt_pro/uv.lock @@ -0,0 +1,743 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "sys_platform == 'win32'", + "sys_platform == 'emscripten'", + "sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/31/4971872b3ed8715346231fb6eb4da8fcba65a4143c189db151ee28a2812b/charset_normalizer-3.5.0.tar.gz", hash = "sha256:49bd5feb59b0bf3cbf6ebcf4352e371c95b9da9bacd4449f8b64d0ad2c10a26e", size = 169295, upload-time = "2026-08-12T14:35:31.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/3c/045ea64ea5a550870dd8ab60b2242870328d53f17d2be593b4f9f3121474/charset_normalizer-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:98820e1ceb25c6df7a80c4fd8efa59cb121f99bc7c4c1693ad94a2caff5b311d", size = 343861, upload-time = "2026-08-12T14:32:27.254Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/7502be709db899d5b4801509829188b3a5a10969411da9c846115a5f1b70/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:608553f476fca509537e804c4a71f5eb166ce63b75141f89c2c686ce1aa36956", size = 237550, upload-time = "2026-08-12T14:32:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ce/66392661375148d9455c17bee25509a54e28c39969e34befa48ec8777936/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6753de11eef42f1c321b26d682957d92c7f7bbce6530f34bbe0f9291dd37cc6f", size = 229673, upload-time = "2026-08-12T14:32:29.668Z" }, + { url = "https://files.pythonhosted.org/packages/6a/64/f58c32a8d4ecf55b82ee61ee9aa6a664d4afcd36c72feb4c926fd6fe9af8/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f76dc0a47f94cb9b69d86f01e477f4b0371ca70208b9ccea7e063c41eed9046", size = 260768, upload-time = "2026-08-12T14:32:30.891Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ea/36c90e59a96386174377e855479ec154221ef001e96637e0b23be92489c4/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c387c6bf91b4774e359a48a179e2872b8e8bf741e4fde06ba8d1665eb9a4760a", size = 257880, upload-time = "2026-08-12T14:32:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/23/35/5b85772eb82528ef22ba29487ad544a7049dfd27f35b1a5a55dbc0843048/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14f6904a3cf870abf044df3a8c4924ac6c8ef77e9896586fd37e73ae96cff2af", size = 247547, upload-time = "2026-08-12T14:32:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/b6/14/ba11a99c2a22ab04c2d5383a700b378cb463a78ab15f36444cabc10cd671/charset_normalizer-3.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cce46dd29d73e135e8087b96eb62a4aca6d69391b7f97808c6588ebed3178f3", size = 243326, upload-time = "2026-08-12T14:32:34.794Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4a/cadba3f2400b45aa1d62a4ae0298bf58a3b30b1158baf15c338c7ce5b601/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b476cdb63df22da2b91837593380be3ddbe406f36c506c1c91d80e7196b66288", size = 238820, upload-time = "2026-08-12T14:32:35.984Z" }, + { url = "https://files.pythonhosted.org/packages/47/41/d5188b9342d75b72c2b05d3ee373f01a691397e770f001ee05e3b37925f5/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1f56ce84b317ef2a59d7d3461891c7597c79247d2192bb8114c68a1a1debfcc0", size = 231661, upload-time = "2026-08-12T14:32:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/13/5f/df38fa972c4e945c3d8cee2bc4e610613af522fd359c7dc7a74c419f0278/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ce0f885239357379d92fd9a5fddbe20f0e30e0527c29ba69f8e99eeb1304a76", size = 261459, upload-time = "2026-08-12T14:32:38.369Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d7/043ff7720067a3beee05523465ac9c1c846c68b7884930dd483f72ee5ab6/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:96ae7ab5d8155fde927aa0864fbc8ba3cc4fde6d41ab0c7cea9d6012b4978603", size = 242300, upload-time = "2026-08-12T14:32:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/33980b7b802a048e546a6d9ad2ea783a6cf6b10a86aaccd10db462d8b913/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf91921009025e96ce57a03ced6d14604fc3baf0530351638e9504a55da6fa3b", size = 259101, upload-time = "2026-08-12T14:32:41.02Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b7/0d19bde844bff9165377c1da9ef3c4792a4c24bd49b5b7094d9e6f6ab58b/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0b2e44e6d42d1a4ff78ccc219a93c5449105d10b16198d1aea581080df8073f9", size = 249246, upload-time = "2026-08-12T14:32:42.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/2c34fdfaacdf0e96e880ef562cbf80a9b5f8ea97e0dd9e57ba348a9c65cf/charset_normalizer-3.5.0-cp312-cp312-win32.whl", hash = "sha256:deb99535e9bf0bea8e274c6413eb939a21be35a3f492678dba4d5b1f4d70f142", size = 178025, upload-time = "2026-08-12T14:32:43.909Z" }, + { url = "https://files.pythonhosted.org/packages/76/d0/c34dbd1df23bcbdc1b5d2f48256340d72fa747f1eb03924a9d2fa35ed85b/charset_normalizer-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54dd1a66fa4bce0ccaf0db9dde336e49b3eec646dc4c1c0991279369d373a14", size = 200143, upload-time = "2026-08-12T14:32:45.254Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/4e6bf1465d60c3d8f488d5bde140d0cb91cd23ccab0dc2895cc6c6982047/charset_normalizer-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:b8ea208b304587d47931b36481342d20336e0d338ab052f8b4305926482598d6", size = 180046, upload-time = "2026-08-12T14:32:46.545Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f3/7b523d807cb5e73562ef8acf21d39cdb9d704955327362c781bc3478a73d/charset_normalizer-3.5.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a4ee37248dfac25107c758bda99d545ce73e60b44d2dd39e4a2bb9f2831e9f5", size = 330840, upload-time = "2026-08-12T14:34:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/f0/de/fc68978fe78ca97063c96d764e41ff92ca639948f319271e0ff450e577a2/charset_normalizer-3.5.0-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a864bdcacd8bff58bb4845304e031f821a3ec64b2b7259f2d409cd49c9e59ca3", size = 251862, upload-time = "2026-08-12T14:34:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/a9/cb/82b41a0ab7fb1a88065f1d78ad32696ad88ea3fe8e25b8189d08833938de/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84b736e3b391601bc47b86da381c749c0f894e9191aaca9f31f30c2632206df3", size = 239484, upload-time = "2026-08-12T14:34:47.869Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0c/19608b631f4538f908098d4a2d56a8f79a665e27cc58e9d90479761a9227/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6abb1f356fb865baeb6ebc3fadd843e9a96fbf49b9adcca55037f3cceccb7438", size = 230602, upload-time = "2026-08-12T14:34:49.265Z" }, + { url = "https://files.pythonhosted.org/packages/29/db/f648eb30e14eba301aed61e11672156f137905c1bdbb530151abe8065943/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d366548d2ee28a8cfdcc4296363978cc644a728333be9824d2de4652e83df0a", size = 259208, upload-time = "2026-08-12T14:34:50.632Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e0/ed2c8bdbac484d69614d6993143aeb6cb0f4dd1561c883402517b623c8ef/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d672f329ae504ee240eb39b6effb3318aa8e7e8924c0ce8eee5760b3fad98539", size = 253659, upload-time = "2026-08-12T14:34:52.11Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/b4907cb9ec5b521d9d024ced13611240b86ef065c2eb15b3ad2334dc9940/charset_normalizer-3.5.0-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54036a518748b6c02e666f6d46c3817561998fb904c3be25b56fb4fe3dc5706", size = 248821, upload-time = "2026-08-12T14:34:53.399Z" }, + { url = "https://files.pythonhosted.org/packages/12/b2/e2d1abcfbc05822f0030869efb4e9f8a3658e13b4821796d4b62da917327/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:22a1889f1c9b752c63c36758a0c2145458e3cadb20fced7a0790002e9dd12b26", size = 240271, upload-time = "2026-08-12T14:34:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f9/4ba127ad610542fa3eabfa41c45bf12d357860a815b3566374ec0188e213/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b7eb3eab5c646d3de7dcb14a7c9caebace5249c5767da39e1761cb1576e521a3", size = 232155, upload-time = "2026-08-12T14:34:56.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/68/40613182366d00bd6dbd5f6c84a926cbd120960e038a8269e9ae7d782762/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2080aa129a28267984cdc902898993d788c995c384e285d0d19199f56760d52e", size = 259674, upload-time = "2026-08-12T14:34:57.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/53/4574a14fa4c9de4a6c9f31725354bfa40b67f653e6d594ce1654f9a41b32/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:fd68c825548a611158230e2f9222e210ceb2e3391995c0aa5865cbdf3ab4bd49", size = 246122, upload-time = "2026-08-12T14:34:59.337Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/bd8030d13d92c058ca7b2b9615bbb3169569e144db64d65c149cd45abf5e/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:d8a9316f4da85e937242642b537c6d55d7e9287dd38e5634732f8233932aff45", size = 255221, upload-time = "2026-08-12T14:35:00.71Z" }, + { url = "https://files.pythonhosted.org/packages/77/9d/10ecd3bcbe2666b3d4d4026c97b48f73990682815db516052a1e8f4a31c5/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d90254c8f609338c53ec180fcd4c4f9c16502e238e3fc88ca7fd4c2f38d445b8", size = 253450, upload-time = "2026-08-12T14:35:02.217Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/d044c4872c0938a84f87b5027a698c0e61bacfc5c3551a4e749ca9b7bc5c/charset_normalizer-3.5.0-cp37-abi3-win32.whl", hash = "sha256:8b3e9e29b8b07cc461b9ce7768db7693a93979d0dadf22046f6f3555ded2f516", size = 173594, upload-time = "2026-08-12T14:35:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/10/6b/6046773901f1944b9a89436351529811ee958afc7b774563be9d74a6f0c3/charset_normalizer-3.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:0c8953d9d1617794cfc40d81179571c9ba3805dd029623a15c93f1fb70e60a74", size = 198959, upload-time = "2026-08-12T14:35:05.187Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/b57708ac92aefc8e8389d51d5178129b81f03196da61ee2c23e687b8178a/charset_normalizer-3.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:562d24ca7797c1af8852994950c2e623a907b201fc4b0ed29e92af173d3828ca", size = 267055, upload-time = "2026-08-12T14:35:06.533Z" }, + { url = "https://files.pythonhosted.org/packages/22/c7/754d09943a616937df61e4ba367c409ded2a987e872972098d51a6fcf73b/charset_normalizer-3.5.0-py3-none-any.whl", hash = "sha256:993dfcbe75a85a3784abb5084f2c41b915767c90546fcc92803cffa28611baea", size = 67943, upload-time = "2026-08-12T14:35:30.363Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "dateparser" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "regex" }, + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/6a/9f06999c4f27e9192c5eb38bfffadc2e6752df8178e97e88b10b9eb4c682/dateparser-1.4.2.tar.gz", hash = "sha256:bed2a3fd9bad8f2fb2d72b57748bada260b3a9349a264c22ffc23c3249d7049a", size = 338363, upload-time = "2026-08-04T12:11:03.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/1b/349e07ad184d64e81109e85a3557d7e05631fa3d05344169114ba743c4d3/dateparser-1.4.2-py3-none-any.whl", hash = "sha256:752f3d49d477cf7f60a7a9c8bcb19c882496ede0e377d5a3d80014cdfeca7050", size = 316546, upload-time = "2026-08-04T12:11:01.396Z" }, +] + +[[package]] +name = "exchange-calendars" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "korean-lunar-calendar" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyluach" }, + { name = "toolz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, +] + +[[package]] +name = "humanize" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/ea/13a1ef3c12d12662905801495283530251918b70d62d368f1d2e0272c70d/humanize-4.16.0.tar.gz", hash = "sha256:7dc2244a2f84a4bfb1d36c37bac80cd78e35cdc5c119206d87b018e1445f3a3f", size = 89515, upload-time = "2026-06-30T16:17:29.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/aa/0b7365d30fed43e7a3449aba1fe20a0a7174d9cf13e282af4e69ac825441/humanize-4.16.0-py3-none-any.whl", hash = "sha256:353eb2f34c09d098b2880eee8bef21832eae6d174f48c5762fff7e5fcb74d01d", size = 137209, upload-time = "2026-06-30T16:17:28.36Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/62/aa770a9307508d2a2a2c62d536a49347bffe9e55322db27838d3c93d0b07/imageio-2.37.4.tar.gz", hash = "sha256:e45cbc5e83502047fb138f7f585f7f105a136a57eea5f4b3cfc6ce1b52720bd3", size = 390173, upload-time = "2026-07-20T05:26:11.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/2d/ca050652104bab2cf55e569db2a178b1b61cb041fef28307f2db383f6d9f/imageio-2.37.4-py3-none-any.whl", hash = "sha256:1ab2e22c8debf700f24c3ac43e8f95f3b3a8110c83b93411e97b4b0b2cd1c7e6", size = 318000, upload-time = "2026-07-20T05:26:09.874Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "korean-lunar-calendar" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/9f/6160e95f3934026194dc7a0b5c78fe5c6e74761830ddea3e9cfc38e3f983/korean_lunar_calendar-0.4.0.tar.gz", hash = "sha256:be56f27bc0594fdbbdf7bbe00f504a9f929a31e311bd7d9bb93561b645afade7", size = 13425, upload-time = "2026-06-15T14:19:57.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/88/f56033b09fdca5c8c5e5fc2f3513950a05cd62caa9bd8e6d2750a887c86e/korean_lunar_calendar-0.4.0-py3-none-any.whl", hash = "sha256:c042e20de0bb702add6bec8d0f6da1ea8d3b170838e63846f70420cf341fe4e7", size = 11323, upload-time = "2026-06-15T14:19:56.089Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.49.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/27/72ae94ea5c8f7349ec1c229d4cd058feb799cbd0833ad6d1b47c919b37b7/llvmlite-0.49.0.tar.gz", hash = "sha256:00f16db782f4a13c78c5804aedc434e46794a77e89999a168f9401106270e50a", size = 194467, upload-time = "2026-08-11T16:26:00.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ae/3f699ebe3590e15e023a6372dd147526fd8ec398aacf9ceb844e854964a8/llvmlite-0.49.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b541c8fac3450db7574d1f53cf9dff83f285bfed9d69bf81fe71fc2a7d4f97fe", size = 40479231, upload-time = "2026-08-11T16:23:56.773Z" }, + { url = "https://files.pythonhosted.org/packages/be/3c/e97f69c62a2d972066d9a2612ce1f3de313035ac897a5b9f787cad8b55f7/llvmlite-0.49.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6acba646d88abbc87d5c113a3d62c1fbf8b8fee11c6493f516803e30f21ae870", size = 59890658, upload-time = "2026-08-11T16:24:05.451Z" }, + { url = "https://files.pythonhosted.org/packages/69/e6/e942ee08605fc0526ff3854260c384d8315a5830e16c4c2a5aebc14dc9bf/llvmlite-0.49.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ec8ad805e7515cb8440a690eb3cef4d34acb29eef80b705ec4e1c1ad3c43c68", size = 58344481, upload-time = "2026-08-11T16:24:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/49/2a44871cac6b5a2fd4aabd68cfdaf6de9a5c7edb36dee5d47b77bda4b50f/llvmlite-0.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a9c9e3af4e214acfefa4f73ebe7bc3fb35854a62b654edb3953f5ae33c08ba3", size = 41865543, upload-time = "2026-08-11T16:24:20.41Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml4t-backtest" +source = { editable = "../../../" } +dependencies = [ + { name = "ml4t-specs" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pandas-market-calendars" }, + { name = "polars" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=1.9.0" }, + { name = "cvxpy", marker = "extra == 'advanced'", specifier = ">=1.3.0" }, + { name = "cvxpy", marker = "extra == 'all'", specifier = ">=1.3.0" }, + { name = "dash", marker = "extra == 'all'", specifier = ">=2.11.0" }, + { name = "dash", marker = "extra == 'viz'", specifier = ">=2.11.0" }, + { name = "hypothesis", marker = "extra == 'all'", specifier = ">=6.80.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.80.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.7.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.7.0" }, + { name = "mkdocs", marker = "extra == 'all'", specifier = ">=1.6,<2" }, + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6,<2" }, + { name = "mkdocs-material", marker = "extra == 'all'", specifier = ">=9.5.0" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, + { name = "ml4t-diagnostic", marker = "extra == 'all'", specifier = ">=0.1.0b4" }, + { name = "ml4t-diagnostic", marker = "extra == 'dev'", specifier = ">=0.1.0b4" }, + { name = "ml4t-specs", specifier = ">=0.1.2,<0.2" }, + { name = "networkx", marker = "extra == 'advanced'", specifier = ">=3.0" }, + { name = "networkx", marker = "extra == 'all'", specifier = ">=3.0" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, + { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, + { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, + { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, + { name = "polars", specifier = ">=1.36.1" }, + { name = "pre-commit", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyfolio-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.9.9" }, + { name = "pytest", marker = "extra == 'all'", specifier = ">=7.4.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", marker = "extra == 'all'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-benchmark", marker = "extra == 'all'", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'all'", specifier = ">=4.1.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "pytest-timeout", marker = "extra == 'all'", specifier = ">=2.1.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.1.0" }, + { name = "pytest-xdist", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "ruff", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, + { name = "ty", marker = "extra == 'all'" }, + { name = "ty", marker = "extra == 'dev'" }, + { name = "vectorbt", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.24.0" }, + { name = "zipline-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=2.4.0" }, +] +provides-extras = ["advanced", "all", "comparison", "dev", "docs", "viz"] + +[package.metadata.requires-dev] +dev = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "ml4t-diagnostic", specifier = ">=0.1.0b4" }, + { name = "pre-commit", specifier = ">=3.3.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, + { name = "ruff", specifier = ">=0.8.0" }, + { name = "twine", specifier = ">=6.0.0" }, + { name = "ty" }, +] +test = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, +] + +[[package]] +name = "ml4t-backtest-validation-vectorbt-pro" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "ml4t-backtest" }, + { name = "vectorbtpro" }, +] + +[package.metadata] +requires-dist = [ + { name = "ml4t-backtest", editable = "../../../" }, + { name = "vectorbtpro", git = "ssh://git@github.com/polakowo/vectorbt.pro.git?rev=6e18cf0aa37849cfc20848f40f1d26ecfdc771b4" }, +] + +[[package]] +name = "ml4t-specs" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/ca/aba7ea1f4e9a1da0b4f465dea03d3e4320d63db348245a2a9976096407ac/ml4t_specs-0.1.3.tar.gz", hash = "sha256:9578038af96d59cd50317e78f8781772833b308076da13ad24c0b304bb20961d", size = 50758, upload-time = "2026-08-12T02:27:14.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6c/0a35ee16313441a68a14d811ffa8b79eb63a013d548b6bbb50dfd208c6b1/ml4t_specs-0.1.3-py3-none-any.whl", hash = "sha256:2b9302d27746f5859b62c6748bf217ca4eae76d4842c783575c58f4880d1568f", size = 33860, upload-time = "2026-08-12T02:27:12.929Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "narwhals" +version = "2.24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/1d/58946e5aab18393e793bd4add6985b95d0e01c3a2d832f38f54468b10dcd/narwhals-2.24.0.tar.gz", hash = "sha256:b5c0f684ccd9d7475b564111e319a4964abcf2baf79d3cf6b1003d06ac9b828d", size = 661143, upload-time = "2026-07-13T10:49:19.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/85/a5bfaebfd305ac18b57b0854d74e37e586809061a91fda62f0bd50c8518e/narwhals-2.24.0-py3-none-any.whl", hash = "sha256:42fdedf44e5b2ca7505630d45b4ac3058f38d8485cba9fe1652ca23152df7489", size = 461030, upload-time = "2026-07-13T10:49:17.571Z" }, +] + +[[package]] +name = "numba" +version = "0.67.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/90/2544f4e3a61e501d6c9a5418fd4b905323222693d54a02cab0106a0af865/numba-0.67.0.tar.gz", hash = "sha256:cd75aa535b33fa05d9d930b1ae8af9f97a2881e96d72dfb38ec9b78284d9f851", size = 2836515, upload-time = "2026-08-11T23:04:00.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/58/915cddba90010348ed0444451132fdde9b000bcbaff1582029b5bf115d11/numba-0.67.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6004d8d5f28d4028687fb2d972d629295b13685943bd2ed5cd8810c3b848e219", size = 2745050, upload-time = "2026-08-11T23:03:25.607Z" }, + { url = "https://files.pythonhosted.org/packages/bb/38/926757caaac18a66f057d7544a63620bf360a07d281c9f7ecadd2aa83963/numba-0.67.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f63d43db06b4756424d6d2484737c902e0ae944a0eec3e8b0b4de2c695b15caa", size = 3884596, upload-time = "2026-08-11T23:03:27.688Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6d/58291dc58da39d98b32db7f044729f6d8d4920cd9622fbab3179b54ff4c4/numba-0.67.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76d3335aaeffb9dc88309420890e73497a00be08a7530441bc2b58ffe025bfa5", size = 3585290, upload-time = "2026-08-11T23:03:29.684Z" }, + { url = "https://files.pythonhosted.org/packages/6e/63/ab21828b4056afed71f9ecb40f4de26c2c19de731cc001961aca74b79464/numba-0.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:50e2b72406c18cda5dd7431b0082cb85ea94e06c64c33607248fc8bef92cfb81", size = 2815645, upload-time = "2026-08-11T23:03:31.732Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" }, + { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" }, + { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9a/ffbd852d58bd74a617fe2f8ee6a58a96982271ce41cf981eab22190b4a4b/pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce", size = 7197652, upload-time = "2026-07-22T22:18:22.502Z" }, + { url = "https://files.pythonhosted.org/packages/70/b5/d2d3e9ae73362ba4229651b0ee1455cf78073a1ce585f6ff693782ce263e/pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41", size = 9831691, upload-time = "2026-07-22T22:18:24.534Z" }, + { url = "https://files.pythonhosted.org/packages/52/51/dea1e89d6a6796b9c43f85a09b484ee03edb8a4c4842e73e200a8c11301c/pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49", size = 9105796, upload-time = "2026-07-22T22:18:27.064Z" }, +] + +[[package]] +name = "pandas-market-calendars" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exchange-calendars" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, +] + +[[package]] +name = "polars" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" }, + { url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" }, + { url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" }, + { url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyluach" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/11/42568c1568a75f8803c59f26d29af01a0890352b7a8e03d41ecda8bfb5dd/pyluach-2.3.0.tar.gz", hash = "sha256:ec6e30669d1df50c9ca160486da44a8195bb4c7a5d3d533990d0c5b03accd281", size = 26910, upload-time = "2025-09-09T20:24:39.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c8/f96208ade3ca4c23b372497d0788bcf0f2e0ff4310e5ee693366bc33fdf0/pyluach-2.3.0-py3-none-any.whl", hash = "sha256:4497b731aef59508b079dbf5f00bc5bf4329ac45090a6cd37b5a83756f0e69ab", size = 25914, upload-time = "2025-09-09T20:24:37.831Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.3.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "schedule" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/91/b525790063015759f34447d4cf9d2ccb52cdee0f1dd6ff8764e863bcb74c/schedule-1.2.2.tar.gz", hash = "sha256:15fe9c75fe5fd9b9627f3f19cc0ef1420508f9f9a46f45cd0769ef75ede5f0b7", size = 26452, upload-time = "2024-06-18T20:03:14.633Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/a7/84c96b61fd13205f2cafbe263cdb2745965974bdf3e0078f121dfeca5f02/schedule-1.2.2-py3-none-any.whl", hash = "sha256:5bef4a2a0183abf44046ae0d164cadcac21b1db011bdd8102e4a0c1e91e06a7d", size = 12220, upload-time = "2024-05-25T18:41:59.121Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "narwhals" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac", size = 8741122, upload-time = "2026-06-02T11:53:24.08Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/83/a4/c8e67227c680e2259c8864ae72ff48b06e16a6f51253a22167aa02a8aa4e/scikit_learn-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4306775fad04cc4b472a1b15af1ae9cede1540fbfcc17fbce3767cd8dc7ae283", size = 8211173, upload-time = "2026-06-02T11:53:36.602Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fd/3c0863792e98e67e9184aa4029288a175935eb65443afcd30d4f143450cf/scikit_learn-1.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:26e22435f63bcdcf396b574273f29f13dd531f5ea035801f5be10ba1540a4e60", size = 7867451, upload-time = "2026-06-02T11:53:39.075Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a", size = 31056519, upload-time = "2026-06-19T14:59:45.203Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1e6442a00cd2924d361aa1b642ab6373ec35c6fabf311a760be9f76e0f13/scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b", size = 28681889, upload-time = "2026-06-19T14:59:48.103Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2d/11dd93d21e147a73ba22bd75c0b9208d3a2e0ec76d53170ce7d9029b1015/scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9", size = 20423580, upload-time = "2026-06-19T14:59:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/93552f75e0d2a7dd115a45e59209c51e8d514daff02fc887d2623be06fe1/scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8", size = 23054441, upload-time = "2026-06-19T14:59:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/21f5e703643d66f21faa6b4c73195bfcad70c55efcb4f1ab327cd7c4101a/scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab", size = 33968720, upload-time = "2026-06-19T14:59:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2", size = 35287115, upload-time = "2026-06-19T14:59:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ff/eec46be7e9234208f801062b53e1983085eddebd693f6c9bfb03b459830d/scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11", size = 35577989, upload-time = "2026-06-19T15:00:02.235Z" }, + { url = "https://files.pythonhosted.org/packages/84/ca/210d4759c7210bb7d269437421959b39a33434e2776b60c5cb8a763bb30a/scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de", size = 37421717, upload-time = "2026-06-19T15:00:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/9a9edb45345bd6744da5ddfb6628e5d5185920494c6a67ec45b6381004cb/scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132", size = 36597428, upload-time = "2026-06-19T15:00:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/99/0e/33f32a2a58987e26aec0f7df252cbbad1e90ae77bdbc76f40dd4ed0cf0ea/scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76", size = 24351481, upload-time = "2026-06-19T15:00:11.103Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953", size = 80184, upload-time = "2026-07-27T11:33:13.167Z" }, +] + +[[package]] +name = "typer" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/40/4a3db7990d1f62a53182aa96eaef57aeb2886a27f90a195bc66713565d31/typer-0.27.1.tar.gz", hash = "sha256:a79bef8469a79c45498e7b814ecf8d603cc7644e9acbd9e19cac0334240b18df", size = 203994, upload-time = "2026-08-03T14:41:03.438Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/89/9518bc0c3929bee36b3a4a8e3daddd6e03f92f9961c66d4983b837160543/typer-0.27.1-py3-none-any.whl", hash = "sha256:53150287edd11baeb4e4722c8e394fcdf8181c0ae89485cba8d25c778d5edd56", size = 122874, upload-time = "2026-08-03T14:41:04.391Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170, upload-time = "2026-06-29T08:03:40.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115, upload-time = "2026-06-29T08:03:38.666Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "vectorbtpro" +version = "2026.6.27" +source = { git = "ssh://git@github.com/polakowo/vectorbt.pro.git?rev=6e18cf0aa37849cfc20848f40f1d26ecfdc771b4#6e18cf0aa37849cfc20848f40f1d26ecfdc771b4" } +dependencies = [ + { name = "attrs" }, + { name = "dateparser" }, + { name = "humanize" }, + { name = "imageio" }, + { name = "mypy-extensions" }, + { name = "numba" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "schedule" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "tqdm" }, + { name = "typer" }, + { name = "typing-extensions" }, + { name = "websocket-client" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] diff --git a/validation/environments/zipline/pyproject.toml b/validation/environments/zipline/pyproject.toml new file mode 100644 index 00000000..3a07e341 --- /dev/null +++ b/validation/environments/zipline/pyproject.toml @@ -0,0 +1,11 @@ +[project] +name = "ml4t-backtest-validation-zipline" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = ["ml4t-backtest", "zipline-reloaded==3.1.1"] + +[tool.uv] +package = false + +[tool.uv.sources] +ml4t-backtest = { path = "../../..", editable = true } diff --git a/validation/environments/zipline/uv.lock b/validation/environments/zipline/uv.lock new file mode 100644 index 00000000..977492e3 --- /dev/null +++ b/validation/environments/zipline/uv.lock @@ -0,0 +1,1062 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" + +[[package]] +name = "alembic" +version = "1.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/2b/e4153978368de59918115c9e01d3ebf58a558a7285efa7e960c383c4b59a/alembic-1.19.1.tar.gz", hash = "sha256:e0fca0518118c78acc493e31bcb5402f190057aaf6df8b5b95ce94c4789cf648", size = 2070816, upload-time = "2026-08-08T16:32:01.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/89/e62cc37b69ad357cc8ecd6e7367f5245f523d3cbb338a66197212bdf6749/alembic-1.19.1-py3-none-any.whl", hash = "sha256:b39018cb3d9413a19cbd54cf3c02ad33998641f0538eb77413a488a21c3e14be", size = 265946, upload-time = "2026-08-08T16:32:03.153Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "bcolz-zipline" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/31/d67d966443addd1c267b8bbbca86cbe44dc48e5873e6fe5ab6ba258e6f61/bcolz_zipline-1.13.0.tar.gz", hash = "sha256:51166ad88e20ba70af7677b9402ffdecfe327ed4d0d15d59a9c249323bf11433", size = 2936717, upload-time = "2025-05-31T18:24:07.102Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/5a/59b1ee779003a0886018f0f9327f8b9103fe9338c7558fe0c761471e146d/bcolz_zipline-1.13.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:0fc6f2f04bb71a86ed7f96f65022a213134839977e3c0aacb7a6c9ae36bbfe68", size = 877087, upload-time = "2025-05-31T18:23:52.945Z" }, + { url = "https://files.pythonhosted.org/packages/ae/36/e4b4220d3dfdde31b67fab3a637a15e334ffe47eef6b9160bee6e8217b08/bcolz_zipline-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:df0ad38e76b340328b81789e9c1f6df1c17238d272255b7cee1025dc70de1603", size = 1073601, upload-time = "2025-05-31T18:23:54.469Z" }, + { url = "https://files.pythonhosted.org/packages/46/a0/6a3ec2c6c93a90f95c0d47c32ebca22ff0a9c5b2222a7b54b78edaf1e4b0/bcolz_zipline-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0c05fb73e4726f3cf1a1e389d5e16d8064e1045395ededee29082249f76e83", size = 5518540, upload-time = "2025-05-31T18:23:56.561Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1c/2a41f1c2c318639bfcd68fa28e231fa137fe077cd54624e1ebe6e51da78c/bcolz_zipline-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8a0752e04702b35f548963c70f743732da3f8a5785046b0629de931d4cbc0e79", size = 479440, upload-time = "2025-05-31T18:23:58.363Z" }, +] + +[[package]] +name = "blosc2" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx", extra = ["http2"] }, + { name = "msgpack" }, + { name = "ndindex" }, + { name = "numexpr", marker = "platform_machine != 'wasm32'" }, + { name = "numpy" }, + { name = "pydantic" }, + { name = "rich" }, + { name = "threadpoolctl", marker = "platform_machine != 'wasm32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ec/0f/c6c1c3decf8b8ecb6630296da81b1c8d9d0212c7f8dcfc0d6d4ff6ef038a/blosc2-4.11.0.tar.gz", hash = "sha256:3c610b076ad0422d861ff10732013c7c3461135968c3c442630542e71249a4a2", size = 6820440, upload-time = "2026-08-12T06:32:35.029Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/00/0b060c0d9dd7db22d1dc04629d1ba05fa6a38626e74621d43693955d435a/blosc2-4.11.0-cp311-abi3-macosx_10_9_x86_64.whl", hash = "sha256:caab9e379c5b1d41a721e30403885434c2ded9067265aa2ba3cef9576cd9fb12", size = 5439003, upload-time = "2026-08-12T06:32:06.847Z" }, + { url = "https://files.pythonhosted.org/packages/cb/59/36ba17172c6464ab9aae894d52841b5b71155a90cdd9db5007890ea273a6/blosc2-4.11.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:255568f149b74686a5de615eb91176b204c1efc0f66ddbb7d6621c2ef451e225", size = 4843423, upload-time = "2026-08-12T06:32:08.875Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2e/7f34148cf478b02d82f7e542fe0f706c98c93a3a24ab08db9a53a8d5ea25/blosc2-4.11.0-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:571876df978732371c2b53e015483a812d161d8b6939a1393d59318df9df75b3", size = 6070494, upload-time = "2026-08-12T06:32:10.355Z" }, + { url = "https://files.pythonhosted.org/packages/ac/48/b8a4ed7c3b1c1464fe2737449a73ab66b8fd9a2625f2dcf6d568135b4890/blosc2-4.11.0-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d17cb079973e0843e669cbd553be7e7e33ce815efb6a3f1f9f2167e41f1bf1ac", size = 6511059, upload-time = "2026-08-12T06:32:11.846Z" }, + { url = "https://files.pythonhosted.org/packages/20/40/8bfdf64c0fd942a5eff6e1f6cc033dbd4f8c998e53f956cdffa5f9dbea37/blosc2-4.11.0-cp311-abi3-pyemscripten_2025_0_wasm32.whl", hash = "sha256:a232274ac0813037ba2fb60317bc03dfb459fa469f330aa08ba8d03124aa6d1d", size = 2502308, upload-time = "2026-08-12T06:32:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/8e/63/ac6608416d2064d637da7fb80abacd3b10edbe18fcb70b0945d71dd5871d/blosc2-4.11.0-cp311-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3beaa151b91b15fa516acef69f55d74bb7dd13b3dfeacfdaf032278091c2264f", size = 2499515, upload-time = "2026-08-12T06:32:14.82Z" }, + { url = "https://files.pythonhosted.org/packages/74/0f/dfad55037ad5bad4052fe6354b4466b7fee5e5fe4c36d0ca04f272779b7b/blosc2-4.11.0-cp311-abi3-win_amd64.whl", hash = "sha256:67fdd3e7e66004ba25adec0ade5916c8a312b9c9de72d024a63d6476051f0b75", size = 4525401, upload-time = "2026-08-12T06:32:16.341Z" }, +] + +[[package]] +name = "bottleneck" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/d8/6d641573e210768816023a64966d66463f2ce9fc9945fa03290c8a18f87c/bottleneck-1.6.0.tar.gz", hash = "sha256:028d46ee4b025ad9ab4d79924113816f825f62b17b87c9e1d0d8ce144a4a0e31", size = 104311, upload-time = "2025-09-08T16:30:38.617Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/72/7e3593a2a3dd69ec831a9981a7b1443647acb66a5aec34c1620a5f7f8498/bottleneck-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3bb16a16a86a655fdbb34df672109a8a227bb5f9c9cf5bb8ae400a639bc52fa3", size = 100515, upload-time = "2025-09-08T16:29:55.141Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d4/e7bbea08f4c0f0bab819d38c1a613da5f194fba7b19aae3e2b3a27e78886/bottleneck-1.6.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0fbf5d0787af9aee6cef4db9cdd14975ce24bd02e0cc30155a51411ebe2ff35f", size = 377451, upload-time = "2025-09-08T16:29:56.718Z" }, + { url = "https://files.pythonhosted.org/packages/fe/80/a6da430e3b1a12fd85f9fe90d3ad8fe9a527ecb046644c37b4b3f4baacfc/bottleneck-1.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d08966f4a22384862258940346a72087a6f7cebb19038fbf3a3f6690ee7fd39f", size = 368303, upload-time = "2025-09-08T16:29:57.834Z" }, + { url = "https://files.pythonhosted.org/packages/30/11/abd30a49f3251f4538430e5f876df96f2b39dabf49e05c5836820d2c31fe/bottleneck-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:604f0b898b43b7bc631c564630e936a8759d2d952641c8b02f71e31dbcd9deaa", size = 361232, upload-time = "2025-09-08T16:29:59.104Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ac/1c0e09d8d92b9951f675bd42463ce76c3c3657b31c5bf53ca1f6dd9eccff/bottleneck-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d33720bad761e642abc18eda5f188ff2841191c9f63f9d0c052245decc0faeb9", size = 373234, upload-time = "2025-09-08T16:30:00.488Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ea/382c572ae3057ba885d484726bb63629d1f63abedf91c6cd23974eb35a9b/bottleneck-1.6.0-cp312-cp312-win32.whl", hash = "sha256:a1e5907ec2714efbe7075d9207b58c22ab6984a59102e4ecd78dced80dab8374", size = 108020, upload-time = "2025-09-08T16:30:01.773Z" }, + { url = "https://files.pythonhosted.org/packages/48/ad/d71da675eef85ac153eef5111ca0caa924548c9591da00939bcabba8de8e/bottleneck-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:81e3822499f057a917b7d3972ebc631ac63c6bbcc79ad3542a66c4c40634e3a6", size = 113493, upload-time = "2025-09-08T16:30:02.872Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/31/4971872b3ed8715346231fb6eb4da8fcba65a4143c189db151ee28a2812b/charset_normalizer-3.5.0.tar.gz", hash = "sha256:49bd5feb59b0bf3cbf6ebcf4352e371c95b9da9bacd4449f8b64d0ad2c10a26e", size = 169295, upload-time = "2026-08-12T14:35:31.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/3c/045ea64ea5a550870dd8ab60b2242870328d53f17d2be593b4f9f3121474/charset_normalizer-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:98820e1ceb25c6df7a80c4fd8efa59cb121f99bc7c4c1693ad94a2caff5b311d", size = 343861, upload-time = "2026-08-12T14:32:27.254Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/7502be709db899d5b4801509829188b3a5a10969411da9c846115a5f1b70/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:608553f476fca509537e804c4a71f5eb166ce63b75141f89c2c686ce1aa36956", size = 237550, upload-time = "2026-08-12T14:32:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ce/66392661375148d9455c17bee25509a54e28c39969e34befa48ec8777936/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6753de11eef42f1c321b26d682957d92c7f7bbce6530f34bbe0f9291dd37cc6f", size = 229673, upload-time = "2026-08-12T14:32:29.668Z" }, + { url = "https://files.pythonhosted.org/packages/6a/64/f58c32a8d4ecf55b82ee61ee9aa6a664d4afcd36c72feb4c926fd6fe9af8/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f76dc0a47f94cb9b69d86f01e477f4b0371ca70208b9ccea7e063c41eed9046", size = 260768, upload-time = "2026-08-12T14:32:30.891Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ea/36c90e59a96386174377e855479ec154221ef001e96637e0b23be92489c4/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c387c6bf91b4774e359a48a179e2872b8e8bf741e4fde06ba8d1665eb9a4760a", size = 257880, upload-time = "2026-08-12T14:32:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/23/35/5b85772eb82528ef22ba29487ad544a7049dfd27f35b1a5a55dbc0843048/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14f6904a3cf870abf044df3a8c4924ac6c8ef77e9896586fd37e73ae96cff2af", size = 247547, upload-time = "2026-08-12T14:32:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/b6/14/ba11a99c2a22ab04c2d5383a700b378cb463a78ab15f36444cabc10cd671/charset_normalizer-3.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cce46dd29d73e135e8087b96eb62a4aca6d69391b7f97808c6588ebed3178f3", size = 243326, upload-time = "2026-08-12T14:32:34.794Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4a/cadba3f2400b45aa1d62a4ae0298bf58a3b30b1158baf15c338c7ce5b601/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b476cdb63df22da2b91837593380be3ddbe406f36c506c1c91d80e7196b66288", size = 238820, upload-time = "2026-08-12T14:32:35.984Z" }, + { url = "https://files.pythonhosted.org/packages/47/41/d5188b9342d75b72c2b05d3ee373f01a691397e770f001ee05e3b37925f5/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1f56ce84b317ef2a59d7d3461891c7597c79247d2192bb8114c68a1a1debfcc0", size = 231661, upload-time = "2026-08-12T14:32:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/13/5f/df38fa972c4e945c3d8cee2bc4e610613af522fd359c7dc7a74c419f0278/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ce0f885239357379d92fd9a5fddbe20f0e30e0527c29ba69f8e99eeb1304a76", size = 261459, upload-time = "2026-08-12T14:32:38.369Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d7/043ff7720067a3beee05523465ac9c1c846c68b7884930dd483f72ee5ab6/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:96ae7ab5d8155fde927aa0864fbc8ba3cc4fde6d41ab0c7cea9d6012b4978603", size = 242300, upload-time = "2026-08-12T14:32:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/33980b7b802a048e546a6d9ad2ea783a6cf6b10a86aaccd10db462d8b913/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf91921009025e96ce57a03ced6d14604fc3baf0530351638e9504a55da6fa3b", size = 259101, upload-time = "2026-08-12T14:32:41.02Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b7/0d19bde844bff9165377c1da9ef3c4792a4c24bd49b5b7094d9e6f6ab58b/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0b2e44e6d42d1a4ff78ccc219a93c5449105d10b16198d1aea581080df8073f9", size = 249246, upload-time = "2026-08-12T14:32:42.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/2c34fdfaacdf0e96e880ef562cbf80a9b5f8ea97e0dd9e57ba348a9c65cf/charset_normalizer-3.5.0-cp312-cp312-win32.whl", hash = "sha256:deb99535e9bf0bea8e274c6413eb939a21be35a3f492678dba4d5b1f4d70f142", size = 178025, upload-time = "2026-08-12T14:32:43.909Z" }, + { url = "https://files.pythonhosted.org/packages/76/d0/c34dbd1df23bcbdc1b5d2f48256340d72fa747f1eb03924a9d2fa35ed85b/charset_normalizer-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54dd1a66fa4bce0ccaf0db9dde336e49b3eec646dc4c1c0991279369d373a14", size = 200143, upload-time = "2026-08-12T14:32:45.254Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/4e6bf1465d60c3d8f488d5bde140d0cb91cd23ccab0dc2895cc6c6982047/charset_normalizer-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:b8ea208b304587d47931b36481342d20336e0d338ab052f8b4305926482598d6", size = 180046, upload-time = "2026-08-12T14:32:46.545Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f3/7b523d807cb5e73562ef8acf21d39cdb9d704955327362c781bc3478a73d/charset_normalizer-3.5.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a4ee37248dfac25107c758bda99d545ce73e60b44d2dd39e4a2bb9f2831e9f5", size = 330840, upload-time = "2026-08-12T14:34:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/f0/de/fc68978fe78ca97063c96d764e41ff92ca639948f319271e0ff450e577a2/charset_normalizer-3.5.0-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a864bdcacd8bff58bb4845304e031f821a3ec64b2b7259f2d409cd49c9e59ca3", size = 251862, upload-time = "2026-08-12T14:34:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/a9/cb/82b41a0ab7fb1a88065f1d78ad32696ad88ea3fe8e25b8189d08833938de/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84b736e3b391601bc47b86da381c749c0f894e9191aaca9f31f30c2632206df3", size = 239484, upload-time = "2026-08-12T14:34:47.869Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0c/19608b631f4538f908098d4a2d56a8f79a665e27cc58e9d90479761a9227/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6abb1f356fb865baeb6ebc3fadd843e9a96fbf49b9adcca55037f3cceccb7438", size = 230602, upload-time = "2026-08-12T14:34:49.265Z" }, + { url = "https://files.pythonhosted.org/packages/29/db/f648eb30e14eba301aed61e11672156f137905c1bdbb530151abe8065943/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d366548d2ee28a8cfdcc4296363978cc644a728333be9824d2de4652e83df0a", size = 259208, upload-time = "2026-08-12T14:34:50.632Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e0/ed2c8bdbac484d69614d6993143aeb6cb0f4dd1561c883402517b623c8ef/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d672f329ae504ee240eb39b6effb3318aa8e7e8924c0ce8eee5760b3fad98539", size = 253659, upload-time = "2026-08-12T14:34:52.11Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/b4907cb9ec5b521d9d024ced13611240b86ef065c2eb15b3ad2334dc9940/charset_normalizer-3.5.0-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54036a518748b6c02e666f6d46c3817561998fb904c3be25b56fb4fe3dc5706", size = 248821, upload-time = "2026-08-12T14:34:53.399Z" }, + { url = "https://files.pythonhosted.org/packages/12/b2/e2d1abcfbc05822f0030869efb4e9f8a3658e13b4821796d4b62da917327/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:22a1889f1c9b752c63c36758a0c2145458e3cadb20fced7a0790002e9dd12b26", size = 240271, upload-time = "2026-08-12T14:34:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f9/4ba127ad610542fa3eabfa41c45bf12d357860a815b3566374ec0188e213/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b7eb3eab5c646d3de7dcb14a7c9caebace5249c5767da39e1761cb1576e521a3", size = 232155, upload-time = "2026-08-12T14:34:56.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/68/40613182366d00bd6dbd5f6c84a926cbd120960e038a8269e9ae7d782762/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2080aa129a28267984cdc902898993d788c995c384e285d0d19199f56760d52e", size = 259674, upload-time = "2026-08-12T14:34:57.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/53/4574a14fa4c9de4a6c9f31725354bfa40b67f653e6d594ce1654f9a41b32/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:fd68c825548a611158230e2f9222e210ceb2e3391995c0aa5865cbdf3ab4bd49", size = 246122, upload-time = "2026-08-12T14:34:59.337Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/bd8030d13d92c058ca7b2b9615bbb3169569e144db64d65c149cd45abf5e/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:d8a9316f4da85e937242642b537c6d55d7e9287dd38e5634732f8233932aff45", size = 255221, upload-time = "2026-08-12T14:35:00.71Z" }, + { url = "https://files.pythonhosted.org/packages/77/9d/10ecd3bcbe2666b3d4d4026c97b48f73990682815db516052a1e8f4a31c5/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d90254c8f609338c53ec180fcd4c4f9c16502e238e3fc88ca7fd4c2f38d445b8", size = 253450, upload-time = "2026-08-12T14:35:02.217Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/d044c4872c0938a84f87b5027a698c0e61bacfc5c3551a4e749ca9b7bc5c/charset_normalizer-3.5.0-cp37-abi3-win32.whl", hash = "sha256:8b3e9e29b8b07cc461b9ce7768db7693a93979d0dadf22046f6f3555ded2f516", size = 173594, upload-time = "2026-08-12T14:35:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/10/6b/6046773901f1944b9a89436351529811ee958afc7b774563be9d74a6f0c3/charset_normalizer-3.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:0c8953d9d1617794cfc40d81179571c9ba3805dd029623a15c93f1fb70e60a74", size = 198959, upload-time = "2026-08-12T14:35:05.187Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/b57708ac92aefc8e8389d51d5178129b81f03196da61ee2c23e687b8178a/charset_normalizer-3.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:562d24ca7797c1af8852994950c2e623a907b201fc4b0ed29e92af173d3828ca", size = 267055, upload-time = "2026-08-12T14:35:06.533Z" }, + { url = "https://files.pythonhosted.org/packages/22/c7/754d09943a616937df61e4ba367c409ded2a987e872972098d51a6fcf73b/charset_normalizer-3.5.0-py3-none-any.whl", hash = "sha256:993dfcbe75a85a3784abb5084f2c41b915767c90546fcc92803cffa28611baea", size = 67943, upload-time = "2026-08-12T14:35:30.363Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "empyrical-reloaded" +version = "0.5.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bottleneck" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "peewee" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/43/2dd510760e12fb9a07d2ab4dcf67f263e6eb103c73285d040005fe3d5da9/empyrical_reloaded-0.5.12.tar.gz", hash = "sha256:e01f0bbf24f0aaab2767c85a7dee8f05a59d25355cf50c3371efda056613e323", size = 84272, upload-time = "2025-06-01T23:17:11.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/54/23d8f6d36c66575b8d31e354c8bba2c857f9ca41e4b76388c6ca53938fd8/empyrical_reloaded-0.5.12-py3-none-any.whl", hash = "sha256:1bd8b53810c760ae5a12a03f2cefc6af0e905f854b71e7d99074b673abdd4fd6", size = 33048, upload-time = "2025-06-01T23:17:09.958Z" }, +] + +[[package]] +name = "exchange-calendars" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "korean-lunar-calendar" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyluach" }, + { name = "toolz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, +] + +[[package]] +name = "greenlet" +version = "3.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/d8/7cc97c142388aef03f622e001c572c4f84e9252a439549d483f555771970/greenlet-3.5.5.tar.gz", hash = "sha256:adb4bae02e91a8e863e48b177e4014bdcac8a6b5e047ea1df687a61534b85e6c", size = 207585, upload-time = "2026-08-10T15:09:36.136Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/7e/9ecd0285e3153532ae07aeb88063c43c72b4221cf0d4d123b02f3682e3ff/greenlet-3.5.5-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:49520f0c95a48b42cf55414b8e8479beb274ea70431afc33e3f79903c71f4380", size = 295809, upload-time = "2026-08-10T13:25:34.023Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/60e4bbcc89252037b18087f2ec16405d5b2d5be42dde191bbf3667e96102/greenlet-3.5.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55272212cbc5f43d1d723725ab931f1939969b7e9523882ca58b55061769d053", size = 611910, upload-time = "2026-08-10T14:14:35.18Z" }, + { url = "https://files.pythonhosted.org/packages/a4/17/cd5134be659cd4a443e7a61ae670dabec165a814c51162916d637b6dd38e/greenlet-3.5.5-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655bca754a2ef4efcb0eb48a94d3f4593536d0f3d48f8ed44343c01d16a92f95", size = 624198, upload-time = "2026-08-10T14:27:25.229Z" }, + { url = "https://files.pythonhosted.org/packages/78/ac/5c5b959999b6f09c3026b5dfe171575bc3121c5236ce74f495096f25b203/greenlet-3.5.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:147b25a42e5ca5be3d42356e8f608b37af715a1c196e9bf9d1627f3341adfe1d", size = 621439, upload-time = "2026-08-10T13:40:49.391Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6acf112ed8aee499f25b4d6949820fb02ac950ff9c1f3d793bd5be0599f2/greenlet-3.5.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:27493374cff1d1b7919dc8126547f2aea582737e3046147b434b1e12de56389b", size = 1581342, upload-time = "2026-08-10T14:15:05.653Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/734e5f198888876b42d7616ff6644c075baf6b8a2412deadd6b0e1b8b20c/greenlet-3.5.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:12e2ee66c2aba86133f10fd99d6a8856c6d351ffb7be0e4d52ef2cc5fbb705b2", size = 1645744, upload-time = "2026-08-10T13:40:30.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/30/1f42b88dc587b5899ee50616ad56ee40cafaf225df4fb829f10183c62a5c/greenlet-3.5.5-cp312-cp312-win_amd64.whl", hash = "sha256:49ddacd36af37735fab103846f4ee4d18a492dde72730d1699c0c8ebe30d9f18", size = 324171, upload-time = "2026-08-10T13:28:44.472Z" }, + { url = "https://files.pythonhosted.org/packages/76/e5/4dee4d8d2e603fe5fdd7b444e63219f7b9bd852c60c6214511c7157cbe88/greenlet-3.5.5-cp312-cp312-win_arm64.whl", hash = "sha256:5f1b1ff4828cdc1aba4266aff814085d04a1d07959287219af021b838b265d52", size = 308362, upload-time = "2026-08-10T13:26:46.839Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h2" +version = "4.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack" }, + { name = "hyperframe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/85/7c366e69d84c17bb778fe41419e1fbcce3033d5b7ce29bbffff0a98b859f/h2-4.4.1.tar.gz", hash = "sha256:4e866ffb1a869ae14dd9b5e6beb5c24a13da0495ad72b65925ded182521c1516", size = 2157281, upload-time = "2026-08-03T11:45:09.509Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/22/e85faf23bd72a92d1921e37d674ca56eb298a3c8be31fdecef0ff2b3aaac/h2-4.4.1-py3-none-any.whl", hash = "sha256:0e25f1462b23c9cb82d9eb02e28bc706dac2a68cb457c6a0d74d63c8a2a5d0e6", size = 62636, upload-time = "2026-08-03T11:44:59.164Z" }, +] + +[[package]] +name = "h5py" +version = "3.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/33/acd0ce6863b6c0d7735007df01815403f5589a21ff8c2e1ee2587a38f548/h5py-3.16.0.tar.gz", hash = "sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738", size = 446526, upload-time = "2026-03-06T13:49:08.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c0/5d4119dba94093bbafede500d3defd2f5eab7897732998c04b54021e530b/h5py-3.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d", size = 3685604, upload-time = "2026-03-06T13:48:04.198Z" }, + { url = "https://files.pythonhosted.org/packages/b0/42/c84efcc1d4caebafb1ecd8be4643f39c85c47a80fe254d92b8b43b1eadaf/h5py-3.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d", size = 3061940, upload-time = "2026-03-06T13:48:05.783Z" }, + { url = "https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527", size = 5198852, upload-time = "2026-03-06T13:48:07.482Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e", size = 5405250, upload-time = "2026-03-06T13:48:09.628Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/9790c1655eabeb85b92b1ecab7d7e62a2069e53baefd58c98f0909c7a948/h5py-3.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794", size = 5190108, upload-time = "2026-03-06T13:48:11.26Z" }, + { url = "https://files.pythonhosted.org/packages/51/d7/ab693274f1bd7e8c5f9fdd6c7003a88d59bedeaf8752716a55f532924fbb/h5py-3.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074", size = 5419216, upload-time = "2026-03-06T13:48:13.322Z" }, + { url = "https://files.pythonhosted.org/packages/03/c1/0976b235cf29ead553e22f2fb6385a8252b533715e00d0ae52ed7b900582/h5py-3.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6", size = 3182868, upload-time = "2026-03-06T13:48:15.759Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/866b7e570b39070f92d47b0ff1800f0f8239b6f9e45f02363d7112336c1f/h5py-3.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db", size = 2653286, upload-time = "2026-03-06T13:48:17.279Z" }, +] + +[[package]] +name = "hpack" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/5b/fcabf6028144a8723726318b07a32c2f3314acdff6265743cf08a344b18e/hpack-4.2.0.tar.gz", hash = "sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0", size = 51300, upload-time = "2026-06-23T18:34:46.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/b4/4a9fcfb2aef6ba44d9073ecd301443aa00b3dac95de5619f2a7de7ec8a91/hpack-4.2.0-py3-none-any.whl", hash = "sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986", size = 34246, upload-time = "2026-06-23T18:34:45.472Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[package.optional-dependencies] +http2 = [ + { name = "h2" }, +] + +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "intervaltree" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sortedcontainers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/c3/b2afa612aa0373f3e6bb190e6de35f293b307d1537f109e3e25dbfcdf212/intervaltree-3.2.1.tar.gz", hash = "sha256:f3f7e8baeb7dd75b9f7a6d33cf3ec10025984a8e66e3016d537e52130c73cfe2", size = 1231531, upload-time = "2025-12-24T04:25:06.773Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/7f/8a80a1c7c2ed05822b5a2b312d2995f30c533641f8198366ba2e26a7bb03/intervaltree-3.2.1-py2.py3-none-any.whl", hash = "sha256:a8a8381bbd35d48ceebee932c77ffc988492d22fb1d27d0ba1d74a7694eb8f0b", size = 25929, upload-time = "2025-12-24T04:25:05.298Z" }, +] + +[[package]] +name = "iso3166" +version = "2.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/11/b5023c736a185a88ebd0d38646af6f4d1b4c9b91f2ca84e08e5d2bc7ac3c/iso3166-2.1.1.tar.gz", hash = "sha256:fcd551b8dda66b44e9f9e6d6bbbee3a1145a22447c0a556e5d0fb1ad1e491719", size = 12807, upload-time = "2022-07-12T04:07:57.294Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/d0/bf18725b8d47f37858ff801f8e4d40c6982730a899725bdb6ded62199954/iso3166-2.1.1-py3-none-any.whl", hash = "sha256:263660b36f8471c42acd1ff673d28a3715edbce7d24b1550d0cf010f6816c47f", size = 9829, upload-time = "2022-07-12T04:07:55.54Z" }, +] + +[[package]] +name = "iso4217" +version = "1.16.20260101" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/98/a5f28006515c24de82c3d76f79e13dd3fbdf71431fdb158505ee45008908/iso4217-1.16.20260101.tar.gz", hash = "sha256:6a5afba6acb01cad8045f81e2b96f6adbea04f0c524ae21f317ac4ca11c3bdd6", size = 13695, upload-time = "2026-03-03T15:28:36.013Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/5b/725a6980401169ba9115f0b837d3af09134e43eaed9b2bebd8dbb50df733/iso4217-1.16.20260101-py2.py3-none-any.whl", hash = "sha256:69c591b93c7d783ec8c309ebee8df1aa28f8403d44bcce518ae8db050462084b", size = 11991, upload-time = "2026-03-03T15:28:34.523Z" }, +] + +[[package]] +name = "korean-lunar-calendar" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/9f/6160e95f3934026194dc7a0b5c78fe5c6e74761830ddea3e9cfc38e3f983/korean_lunar_calendar-0.4.0.tar.gz", hash = "sha256:be56f27bc0594fdbbdf7bbe00f504a9f929a31e311bd7d9bb93561b645afade7", size = 13425, upload-time = "2026-06-15T14:19:57.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/88/f56033b09fdca5c8c5e5fc2f3513950a05cd62caa9bd8e6d2750a887c86e/korean_lunar_calendar-0.4.0-py3-none-any.whl", hash = "sha256:c042e20de0bb702add6bec8d0f6da1ea8d3b170838e63846f70420cf341fe4e7", size = 11323, upload-time = "2026-06-15T14:19:56.089Z" }, +] + +[[package]] +name = "lru-dict" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/0a/dec86efe38b350314c49a8d39ef01ba7cf8bbbef1d177646320eedea7159/lru_dict-1.4.1.tar.gz", hash = "sha256:cc518ff2d38cc7a8ab56f9a6ae557f91e2e1524b57ed8e598e97f45a2bd708fc", size = 13439, upload-time = "2025-11-02T10:02:13.548Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/a8/89e4c26e0e751321b41b0a3007384f97d9eae7a863c49af1c68c43005ca3/lru_dict-1.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7fa342c6e6bc811ee6a17eb569d37b149340d5aa5a637a53438e316a95783838", size = 16683, upload-time = "2025-11-02T10:01:15.891Z" }, + { url = "https://files.pythonhosted.org/packages/f1/34/b3c6fdd120af68b6eeb524d0de3293ff27918ec57f45eed6bef1789fd085/lru_dict-1.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bd86bd202a7c1585d9dc7e5b0c3d52cf76dc56b261b4bbecfeefbbae31a5c97d", size = 11216, upload-time = "2025-11-02T10:01:16.867Z" }, + { url = "https://files.pythonhosted.org/packages/e9/7e/280267ae23f1ec1074ddaab787c5e041e090220e8e37828d51ff4e681dfd/lru_dict-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4617554f3e42a8f520c8494842c23b98f5b7f4d5e0410e91a4c3ad0ea5f7e094", size = 11687, upload-time = "2025-11-02T10:01:17.485Z" }, + { url = "https://files.pythonhosted.org/packages/ca/18/fec42416ceff98ae2760067ec72b0b9fc02840e729bbc18059c6a02cb01f/lru_dict-1.4.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:40927a6a4284d437047f547e652b15f6f0f40210deb6b9e5b77e556ff0faea0f", size = 31960, upload-time = "2025-11-02T10:01:18.158Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ef/38e7ee1a5d32b9b1629d045fa5a495375383aacfb2945f4d9535b9af9630/lru_dict-1.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e2c07ecb6d42494e45d00c2541e6b0ae7659fc3cf89681521ba94b15c682d4fe", size = 32882, upload-time = "2025-11-02T10:01:18.841Z" }, + { url = "https://files.pythonhosted.org/packages/72/82/d56653ca144c291ab37bea5f23c5078ffbe64f7f5b466f91d400590b9106/lru_dict-1.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:85b28aa2de7c5f1f6c68221857accd084438df98edbd4f57595795734225770c", size = 34268, upload-time = "2025-11-02T10:01:19.564Z" }, + { url = "https://files.pythonhosted.org/packages/94/ae/382651533d60f0b598757efda56dc87cad5ac311fba8e61f86fb916bf236/lru_dict-1.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cbbbb4b51e2529ccf7ee8a3c3b834052dbd54871a216cfd229dd2b1194ff293a", size = 32156, upload-time = "2025-11-02T10:01:20.22Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d1/d9df7e9272ccbc96f04c477dfb9abb91fa8fabde86b7fa190cb7b3c7a024/lru_dict-1.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e47040421a13de8bc6404557b3700c33f1f2683cbcce22fe5cacec4c938ce54b", size = 33395, upload-time = "2025-11-02T10:01:20.901Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6e/dafe0f5943a7b3ab24d3429032ff85873acd626087934b8161b55340c13a/lru_dict-1.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:451f7249866cb9564bb40d73bec7ac865574dafd0a4cc91627bbf35be7e99291", size = 31591, upload-time = "2025-11-02T10:01:21.606Z" }, + { url = "https://files.pythonhosted.org/packages/a6/4d/9dd35444592bfb6805548e15971cfce821400966a51130b78dc021ee8f03/lru_dict-1.4.1-cp312-cp312-win32.whl", hash = "sha256:e8996f3f94870ecb236c55d280839390edae7f201858fee770267eac27b8b47d", size = 13119, upload-time = "2025-11-02T10:01:22.61Z" }, + { url = "https://files.pythonhosted.org/packages/8d/82/7e72e30d6c15d65466b3baca87cce15e20848ba6a488868aa54e901141a6/lru_dict-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:d90774db1b60c0d5c829cfa5d7fda6db96ed1519296f626575598f9f170cca37", size = 14109, upload-time = "2025-11-02T10:01:23.322Z" }, +] + +[[package]] +name = "mako" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/12/b5fa2353e2754cd67fb9f83793fa48ff42c213a5da7e719869d2301f6ab8/mako-1.4.1.tar.gz", hash = "sha256:d7904710b662996425a21627710c4777c45053146942cf8a7aebf757c92b8c27", size = 410165, upload-time = "2026-08-05T06:10:56.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/54/12ed58d458474aaab5c3d180173e745a4fe131bb330370596876d19ff60f/mako-1.4.1-py3-none-any.whl", hash = "sha256:a359d9a94a541213958742b2698d0a7757bb83551767bc468a74b9905aba9617", size = 80010, upload-time = "2026-08-05T06:10:58.248Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "ml4t-backtest" +source = { editable = "../../../" } +dependencies = [ + { name = "ml4t-specs" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pandas-market-calendars" }, + { name = "polars" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=1.9.0" }, + { name = "cvxpy", marker = "extra == 'advanced'", specifier = ">=1.3.0" }, + { name = "cvxpy", marker = "extra == 'all'", specifier = ">=1.3.0" }, + { name = "dash", marker = "extra == 'all'", specifier = ">=2.11.0" }, + { name = "dash", marker = "extra == 'viz'", specifier = ">=2.11.0" }, + { name = "hypothesis", marker = "extra == 'all'", specifier = ">=6.80.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.80.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.7.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.7.0" }, + { name = "mkdocs", marker = "extra == 'all'", specifier = ">=1.6,<2" }, + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6,<2" }, + { name = "mkdocs-material", marker = "extra == 'all'", specifier = ">=9.5.0" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, + { name = "ml4t-diagnostic", marker = "extra == 'all'", specifier = ">=0.1.0b4" }, + { name = "ml4t-diagnostic", marker = "extra == 'dev'", specifier = ">=0.1.0b4" }, + { name = "ml4t-specs", specifier = ">=0.1.2,<0.2" }, + { name = "networkx", marker = "extra == 'advanced'", specifier = ">=3.0" }, + { name = "networkx", marker = "extra == 'all'", specifier = ">=3.0" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, + { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, + { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, + { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, + { name = "polars", specifier = ">=1.36.1" }, + { name = "pre-commit", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyfolio-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.9.9" }, + { name = "pytest", marker = "extra == 'all'", specifier = ">=7.4.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", marker = "extra == 'all'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-benchmark", marker = "extra == 'all'", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'all'", specifier = ">=4.1.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "pytest-timeout", marker = "extra == 'all'", specifier = ">=2.1.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.1.0" }, + { name = "pytest-xdist", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "ruff", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, + { name = "ty", marker = "extra == 'all'" }, + { name = "ty", marker = "extra == 'dev'" }, + { name = "vectorbt", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.24.0" }, + { name = "zipline-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=2.4.0" }, +] +provides-extras = ["advanced", "all", "comparison", "dev", "docs", "viz"] + +[package.metadata.requires-dev] +dev = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "ml4t-diagnostic", specifier = ">=0.1.0b4" }, + { name = "pre-commit", specifier = ">=3.3.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, + { name = "ruff", specifier = ">=0.8.0" }, + { name = "twine", specifier = ">=6.0.0" }, + { name = "ty" }, +] +test = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, +] + +[[package]] +name = "ml4t-backtest-validation-zipline" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "ml4t-backtest" }, + { name = "zipline-reloaded" }, +] + +[package.metadata] +requires-dist = [ + { name = "ml4t-backtest", editable = "../../../" }, + { name = "zipline-reloaded", specifier = "==3.1.1" }, +] + +[[package]] +name = "ml4t-specs" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/ca/aba7ea1f4e9a1da0b4f465dea03d3e4320d63db348245a2a9976096407ac/ml4t_specs-0.1.3.tar.gz", hash = "sha256:9578038af96d59cd50317e78f8781772833b308076da13ad24c0b304bb20961d", size = 50758, upload-time = "2026-08-12T02:27:14.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6c/0a35ee16313441a68a14d811ffa8b79eb63a013d548b6bbb50dfd208c6b1/ml4t_specs-0.1.3-py3-none-any.whl", hash = "sha256:2b9302d27746f5859b62c6748bf217ca4eae76d4842c783575c58f4880d1568f", size = 33860, upload-time = "2026-08-12T02:27:12.929Z" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, +] + +[[package]] +name = "multipledispatch" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/3e/a62c3b824c7dec33c4a1578bcc842e6c30300051033a4e5975ed86cc2536/multipledispatch-1.0.0.tar.gz", hash = "sha256:5c839915465c68206c3e9c473357908216c28383b425361e5d144594bf85a7e0", size = 12385, upload-time = "2023-06-27T16:45:11.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/c0/00c9809d8b9346eb238a6bbd5f83e846a4ce4503da94a4c08cb7284c325b/multipledispatch-1.0.0-py3-none-any.whl", hash = "sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4", size = 12818, upload-time = "2023-06-27T16:45:09.418Z" }, +] + +[[package]] +name = "ndindex" +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/92/4b9d2f4e0f3eabcfc7b02b48261f6e5ad36a3e2c1bbdcc4e3b7b6c768fa6/ndindex-1.10.1.tar.gz", hash = "sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11", size = 271395, upload-time = "2025-11-19T20:40:08.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/90/774ddd08b2a1b41faa56da111f0fbfeb4f17ee537214c938ef41d61af949/ndindex-1.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e", size = 177348, upload-time = "2025-11-19T20:38:41.768Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ee/a423e857f5b45da3adc8ddbcfbfd4a0e9a047edce3915d3e3d6e189b6bd9/ndindex-1.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d", size = 176561, upload-time = "2025-11-19T20:38:43.06Z" }, + { url = "https://files.pythonhosted.org/packages/1f/40/139b6b050ba2b2a0bb40e0381a352b1eb6551302dcb8f86fb4c97dd34e92/ndindex-1.10.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78", size = 542901, upload-time = "2025-11-19T20:38:44.43Z" }, + { url = "https://files.pythonhosted.org/packages/27/ae/defd665dbbeb2fffa077491365ed160acaec49274ce8d4b979f55db71f18/ndindex-1.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959", size = 546875, upload-time = "2025-11-19T20:38:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/59/43/6d54d48e8eaee25cdab70d3e4c4f579ddb0255e4f1660040d5ad55e029c6/ndindex-1.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb", size = 1510036, upload-time = "2025-11-19T20:38:47.444Z" }, + { url = "https://files.pythonhosted.org/packages/09/61/e28ba3b98eacd18193176526526b34d7d70d2a6f9fd2b4d8309ab5692678/ndindex-1.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557", size = 1571849, upload-time = "2025-11-19T20:38:48.951Z" }, + { url = "https://files.pythonhosted.org/packages/8f/63/83fff78a3712cb9f478dd84a19ec389acf6f8c7b01dc347a65ae74e6123d/ndindex-1.10.1-cp312-cp312-win32.whl", hash = "sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67", size = 149792, upload-time = "2025-11-19T20:38:50.959Z" }, + { url = "https://files.pythonhosted.org/packages/52/fd/a5e3c8c043d0dddea6cd4567bfaea568f022ac197301882b3d85d9c1e9b3/ndindex-1.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c", size = 158164, upload-time = "2025-11-19T20:38:52.242Z" }, +] + +[[package]] +name = "networkx" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, +] + +[[package]] +name = "numexpr" +version = "2.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/c4/27ea7849eb4a7e3b51db446b0414254326dba8c6bdee09b9f2abf963e55d/numexpr-2.14.2.tar.gz", hash = "sha256:e7144e83ea9e581f2273e0304f15836736c4e470e2bd2e378ce617662a1ca278", size = 121744, upload-time = "2026-07-18T10:52:43.185Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/fd/3e7ca4328c22b28717cfe05cd23ca35ffd84e4ca36c3da004323528e9e20/numexpr-2.14.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:606ceaf5722e295ef965ca591736fc26d9e5f13ad950a479e64cead1947f8a3d", size = 164757, upload-time = "2026-07-18T10:51:49.05Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5c/9780d48c4d5effcf55fc7ab7c5651ed82b43250ac8410cce4ef1e97583ed/numexpr-2.14.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:790da022539fe7c37dc893acf530a91c2ca6964d7ba11f464131383729d058f3", size = 153507, upload-time = "2026-07-18T10:51:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/41/13/ed5efda74ace9a7e2e933476b85bba6d00f2ebf6b833ef59a796ec9af88c/numexpr-2.14.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:327be9ee62251c173236dc620147ff2d0e732a32f5bad918d78a10082f502f63", size = 455373, upload-time = "2026-07-18T10:51:51.466Z" }, + { url = "https://files.pythonhosted.org/packages/ea/11/e8953226d658ae67e3e002abaa60a101c693f9c57d74974001729afab5ef/numexpr-2.14.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6a5d8fc7016bf6f6e1808b011510aa7c3bd75ec1407f7650874ec591db59f5e", size = 445187, upload-time = "2026-07-18T10:51:52.849Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f7/f51b7e10c312bd9617df829e063c87a6d443fd97af54688282ba2b11b1fd/numexpr-2.14.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4b1ff261c3e69c4c59578d3a9ca6132603619d38ae1abe73325563bed3b9bbaf", size = 1420426, upload-time = "2026-07-18T10:51:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/14/bf/21b4e362039ba52f9033a3f57d68160c0829c9c8d66fa7b443b82491322c/numexpr-2.14.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b8384592c49cb15a91caa54e2cd84d1ce18edb7af030bb76cd29b52e5dc155d", size = 1467554, upload-time = "2026-07-18T10:51:55.391Z" }, + { url = "https://files.pythonhosted.org/packages/2b/75/0856b1add4e5a7741b80b615f3faace8e3cfffe11e22b6a940ebf25443aa/numexpr-2.14.2-cp312-cp312-win32.whl", hash = "sha256:41cdeacf1b4e51c1143983ea61fcee68139ca47222b55a9265b4fa73826c4260", size = 161441, upload-time = "2026-07-18T10:51:56.503Z" }, + { url = "https://files.pythonhosted.org/packages/a3/78/c87a88b8e63b5f78c67d555afebefafe81f6e3d98640b4bc1c125d76c9d3/numexpr-2.14.2-cp312-cp312-win_amd64.whl", hash = "sha256:8fc55d14bcf17b3fe69213bea14f999451892b4690717008c66f2edfd6a085ce", size = 157563, upload-time = "2026-07-18T10:51:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/15/37/eea56d5ed1ae5252447f45bb461930eab66338eeab32e533aceb080db0bb/numexpr-2.14.2-cp312-cp312-win_arm64.whl", hash = "sha256:806a4471310fe20aa7cb1b2816a6f5e508073a1ad1c2e18041b83e57066fad6a", size = 148820, upload-time = "2026-07-18T10:51:58.536Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, +] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, +] + +[[package]] +name = "pandas-market-calendars" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exchange-calendars" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, +] + +[[package]] +name = "patsy" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/44/ed13eccdd0519eff265f44b670d46fbb0ec813e2274932dc1c0e48520f7d/patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0", size = 399942, upload-time = "2025-10-20T16:17:37.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a", size = 233301, upload-time = "2025-10-20T16:17:36.563Z" }, +] + +[[package]] +name = "peewee" +version = "3.17.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/b1/2331e6b1fc8c61686dd9276f34142265462640eb0dd431246e30c4461065/peewee-3.17.3.tar.gz", hash = "sha256:ef15f90b628e41a584be8306cdc3243c51f73ce88b06154d9572f6d0284a0169", size = 2953258, upload-time = "2024-04-17T15:29:44.345Z" } + +[[package]] +name = "polars" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" }, + { url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" }, + { url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" }, + { url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" }, +] + +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", size = 104716, upload-time = "2022-10-25T20:38:06.303Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335, upload-time = "2022-10-25T20:38:27.636Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyluach" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/11/42568c1568a75f8803c59f26d29af01a0890352b7a8e03d41ecda8bfb5dd/pyluach-2.3.0.tar.gz", hash = "sha256:ec6e30669d1df50c9ca160486da44a8195bb4c7a5d3d533990d0c5b03accd281", size = 26910, upload-time = "2025-09-09T20:24:39.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c8/f96208ade3ca4c23b372497d0788bcf0f2e0ff4310e5ee693366bc33fdf0/pyluach-2.3.0-py3-none-any.whl", hash = "sha256:4497b731aef59508b079dbf5f00bc5bf4329ac45090a6cd37b5a83756f0e69ab", size = 25914, upload-time = "2025-09-09T20:24:37.831Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.3.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a", size = 31056519, upload-time = "2026-06-19T14:59:45.203Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1e6442a00cd2924d361aa1b642ab6373ec35c6fabf311a760be9f76e0f13/scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b", size = 28681889, upload-time = "2026-06-19T14:59:48.103Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2d/11dd93d21e147a73ba22bd75c0b9208d3a2e0ec76d53170ce7d9029b1015/scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9", size = 20423580, upload-time = "2026-06-19T14:59:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/93552f75e0d2a7dd115a45e59209c51e8d514daff02fc887d2623be06fe1/scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8", size = 23054441, upload-time = "2026-06-19T14:59:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/21f5e703643d66f21faa6b4c73195bfcad70c55efcb4f1ab327cd7c4101a/scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab", size = 33968720, upload-time = "2026-06-19T14:59:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2", size = 35287115, upload-time = "2026-06-19T14:59:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ff/eec46be7e9234208f801062b53e1983085eddebd693f6c9bfb03b459830d/scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11", size = 35577989, upload-time = "2026-06-19T15:00:02.235Z" }, + { url = "https://files.pythonhosted.org/packages/84/ca/210d4759c7210bb7d269437421959b39a33434e2776b60c5cb8a763bb30a/scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de", size = 37421717, upload-time = "2026-06-19T15:00:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/9a9edb45345bd6744da5ddfb6628e5d5185920494c6a67ec45b6381004cb/scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132", size = 36597428, upload-time = "2026-06-19T15:00:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/99/0e/33f32a2a58987e26aec0f7df252cbbad1e90ae77bdbc76f40dd4ed0cf0ea/scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76", size = 24351481, upload-time = "2026-06-19T15:00:11.103Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/21/77b4c147963073040dc3c3a5cb7a8c3001a1893c0209432cb77f9df836aa/sqlalchemy-2.0.52.tar.gz", hash = "sha256:5e2d46356ac2ccb7d268ab6c2319ac6a2b42f1b8d5fd8bd3d46855cd82abee97", size = 9945637, upload-time = "2026-08-11T19:07:09.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/d5/1b77a026d161f98a08f11af1a5f6c47b98ee7c7e2648af525a1004826c78/sqlalchemy-2.0.52-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be8c49131665dfe2cc74c498aa1240ffb548d0fd901325dd11c2c7a18956f727", size = 2170940, upload-time = "2026-08-11T20:58:11.25Z" }, + { url = "https://files.pythonhosted.org/packages/54/bd/f444444adb37b5d53753fb1730ee7a421628e2e3b756c4da461af7e6394a/sqlalchemy-2.0.52-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b2d9e507a458832adcfbd8af6e2036ddf069b7710b799448542ebccae2dceee", size = 3383415, upload-time = "2026-08-11T21:02:38.534Z" }, + { url = "https://files.pythonhosted.org/packages/be/57/2eadf93a552568c57e8680b7e58bb5e9770d80942a1bdbaf4f2f63f0d7c8/sqlalchemy-2.0.52-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8738008376d22f30f411ea3efecf39b51110b6996d80bb73786f30bcfdd5fd3b", size = 3398577, upload-time = "2026-08-11T21:16:59.092Z" }, + { url = "https://files.pythonhosted.org/packages/15/c3/2887cf9dd111d1fbf05d22165b404c221ef43e029f7a2695e7302f27a7cc/sqlalchemy-2.0.52-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37a4d548327b6cab9c7d8cdb4e0e82feabee0110c4d150059068e2d1cfbd99ee", size = 3328225, upload-time = "2026-08-11T21:02:40.183Z" }, + { url = "https://files.pythonhosted.org/packages/02/0f/466bdf9e1feeeef5587f868c187d8687e21ff8c85b1775e9041130181132/sqlalchemy-2.0.52-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e49f51a5d59857a7a0dcaf9469febf7197d9394bd88f00d69c2c4e848112cdbf", size = 3357374, upload-time = "2026-08-11T21:17:01.076Z" }, + { url = "https://files.pythonhosted.org/packages/22/20/5c2b4583904af4173076dda1c9e53c9e2ffc7a702d2efde0216bbacbf7cb/sqlalchemy-2.0.52-cp312-cp312-win32.whl", hash = "sha256:afda3ec521d0517d0de783fc70030775841900896d832de5bbd066549290470e", size = 2129366, upload-time = "2026-08-11T21:14:50.991Z" }, + { url = "https://files.pythonhosted.org/packages/ed/06/543dab8ef62d4e9fb96fb31a30c2b8b14a8763bccf48d428294d6b3041c0/sqlalchemy-2.0.52-cp312-cp312-win_amd64.whl", hash = "sha256:2d5e53e36e37129fe0be8b9d08b6e4052c10a963ee6cda56c8c10dcc194b99ca", size = 2157344, upload-time = "2026-08-11T21:14:52.453Z" }, + { url = "https://files.pythonhosted.org/packages/b3/3f/3582293d1e185e71d19d7c731c3e2ee20ba21981c4a1115c0806c1f62120/sqlalchemy-2.0.52-py3-none-any.whl", hash = "sha256:3b81b8363a919ce53453591cdb93702e6bd54ade6c4fa2f468fc053baee5ed89", size = 1950700, upload-time = "2026-08-11T20:47:21.603Z" }, +] + +[[package]] +name = "statsmodels" +version = "0.14.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "patsy" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/81/e8d74b34f85285f7335d30c5e3c2d7c0346997af9f3debf9a0a9a63de184/statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a", size = 20689085, upload-time = "2025-12-05T23:08:39.522Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5", size = 10091932, upload-time = "2025-12-05T19:28:55.446Z" }, + { url = "https://files.pythonhosted.org/packages/05/30/affbabf3c27fb501ec7b5808230c619d4d1a4525c07301074eb4bda92fa9/statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c", size = 9997345, upload-time = "2025-12-05T19:29:10.278Z" }, + { url = "https://files.pythonhosted.org/packages/48/f5/3a73b51e6450c31652c53a8e12e24eac64e3824be816c0c2316e7dbdcb7d/statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368", size = 10058649, upload-time = "2025-12-05T23:10:12.775Z" }, + { url = "https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d", size = 10339446, upload-time = "2025-12-05T23:10:28.503Z" }, + { url = "https://files.pythonhosted.org/packages/56/4a/dce451c74c4050535fac1ec0c14b80706d8fc134c9da22db3c8a0ec62c33/statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37", size = 10368705, upload-time = "2025-12-05T23:10:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f", size = 9543991, upload-time = "2025-12-05T23:10:58.536Z" }, +] + +[[package]] +name = "tables" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blosc2" }, + { name = "numexpr" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "py-cpuinfo" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/a3/d213ebe7376d48055bd55a29cd9f99061afa0dcece608f94a5025d797b0a/tables-3.11.1.tar.gz", hash = "sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb", size = 4790533, upload-time = "2026-03-01T11:43:36.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/bb/4a9cde6628563388db26fa86c64adb0f2475a757e72af0ec185fd520b72f/tables-3.11.1-cp311-abi3-macosx_10_9_x86_64.whl", hash = "sha256:eb30684c42a77bbecdef2b9c763c4372b0ddc9cc5bd8b2a2055f2042eee67217", size = 7045977, upload-time = "2026-03-01T11:42:48.605Z" }, + { url = "https://files.pythonhosted.org/packages/78/74/6568c8d3aabf9982ab89fe3e378afbd7aad4894bde4570991a3246169ef4/tables-3.11.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:f0367d2e3df0f10ea63ccf4279f3fe58e32ec481767320301a483e2b3cd83efc", size = 6264947, upload-time = "2026-03-01T11:42:53.192Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a3/ec228901fca4c996306b17f5c60a4105144df0bbd07b3a4a816f91f37b4a/tables-3.11.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e", size = 6903733, upload-time = "2026-03-01T11:42:58.349Z" }, + { url = "https://files.pythonhosted.org/packages/99/29/c2dc674ea70fa9a4819417289a9c0d3e4780835beeed573eb66964cfb763/tables-3.11.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67", size = 7241357, upload-time = "2026-03-01T11:43:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/60/b5/a59b62af4127790c618eb11c06c106706e07509a3fb9e346b2a3ffa74419/tables-3.11.1-cp311-abi3-win_amd64.whl", hash = "sha256:7fa6cb03f6fe55ae4f85e89ec5450e5c40cc4c52d8c3b60eb157a445c2219e89", size = 6526565, upload-time = "2026-03-01T11:43:08.58Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "zipline-reloaded" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alembic" }, + { name = "bcolz-zipline" }, + { name = "bottleneck" }, + { name = "click" }, + { name = "empyrical-reloaded" }, + { name = "exchange-calendars" }, + { name = "h5py" }, + { name = "intervaltree" }, + { name = "iso3166" }, + { name = "iso4217" }, + { name = "lru-dict" }, + { name = "multipledispatch" }, + { name = "networkx" }, + { name = "numexpr" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "patsy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "requests" }, + { name = "scipy" }, + { name = "six" }, + { name = "sqlalchemy" }, + { name = "statsmodels" }, + { name = "tables" }, + { name = "toolz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/73/7f6810bfee01923519038ad361aef6e6f47ecb35283ffed98126eece48a7/zipline_reloaded-3.1.1.tar.gz", hash = "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", size = 12337410, upload-time = "2025-07-19T13:52:34.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/37/96181cca329511d0654ce1b203c07768b29cf41d3808f67d64515a6fcf06/zipline_reloaded-3.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:6a9c7f0d9ad6a0f7604e0330640c0f6f42064b4d60d07be1bcba00002fee9e56", size = 5119266, upload-time = "2025-07-19T13:52:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/d5/49/e18a294e585824993b747f70206c0f357e08d73a49fa91ba67b469945cec/zipline_reloaded-3.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8bda014e3b1d8f6e1f8cd3168a35c1730dccd3233834af4d5638bbba18235469", size = 5026385, upload-time = "2025-07-19T13:52:20.95Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/3d321d6a87504f892154a7bfceffb63b90cb8a2398d8cdf4887be7f7a74c/zipline_reloaded-3.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fa37d5356a11e7f7ad4708dc08bc76f750f6fee900a8a9036c12f8e7d28d5e3", size = 12256401, upload-time = "2025-07-19T13:52:23.166Z" }, + { url = "https://files.pythonhosted.org/packages/fb/82/cb5c1cbad9e28c7a74c4d20f33949f150782f375f90bfca219d9d502bf84/zipline_reloaded-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:77ebe5641def380b3d7a1fd26b101f131f1bd402a6f1a72857b6b866124b9247", size = 4951445, upload-time = "2025-07-19T13:52:25.14Z" }, +] diff --git a/validation/framework_targets.toml b/validation/framework_targets.toml index 4651ed7d..762d12ec 100644 --- a/validation/framework_targets.toml +++ b/validation/framework_targets.toml @@ -17,6 +17,8 @@ immutable_id = "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4" environment = ".venv-vectorbt-pro" python_env_var = "ML4T_VECTORBT_PRO_PYTHON" scenario_matrix = true +required_scenarios = 16 +unsupported_scenarios = 0 [framework.vectorbt_oss] display_name = "VectorBT OSS" @@ -33,6 +35,8 @@ artifact = "vectorbt-1.1.0.tar.gz" environment = ".venv-vectorbt-oss" python_env_var = "ML4T_VECTORBT_OSS_PYTHON" scenario_matrix = true +required_scenarios = 15 +unsupported_scenarios = 1 [framework.backtrader] display_name = "Backtrader" @@ -48,6 +52,8 @@ artifact = "backtrader-1.9.78.123-py2.py3-none-any.whl" environment = ".venv-backtrader" python_env_var = "ML4T_BACKTRADER_PYTHON" scenario_matrix = true +required_scenarios = 16 +unsupported_scenarios = 0 [framework.zipline] display_name = "Zipline Reloaded" @@ -64,6 +70,8 @@ artifact = "zipline_reloaded-3.1.1.tar.gz" environment = ".venv-zipline" python_env_var = "ML4T_ZIPLINE_PYTHON" scenario_matrix = true +required_scenarios = 15 +unsupported_scenarios = 1 [framework.lean] display_name = "LEAN" @@ -80,4 +88,8 @@ artifact = "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c platform_artifact = "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307" cli_version = "1.0.228" cli_immutable_id = "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c" +environment = ".venv-lean" +python_env_var = "ML4T_LEAN_PYTHON" scenario_matrix = false +required_scenarios = 0 +unsupported_scenarios = 0 diff --git a/validation/frameworks/vectorbt_oss.py b/validation/frameworks/vectorbt_oss.py index 9994c0b7..4a23da01 100644 --- a/validation/frameworks/vectorbt_oss.py +++ b/validation/frameworks/vectorbt_oss.py @@ -38,7 +38,7 @@ def run( import vectorbt as vbt except ImportError: raise ImportError( - "VectorBT OSS not installed. Run in .venv-vectorbt environment." + "VectorBT OSS not installed. Run in .venv-vectorbt-oss environment." ) from None constants = scenario.constants diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 4641d4e3..60475a59 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -2,6 +2,7 @@ validation/check_artifacts.py validation/check_coverage.py validation/check_documentation_examples.py validation/check_security.py +validation/build_framework_env.py validation/generate_changelog.py validation/generate_compatibility_snapshot.py validation/generate_parity_claims.py diff --git a/validation/run_all_correctness.py b/validation/run_all_correctness.py index c056e6d7..8953edc8 100644 --- a/validation/run_all_correctness.py +++ b/validation/run_all_correctness.py @@ -243,6 +243,46 @@ def release_gate_passed(records: list[ValidationRecord]) -> bool: return bool(required_records) and all(record.passed for record in required_records) +def matrix_coverage_failures( + records: list[ValidationRecord], + frameworks: list[str], + scenarios: list[str], +) -> list[str]: + """Reject omitted, duplicate, or misclassified framework/scenario pairs.""" + failures: list[str] = [] + expected_pairs = {(framework, scenario) for framework in frameworks for scenario in scenarios} + actual_pairs = [(record.framework, record.scenario_id) for record in records] + duplicate_pairs = sorted(pair for pair, count in Counter(actual_pairs).items() if count > 1) + missing_pairs = sorted(expected_pairs - set(actual_pairs)) + unexpected_pairs = sorted(set(actual_pairs) - expected_pairs) + if duplicate_pairs: + failures.append(f"Duplicate matrix pairs: {duplicate_pairs}") + if missing_pairs: + failures.append(f"Missing matrix pairs: {missing_pairs}") + if unexpected_pairs: + failures.append(f"Unexpected matrix pairs: {unexpected_pairs}") + + if scenarios == list(SCENARIOS): + for framework in frameworks: + target = FRAMEWORK_MANIFEST.targets[framework] + framework_records = [record for record in records if record.framework == framework] + required_count = sum(record.required for record in framework_records) + unsupported_count = sum( + record.status is ValidationStatus.UNSUPPORTED for record in framework_records + ) + if required_count != target.required_scenarios: + failures.append( + f"{framework} required count differs: " + f"{required_count} != {target.required_scenarios}" + ) + if unsupported_count != target.unsupported_scenarios: + failures.append( + f"{framework} unsupported count differs: " + f"{unsupported_count} != {target.unsupported_scenarios}" + ) + return failures + + def write_report(path: Path, records: list[ValidationRecord]) -> None: """Retain the complete machine-readable release-gate result.""" payload = build_report(records, manifest=FRAMEWORK_MANIFEST) @@ -284,6 +324,18 @@ def main() -> int: nonzero = [f"{status}={count}" for status, count in summarize(records).items() if count] print(f"Results: {', '.join(nonzero)}") print(f"Candidate: {args.output}") + selected_frameworks = frameworks or list(FRAMEWORK_MANIFEST.scenario_framework_ids) + selected_scenarios = scenarios or list(SCENARIOS) + coverage_failures = matrix_coverage_failures( + records, + selected_frameworks, + selected_scenarios, + ) + if coverage_failures: + print("Matrix coverage failed:") + for failure in coverage_failures: + print(f"- {failure}") + return 1 full_matrix = frameworks is None and scenarios is None if full_matrix: promotion_failures = promote_candidate(args.output, args.accepted_output) From 9132aa53c1c6fb26a0328b11d350c9dcdb68ea8c Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 13 Aug 2026 23:15:50 -0400 Subject: [PATCH 04/44] fix(validation): align VectorBT targets with native behavior --- .github/workflows/ci.yml | 9 + .github/workflows/private-comparisons.yml | 8 + src/ml4t/backtest/core/order_book.py | 7 +- src/ml4t/backtest/profiles.py | 8 +- tests/compatibility/snapshots/v0.1.json | 12 +- tests/contracts/test_profile_parity_basics.py | 38 ++ tests/contracts/test_release_workflow.py | 2 + .../test_vectorbt_native_evidence.py | 60 +++ tests/contracts/test_vectorbt_pro_adapter.py | 6 +- tests/test_config_wiring.py | 12 +- validation/METHODOLOGY.md | 125 ++--- validation/frameworks/vectorbt_pro.py | 2 +- .../native/evidence/vectorbt_oss-1.1.0.json | 322 +++++++++++++ .../evidence/vectorbt_pro-2026.6.27.json | 322 +++++++++++++ validation/native/vectorbt_behavior.py | 439 ++++++++++++++++++ validation/release_checks.txt | 1 + 16 files changed, 1299 insertions(+), 74 deletions(-) create mode 100644 tests/contracts/test_vectorbt_native_evidence.py create mode 100644 validation/native/evidence/vectorbt_oss-1.1.0.json create mode 100644 validation/native/evidence/vectorbt_pro-2026.6.27.json create mode 100644 validation/native/vectorbt_behavior.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf3c0f08..76b13fc9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -208,6 +208,14 @@ jobs: --framework ${{ matrix.framework }} --evidence-output environment-evidence.json + - name: Measure native VectorBT OSS behavior + if: matrix.framework == 'vectorbt_oss' + run: >- + "${{ matrix.environment }}/bin/python" + validation/native/vectorbt_behavior.py + --framework vectorbt_oss + --output native-evidence.json + - name: Run the complete required scenario matrix run: >- "${{ matrix.environment }}/bin/python" @@ -223,6 +231,7 @@ jobs: path: | environment-evidence.json correctness-candidate.json + native-evidence.json if-no-files-found: error documentation: diff --git a/.github/workflows/private-comparisons.yml b/.github/workflows/private-comparisons.yml index 9ca9a3fe..4ff7ceff 100644 --- a/.github/workflows/private-comparisons.yml +++ b/.github/workflows/private-comparisons.yml @@ -43,6 +43,13 @@ jobs: --framework vectorbt_pro --evidence-output vectorbt-pro-environment.json + - name: Measure native VectorBT Pro behavior + run: >- + .venv-vectorbt-pro/bin/python + validation/native/vectorbt_behavior.py + --framework vectorbt_pro + --output vectorbt-pro-native.json + - name: Run the complete VectorBT Pro scenario matrix run: >- .venv-vectorbt-pro/bin/python @@ -57,6 +64,7 @@ jobs: name: vectorbt-pro-comparison-${{ github.sha }} path: | vectorbt-pro-environment.json + vectorbt-pro-native.json vectorbt-pro-correctness.json if-no-files-found: error retention-days: 90 diff --git a/src/ml4t/backtest/core/order_book.py b/src/ml4t/backtest/core/order_book.py index d7616e65..889dcac1 100644 --- a/src/ml4t/backtest/core/order_book.py +++ b/src/ml4t/backtest/core/order_book.py @@ -2,9 +2,11 @@ from __future__ import annotations +import math from datetime import datetime from typing import TYPE_CHECKING +from ..config import MissingPricePolicy from ..models import calculate_commission from ..types import ExecutionMode, Order, OrderSide, OrderStatus, OrderType, Position from .shared import SubmitOrderOptions, is_exit_order, quantity_zero_tolerance @@ -171,7 +173,10 @@ def _fill_immediately(self, order: Order) -> Order: # Get fill price (close price for same-bar) price = fill.get_fill_price_for_order(order, use_open=False) - if price is None: + missing_price = price is None or not math.isfinite(price) + if missing_price and broker.missing_price_policy is MissingPricePolicy.USE_LAST: + price = broker.get_last_price(order.asset) + if price is None or not math.isfinite(price): order.reject("No price available", "price_unavailable") return order diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index f5afeed2..92732775 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -134,9 +134,10 @@ "partial_fills_allowed": True, "fill_ordering": "exit_first", "entry_order_priority": "submission", + "immediate_fill": True, "rebalance_mode": "hybrid", "rebalance_headroom_pct": 1.0, - "missing_price_policy": "use_last", + "missing_price_policy": "skip", "late_asset_policy": "allow", "late_asset_min_bars": 1, }, @@ -281,11 +282,6 @@ } VECTORBT_STRICT_PROFILE = deepcopy(VECTORBT_PROFILE) -VECTORBT_STRICT_PROFILE["account"]["short_cash_policy"] = "lock_notional" -VECTORBT_STRICT_PROFILE["orders"]["reject_on_insufficient_cash"] = True -VECTORBT_STRICT_PROFILE["orders"]["partial_fills_allowed"] = True -VECTORBT_STRICT_PROFILE["orders"]["fill_ordering"] = "fifo" -VECTORBT_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" BACKTRADER_STRICT_PROFILE = deepcopy(BACKTRADER_PROFILE) BACKTRADER_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index 43fe1f56..d51cfe89 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -1539,9 +1539,10 @@ "orders": { "entry_order_priority": "submission", "fill_ordering": "exit_first", + "immediate_fill": true, "late_asset_min_bars": 1, "late_asset_policy": "allow", - "missing_price_policy": "use_last", + "missing_price_policy": "skip", "partial_fills_allowed": true, "rebalance_headroom_pct": 1.0, "rebalance_mode": "hybrid", @@ -1566,7 +1567,7 @@ "account": { "allow_leverage": false, "allow_short_selling": true, - "short_cash_policy": "lock_notional" + "short_cash_policy": "credit" }, "cash": { "buffer_pct": 0.0, @@ -1582,14 +1583,15 @@ }, "orders": { "entry_order_priority": "submission", - "fill_ordering": "fifo", + "fill_ordering": "exit_first", + "immediate_fill": true, "late_asset_min_bars": 1, "late_asset_policy": "allow", - "missing_price_policy": "use_last", + "missing_price_policy": "skip", "partial_fills_allowed": true, "rebalance_headroom_pct": 1.0, "rebalance_mode": "hybrid", - "reject_on_insufficient_cash": true + "reject_on_insufficient_cash": false }, "position_sizing": { "share_type": "fractional" diff --git a/tests/contracts/test_profile_parity_basics.py b/tests/contracts/test_profile_parity_basics.py index c851182f..1d7aff2f 100644 --- a/tests/contracts/test_profile_parity_basics.py +++ b/tests/contracts/test_profile_parity_basics.py @@ -40,6 +40,12 @@ def on_data(self, timestamp, data, context, broker) -> None: self.done = True +class _BuyOnMissingClose(Strategy): + def on_data(self, timestamp, data, context, broker) -> None: + if timestamp.day == 2: + broker.submit_order("AAPL", 1.0) + + def test_profile_registry_has_expected_core_profiles() -> None: assert list_profiles() == ["backtrader", "default", "lean", "realistic", "vectorbt", "zipline"] @@ -66,6 +72,38 @@ def test_profiles_enforce_expected_entry_timing_contract() -> None: assert 110.0 < zl.trades[0].entry_price < 111.0 # next-bar open with volume slippage +def test_vectorbt_profile_drops_signal_order_with_missing_close() -> None: + prices = ( + _prices() + .vstack( + pl.DataFrame( + { + "timestamp": [datetime(2024, 1, 3)], + "asset": ["AAPL"], + "open": [120.0], + "high": [120.0], + "low": [120.0], + "close": [120.0], + "volume": [1_000_000.0], + } + ) + ) + .with_columns( + pl.when(pl.col("timestamp") == datetime(2024, 1, 2)) + .then(float("nan")) + .otherwise(pl.col(column)) + .alias(column) + for column in ("open", "high", "low", "close") + ) + ) + + result = run_backtest(prices=prices, strategy=_BuyOnMissingClose(), config="vectorbt") + + assert result.fills == [] + assert len(result.rejected_orders) == 1 + assert result.rejected_orders[0].rejection_code == "price_unavailable" + + def test_backtrader_profile_uses_signal_price_stop_basis() -> None: cfg = BacktestConfig.from_preset("backtrader") assert cfg.stop_level_basis == StopLevelBasis.SIGNAL_PRICE diff --git a/tests/contracts/test_release_workflow.py b/tests/contracts/test_release_workflow.py index 5d97a9ce..f1867c83 100644 --- a/tests/contracts/test_release_workflow.py +++ b/tests/contracts/test_release_workflow.py @@ -157,6 +157,7 @@ def test_release_reuses_all_ci_gates_and_publishes_the_exact_candidate() -> None } parity_commands = "\n".join(step.get("run", "") for step in parity["steps"]) assert "validation/build_framework_env.py" in parity_commands + assert "validation/native/vectorbt_behavior.py" in parity_commands assert "validation/run_all_correctness.py" in parity_commands assert "--extra comparison" not in parity_commands build_commands = "\n".join(step.get("run", "") for step in jobs["build"]["steps"]) @@ -198,6 +199,7 @@ def test_private_comparison_workflow_pins_and_retains_evidence() -> None: assert workflow["on"]["workflow_call"]["secrets"]["VECTORBT_PRO_DEPLOY_KEY"]["required"] pro_commands = "\n".join(step.get("run", "") for step in jobs["vectorbt-pro"]["steps"]) assert "validation/build_framework_env.py" in pro_commands + assert "validation/native/vectorbt_behavior.py" in pro_commands assert "validation/run_all_correctness.py" in pro_commands assert "--framework vectorbt_pro" in pro_commands lean_commands = "\n".join(step.get("run", "") for step in jobs["lean"]["steps"]) diff --git a/tests/contracts/test_vectorbt_native_evidence.py b/tests/contracts/test_vectorbt_native_evidence.py new file mode 100644 index 00000000..d9023d36 --- /dev/null +++ b/tests/contracts/test_vectorbt_native_evidence.py @@ -0,0 +1,60 @@ +"""Contracts for retained framework-native VectorBT evidence.""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +_ROOT = Path(__file__).parents[2] +_ORACLE = _ROOT / "validation/native/vectorbt_behavior.py" +_EVIDENCE = _ROOT / "validation/native/evidence" + +EXPECTED_CHECKS = { + "accumulation", + "cash_sharing_and_call_sequence", + "defaults", + "explicit_fill_price", + "fees_and_slippage", + "insufficient_cash_partial_fill", + "integer_signal_dtype", + "long_signal_conflict", + "missing_order_price", + "record_construction", + "short_cash", + "signal_timing_and_default_fill", + "stop_fill", + "target_percent_sizing", + "trailing_stop_extreme_and_intrabar_fill", +} + + +def test_retained_vectorbt_native_evidence_is_complete_and_current() -> None: + oracle_sha256 = hashlib.sha256(_ORACLE.read_bytes()).hexdigest() + identities = { + "vectorbt_oss-1.1.0.json": ( + "vectorbt_oss", + "1.1.0", + "259d2d89fe2e7638baf3ca76c394937cd32b656d", + ), + "vectorbt_pro-2026.6.27.json": ( + "vectorbt_pro", + "2026.6.27", + "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + ), + } + + for filename, (framework, version, commit) in identities.items(): + payload = json.loads((_EVIDENCE / filename).read_text(encoding="utf-8")) + assert payload["schema_version"] == 1 + assert payload["framework"] == framework + assert payload["version"] == version + assert payload["source_commit"] == commit + assert payload["oracle_sha256"] == oracle_sha256 + assert payload["passed"] is True + assert {check["id"] for check in payload["checks"]} == EXPECTED_CHECKS + assert all(check["passed"] for check in payload["checks"]) + assert all(check["actual"] == check["expected"] for check in payload["checks"]) + for location in payload["source_locations"].values(): + assert commit in location["source_url"] + assert location["path"].endswith("portfolio/base.py") diff --git a/tests/contracts/test_vectorbt_pro_adapter.py b/tests/contracts/test_vectorbt_pro_adapter.py index 8a96a40c..e07d9069 100644 --- a/tests/contracts/test_vectorbt_pro_adapter.py +++ b/tests/contracts/test_vectorbt_pro_adapter.py @@ -34,8 +34,8 @@ def _load_adapter(): def test_supported_vectorbt_pro_version_is_explicit() -> None: adapter = _load_adapter() - assert adapter.SUPPORTED_VECTORBT_PRO_VERSION == "2025.12.31" - adapter._require_supported_version("2025.12.31") + assert adapter.SUPPORTED_VECTORBT_PRO_VERSION == "2026.6.27" + adapter._require_supported_version("2026.6.27") def test_unsupported_vectorbt_pro_version_fails_precisely() -> None: @@ -43,7 +43,7 @@ def test_unsupported_vectorbt_pro_version_fails_precisely() -> None: with pytest.raises( RuntimeError, - match=r"requires version 2025\.12\.31, found 2026\.1\.1", + match=r"requires version 2026\.6\.27, found 2026\.1\.1", ): adapter._require_supported_version("2026.1.1") diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index 33994a18..f0a1f81e 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -25,6 +25,7 @@ EntryOrderPriority, ExecutionPrice, FillOrdering, + MissingPricePolicy, ShareType, ShortCashPolicy, SlippageType, @@ -42,6 +43,7 @@ TieredCommission, VolumeShareSlippage, ) +from ml4t.backtest.profiles import get_profile_config from ml4t.backtest.types import OrderSide, Position # --------------------------------------------------------------------------- @@ -398,11 +400,14 @@ def test_credit_proceeds_policy_allows_short_without_full_notional_cash(self): assert pos is not None assert pos.quantity == -10.0 - def test_vectorbt_strict_profile_sets_lock_notional(self): + def test_vectorbt_strict_profile_preserves_native_cash_semantics(self): config = BacktestConfig.from_preset("vectorbt_strict") - assert config.short_cash_policy == ShortCashPolicy.LOCK_NOTIONAL - assert config.fill_ordering == FillOrdering.FIFO + assert config.short_cash_policy == ShortCashPolicy.CREDIT + assert config.fill_ordering == FillOrdering.EXIT_FIRST + assert config.reject_on_insufficient_cash is False + assert config.partial_fills_allowed is True assert config.entry_order_priority == EntryOrderPriority.SUBMISSION + assert get_profile_config("vectorbt_strict") == get_profile_config("vectorbt") def test_zipline_strict_profile_uses_credit(self): config = BacktestConfig.from_preset("zipline_strict") @@ -872,6 +877,7 @@ def test_vectorbt_preset_values(self): assert config.fill_ordering == FillOrdering.EXIT_FIRST assert config.reject_on_insufficient_cash is False assert config.partial_fills_allowed is True + assert config.missing_price_policy == MissingPricePolicy.SKIP def test_realistic_preset_values(self): config = BacktestConfig.from_preset("realistic") diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index fc44f4ce..544aeb94 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -1,6 +1,6 @@ # Validation Methodology -*Last updated: 2026-08-08* +*Last updated: 2026-08-13* ## Core Principle @@ -151,13 +151,35 @@ Update the behavioral difference matrix, profile diffs, and parity results. Complete matrix of how each framework handles every behavioral dimension. +### VectorBT native evidence + +The VectorBT column cites checks from `native/vectorbt_behavior.py`. The checks import only the +frozen framework and its dependencies. Both current targets passed all checks: + +- [VectorBT OSS 1.1.0 evidence](native/evidence/vectorbt_oss-1.1.0.json) +- [VectorBT Pro 2026.6.27 evidence](native/evidence/vectorbt_pro-2026.6.27.json) + +`VBT-S` refers to the `signal_timing_and_default_fill` and `explicit_fill_price` checks. `VBT-R` +refers to `stop_fill` and `trailing_stop_extreme_and_intrabar_fill`. `VBT-C` refers to +`short_cash`, `cash_sharing_and_call_sequence`, and `insufficient_cash_partial_fill`. `VBT-O` +refers to `target_percent_sizing`, `accumulation`, `long_signal_conflict`, and +`missing_order_price`. `VBT-F` refers to `defaults`, `fees_and_slippage`, and +`record_construction`. + +The evidence records the official source address for each frozen implementation. OSS uses +[`Portfolio.from_orders`](https://github.com/polakowo/vectorbt/blob/259d2d89fe2e7638baf3ca76c394937cd32b656d/vectorbt/portfolio/base.py#L1616) +and [`Portfolio.from_signals`](https://github.com/polakowo/vectorbt/blob/259d2d89fe2e7638baf3ca76c394937cd32b656d/vectorbt/portfolio/base.py#L2047). +Pro uses the corresponding methods at +[`Portfolio.from_orders`](https://github.com/polakowo/vectorbt.pro/blob/6e18cf0aa37849cfc20848f40f1d26ecfdc771b4/vectorbtpro/portfolio/base.py#L4145) +and [`Portfolio.from_signals`](https://github.com/polakowo/vectorbt.pro/blob/6e18cf0aa37849cfc20848f40f1d26ecfdc771b4/vectorbtpro/portfolio/base.py#L4646). + ### Execution Timing -| Knob | ml4t Default | VectorBT | Backtrader | Zipline | LEAN | -|------|-------------|----------|------------|---------|------| -| `execution_mode` | next_bar | **same_bar** | next_bar | next_bar | **same_bar** | -| `fill_timing` | next_bar_open | **same_bar** | next_bar_open | next_bar_open | **same_bar** | -| `execution_price` | open | **close** | open | open | **close** | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +|------|-------------|----------|--------------|------------|---------|------| +| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar | next_bar | **same_bar** | +| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open | next_bar_open | **same_bar** | +| `execution_price` | open | **close** | VBT-S | open | open | **close** | VectorBT and LEAN both use same-bar execution with close fills. VectorBT is vectorized (inherently same-bar), while LEAN processes market orders immediately at bar close in its @@ -165,13 +187,13 @@ event-driven loop. All event-driven frameworks (BT, Zipline) except LEAN use nex ### Stop/Risk Configuration -| Knob | ml4t Default | VectorBT | Backtrader | Zipline | LEAN | -|------|-------------|----------|------------|---------|------| -| `stop_fill_mode` | stop_price | stop_price | stop_price | stop_price | stop_price | -| `stop_level_basis` | fill_price | fill_price | **signal_price** | fill_price | fill_price | -| `trail_hwm_source` | close | **bar_extreme** | close | close | close | -| `initial_hwm_source` | fill_price | **bar_high** | fill_price | fill_price | fill_price | -| `trail_stop_timing` | lagged | **intrabar** | lagged | lagged | lagged | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +|------|-------------|----------|--------------|------------|---------|------| +| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price | stop_price | stop_price | +| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price** | fill_price | fill_price | +| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close | close | close | +| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | fill_price | fill_price | fill_price | +| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged | lagged | lagged | Backtrader calculates stop levels from **signal bar close** (the price when the strategy decided to trade), not the actual fill price. This matters when next-bar open differs significantly from @@ -179,54 +201,47 @@ previous close. ### Account & Cash -| Knob | ml4t Default | VectorBT | Backtrader | Zipline | LEAN | -|------|-------------|----------|------------|---------|------| -| `allow_short_selling` | false | **true** | **true** | false | true | -| `allow_leverage` | false | false | **true** | false | true | -| `short_cash_policy` | credit | credit | credit | credit | credit | -| `initial_margin` | 0.5 | -- | **0.5** | -- | varies | -| `long_maint_margin` | 0.25 | -- | **0.25** | -- | varies | -| `short_maint_margin` | 0.30 | -- | **0.30** | -- | varies | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +|------|-------------|----------|--------------|------------|---------|------| +| `allow_short_selling` | false | **true** | VBT-C | **true** | false | true | +| `allow_leverage` | false | false | VBT-C | **true** | false | true | +| `short_cash_policy` | credit | credit | VBT-C | credit | credit | credit | +| `initial_margin` | 0.5 | -- | VBT-C | **0.5** | -- | varies | +| `long_maint_margin` | 0.25 | -- | VBT-C | **0.25** | -- | varies | +| `short_maint_margin` | 0.30 | -- | VBT-C | **0.30** | -- | varies | ### Order Handling -| Knob | ml4t Default | VectorBT | Backtrader | Zipline | LEAN | -|------|-------------|----------|------------|---------|------| -| `fill_ordering` | exit_first | exit_first | **fifo** | exit_first | **exit_first** | -| `entry_order_priority` | submission | submission | submission | submission | submission | -| `rebalance_mode` | incremental | **hybrid** | **snapshot** | **snapshot** | snapshot | -| `rebalance_headroom_pct` | 1.0 | 1.0 | **0.998** | **0.998** | 0.998 | -| `reject_on_insufficient_cash` | true | **false** | true | true | true | -| `partial_fills_allowed` | false | **true** | false | **true** | false | -| `missing_price_policy` | skip | **use_last** | **use_last** | **use_last** | use_last | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +|------|-------------|----------|--------------|------------|---------|------| +| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo** | exit_first | **exit_first** | +| `entry_order_priority` | submission | submission | VBT-C | submission | submission | submission | +| `immediate_fill` | false | **true** | VBT-S, VBT-O | false | false | **true** | +| `rebalance_mode` | incremental | **hybrid** | VBT-O | **snapshot** | **snapshot** | snapshot | +| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | **0.998** | **0.998** | 0.998 | +| `reject_on_insufficient_cash` | true | **false** | VBT-C | true | true | true | +| `partial_fills_allowed` | false | **true** | VBT-C | false | **true** | false | +| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last** | **use_last** | use_last | ### Position Sizing & Costs -| Knob | ml4t Default | VectorBT | Backtrader | Zipline | LEAN | -|------|-------------|----------|------------|---------|------| -| `share_type` | fractional | fractional | **integer** | **integer** | **integer** | -| `signal_processing` | check_position | **process_all** | check_position | check_position | check_position | -| `commission_model` | percentage | **none** | percentage | **per_share** | per_share | -| `commission_rate` | 0.1% | 0% | 0.1% | -- | -- | -| `commission_per_share` | -- | -- | -- | **$0.005** | varies | -| `commission_minimum` | $0 | -- | -- | **$1.00** | varies | -| `slippage_model` | percentage | **none** | percentage | **volume_based** | volume_based | -| `slippage_rate` | 0.1% | 0% | 0.1% | **10%** | varies | - -### "Strict" Profile Additions (for validation parity) - -| Knob | vbt_strict | bt_strict | zip_strict | lean | -|------|-----------|-----------|------------|-------------| -| `short_cash_policy` | **lock_notional** | credit | **credit** | credit | -| `skip_cash_validation` | false | false | **true** | false | -| `reject_on_insufficient_cash` | **true** | true | true | true | -| `fill_ordering` | **fifo** | fifo | exit_first | **exit_first** | -| `next_bar_submission_precheck` | -- | **true** | -- | false | -| `next_bar_simple_cash_check` | -- | **true** | -- | false | -| `allow_short_selling` | -- | -- | **true** | **true** | -| `allow_leverage` | -- | -- | -- | **true** | -| `execution_mode` | -- | **next_bar** | **next_bar** | **next_bar** | -| `execution_price` | -- | **open** | **open** | **open** | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +|------|-------------|----------|--------------|------------|---------|------| +| `share_type` | fractional | fractional | VBT-O | **integer** | **integer** | **integer** | +| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | check position | check position | check position | +| `commission_model` | percentage | **none** | VBT-F | percentage | **per_share** | per_share | +| `commission_rate` | 0.1% | 0% | VBT-F | 0.1% | -- | -- | +| `commission_per_share` | -- | -- | VBT-F | -- | **$0.005** | varies | +| `commission_minimum` | $0 | -- | VBT-F | -- | **$1.00** | varies | +| `slippage_model` | percentage | **none** | VBT-F | percentage | **volume_based** | volume_based | +| `slippage_rate` | 0.1% | 0% | VBT-F | 0.1% | **10%** | varies | + +### Comparison profiles + +`vectorbt_strict` now resolves to the same settings as `vectorbt`. Native evidence does not support +the prior locked-short-proceeds, rejection, or FIFO overrides. Backtrader and Zipline retain +comparison-specific settings until their native checks and current large-scale workloads verify +or replace those settings. --- diff --git a/validation/frameworks/vectorbt_pro.py b/validation/frameworks/vectorbt_pro.py index 15e8a427..a8a4d8c8 100644 --- a/validation/frameworks/vectorbt_pro.py +++ b/validation/frameworks/vectorbt_pro.py @@ -18,7 +18,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) from common.types import FrameworkResult, ScenarioConfig -SUPPORTED_VECTORBT_PRO_VERSION = "2025.12.31" +SUPPORTED_VECTORBT_PRO_VERSION = "2026.6.27" def _require_supported_version(actual_version: str) -> None: diff --git a/validation/native/evidence/vectorbt_oss-1.1.0.json b/validation/native/evidence/vectorbt_oss-1.1.0.json new file mode 100644 index 00000000..de152999 --- /dev/null +++ b/validation/native/evidence/vectorbt_oss-1.1.0.json @@ -0,0 +1,322 @@ +{ + "checks": [ + { + "actual": { + "accumulate": false, + "allow_partial": true, + "call_seq": "default", + "cash_sharing": false, + "fees": 0.0, + "ffill_val_price": true, + "fillna_close": true, + "fixed_fees": 0.0, + "raise_reject": false, + "slippage": 0.0, + "update_value": false, + "upon_dir_conflict": "ignore", + "upon_long_conflict": "ignore", + "upon_opposite_entry": "reversereduce", + "upon_short_conflict": "ignore" + }, + "expected": { + "accumulate": false, + "allow_partial": true, + "call_seq": "default", + "cash_sharing": false, + "fees": 0.0, + "ffill_val_price": true, + "fillna_close": true, + "fixed_fees": 0.0, + "raise_reject": false, + "slippage": 0.0, + "update_value": false, + "upon_dir_conflict": "ignore", + "upon_long_conflict": "ignore", + "upon_opposite_entry": "reversereduce", + "upon_short_conflict": "ignore" + }, + "id": "defaults", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "prices": [ + 100.0, + 110.0 + ], + "timestamps": [ + "2024-01-01 00:00:00", + "2024-01-02 00:00:00" + ] + }, + "expected": { + "prices": [ + 100.0, + 110.0 + ], + "timestamps": [ + "2024-01-01 00:00:00", + "2024-01-02 00:00:00" + ] + }, + "id": "signal_timing_and_default_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 99.0, + 109.0 + ], + "expected": [ + 99.0, + 109.0 + ], + "id": "explicit_fill_price", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 5.0, + 5.0 + ], + "expected": [ + 5.0, + 5.0 + ], + "id": "target_percent_sizing", + "passed": true, + "source": "from_orders" + }, + { + "actual": { + "default": [ + "a" + ], + "reversed": [ + "b" + ] + }, + "expected": { + "default": [ + "a" + ], + "reversed": [ + "b" + ] + }, + "id": "cash_sharing_and_call_sequence", + "passed": true, + "source": "from_orders" + }, + { + "actual": { + "default_orders": 1, + "enabled_orders": 2 + }, + "expected": { + "default_orders": 1, + "enabled_orders": 2 + }, + "id": "accumulation", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "default": [ + "Buy" + ], + "entry": [ + "Buy", + "Buy" + ], + "exit": [ + "Buy", + "Sell" + ] + }, + "expected": { + "default": [ + "Buy" + ], + "entry": [ + "Buy", + "Buy" + ], + "exit": [ + "Buy", + "Sell" + ] + }, + "id": "long_signal_conflict", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "cash": [ + 1100.0, + 990.0 + ], + "sides": [ + "Sell", + "Buy" + ] + }, + "expected": { + "cash": [ + 1100.0, + 990.0 + ], + "sides": [ + "Sell", + "Buy" + ] + }, + "id": "short_cash", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 100.0, + 90.0 + ], + "expected": [ + 100.0, + 90.0 + ], + "id": "stop_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 100.0, + 108.0 + ], + "expected": [ + 100.0, + 108.0 + ], + "id": "trailing_stop_extreme_and_intrabar_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "fees": [ + 3.01, + 2.99 + ], + "prices": [ + 101.0, + 99.0 + ] + }, + "expected": { + "fees": [ + 3.01, + 2.99 + ], + "prices": [ + 101.0, + 99.0 + ] + }, + "id": "fees_and_slippage", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "cash": [ + 900.0, + 900.0, + 900.0 + ], + "order_count": 1 + }, + "expected": { + "cash": [ + 900.0, + 900.0, + 900.0 + ], + "order_count": 1 + }, + "id": "missing_order_price", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 1.0 + ], + "expected": [ + 1.0 + ], + "id": "insufficient_cash_partial_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "direction": "Long", + "order_ids": [ + 0, + 1 + ], + "pnl": 10.0, + "status": "Closed", + "trade_count": 1 + }, + "expected": { + "direction": "Long", + "order_ids": [ + 0, + 1 + ], + "pnl": 10.0, + "status": "Closed", + "trade_count": 1 + }, + "id": "record_construction", + "passed": true, + "source": "from_signals" + }, + { + "actual": "accepted", + "expected": "accepted", + "id": "integer_signal_dtype", + "passed": true, + "source": "from_signals" + } + ], + "framework": "vectorbt_oss", + "oracle_sha256": "c15716833162f16d82b3efd3059f2b28a3e1c4b816a3bf721a82d97b95711b98", + "package": "vectorbt", + "passed": true, + "schema_version": 1, + "source_commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "source_locations": { + "from_orders": { + "line": 1616, + "module": "vectorbt.portfolio.base", + "path": "vectorbt/portfolio/base.py", + "qualname": "Portfolio.from_orders", + "source_url": "https://github.com/polakowo/vectorbt/blob/259d2d89fe2e7638baf3ca76c394937cd32b656d/vectorbt/portfolio/base.py#L1616" + }, + "from_signals": { + "line": 2047, + "module": "vectorbt.portfolio.base", + "path": "vectorbt/portfolio/base.py", + "qualname": "Portfolio.from_signals", + "source_url": "https://github.com/polakowo/vectorbt/blob/259d2d89fe2e7638baf3ca76c394937cd32b656d/vectorbt/portfolio/base.py#L2047" + } + }, + "version": "1.1.0" +} diff --git a/validation/native/evidence/vectorbt_pro-2026.6.27.json b/validation/native/evidence/vectorbt_pro-2026.6.27.json new file mode 100644 index 00000000..2365fdb0 --- /dev/null +++ b/validation/native/evidence/vectorbt_pro-2026.6.27.json @@ -0,0 +1,322 @@ +{ + "checks": [ + { + "actual": { + "accumulate": false, + "allow_partial": true, + "call_seq": null, + "cash_sharing": false, + "fees": 0.0, + "ffill_val_price": true, + "fillna_close": true, + "fixed_fees": 0.0, + "raise_reject": false, + "slippage": 0.0, + "update_value": false, + "upon_dir_conflict": "ignore", + "upon_long_conflict": "ignore", + "upon_opposite_entry": "reversereduce", + "upon_short_conflict": "ignore" + }, + "expected": { + "accumulate": false, + "allow_partial": true, + "call_seq": null, + "cash_sharing": false, + "fees": 0.0, + "ffill_val_price": true, + "fillna_close": true, + "fixed_fees": 0.0, + "raise_reject": false, + "slippage": 0.0, + "update_value": false, + "upon_dir_conflict": "ignore", + "upon_long_conflict": "ignore", + "upon_opposite_entry": "reversereduce", + "upon_short_conflict": "ignore" + }, + "id": "defaults", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "prices": [ + 100.0, + 110.0 + ], + "timestamps": [ + "2024-01-01 00:00:00", + "2024-01-02 00:00:00" + ] + }, + "expected": { + "prices": [ + 100.0, + 110.0 + ], + "timestamps": [ + "2024-01-01 00:00:00", + "2024-01-02 00:00:00" + ] + }, + "id": "signal_timing_and_default_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 99.0, + 109.0 + ], + "expected": [ + 99.0, + 109.0 + ], + "id": "explicit_fill_price", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 5.0, + 5.0 + ], + "expected": [ + 5.0, + 5.0 + ], + "id": "target_percent_sizing", + "passed": true, + "source": "from_orders" + }, + { + "actual": { + "default": [ + "a" + ], + "reversed": [ + "b" + ] + }, + "expected": { + "default": [ + "a" + ], + "reversed": [ + "b" + ] + }, + "id": "cash_sharing_and_call_sequence", + "passed": true, + "source": "from_orders" + }, + { + "actual": { + "default_orders": 1, + "enabled_orders": 2 + }, + "expected": { + "default_orders": 1, + "enabled_orders": 2 + }, + "id": "accumulation", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "default": [ + "Buy" + ], + "entry": [ + "Buy", + "Buy" + ], + "exit": [ + "Buy", + "Sell" + ] + }, + "expected": { + "default": [ + "Buy" + ], + "entry": [ + "Buy", + "Buy" + ], + "exit": [ + "Buy", + "Sell" + ] + }, + "id": "long_signal_conflict", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "cash": [ + 1100.0, + 990.0 + ], + "sides": [ + "Sell", + "Buy" + ] + }, + "expected": { + "cash": [ + 1100.0, + 990.0 + ], + "sides": [ + "Sell", + "Buy" + ] + }, + "id": "short_cash", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 100.0, + 90.0 + ], + "expected": [ + 100.0, + 90.0 + ], + "id": "stop_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 100.0, + 108.0 + ], + "expected": [ + 100.0, + 108.0 + ], + "id": "trailing_stop_extreme_and_intrabar_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "fees": [ + 3.01, + 2.99 + ], + "prices": [ + 101.0, + 99.0 + ] + }, + "expected": { + "fees": [ + 3.01, + 2.99 + ], + "prices": [ + 101.0, + 99.0 + ] + }, + "id": "fees_and_slippage", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "cash": [ + 900.0, + 900.0, + 900.0 + ], + "order_count": 1 + }, + "expected": { + "cash": [ + 900.0, + 900.0, + 900.0 + ], + "order_count": 1 + }, + "id": "missing_order_price", + "passed": true, + "source": "from_signals" + }, + { + "actual": [ + 1.0 + ], + "expected": [ + 1.0 + ], + "id": "insufficient_cash_partial_fill", + "passed": true, + "source": "from_signals" + }, + { + "actual": { + "direction": "Long", + "order_ids": [ + 0, + 1 + ], + "pnl": 10.0, + "status": "Closed", + "trade_count": 1 + }, + "expected": { + "direction": "Long", + "order_ids": [ + 0, + 1 + ], + "pnl": 10.0, + "status": "Closed", + "trade_count": 1 + }, + "id": "record_construction", + "passed": true, + "source": "from_signals" + }, + { + "actual": "rejected", + "expected": "rejected", + "id": "integer_signal_dtype", + "passed": true, + "source": "from_signals" + } + ], + "framework": "vectorbt_pro", + "oracle_sha256": "c15716833162f16d82b3efd3059f2b28a3e1c4b816a3bf721a82d97b95711b98", + "package": "vectorbtpro", + "passed": true, + "schema_version": 1, + "source_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "source_locations": { + "from_orders": { + "line": 4145, + "module": "vectorbtpro.portfolio.base", + "path": "vectorbtpro/portfolio/base.py", + "qualname": "Portfolio.from_orders", + "source_url": "https://github.com/polakowo/vectorbt.pro/blob/6e18cf0aa37849cfc20848f40f1d26ecfdc771b4/vectorbtpro/portfolio/base.py#L4145" + }, + "from_signals": { + "line": 4646, + "module": "vectorbtpro.portfolio.base", + "path": "vectorbtpro/portfolio/base.py", + "qualname": "Portfolio.from_signals", + "source_url": "https://github.com/polakowo/vectorbt.pro/blob/6e18cf0aa37849cfc20848f40f1d26ecfdc771b4/vectorbtpro/portfolio/base.py#L4646" + } + }, + "version": "2026.6.27" +} diff --git a/validation/native/vectorbt_behavior.py b/validation/native/vectorbt_behavior.py new file mode 100644 index 00000000..b94c62b9 --- /dev/null +++ b/validation/native/vectorbt_behavior.py @@ -0,0 +1,439 @@ +#!/usr/bin/env python3 +"""Measure current VectorBT behavior without importing ML4T comparison code.""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib +import importlib.metadata +import inspect +import json +import math +import sys +from pathlib import Path +from typing import Any + +import numpy as np +import pandas as pd + +TARGETS = { + "vectorbt_oss": { + "package": "vectorbt", + "version": "1.1.0", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "repository": "https://github.com/polakowo/vectorbt", + }, + "vectorbt_pro": { + "package": "vectorbtpro", + "version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "repository": "https://github.com/polakowo/vectorbt.pro", + }, +} + + +def _bool(values: list[int]) -> np.ndarray: + return np.asarray(values, dtype=bool) + + +def _orders(portfolio: Any) -> list[dict[str, Any]]: + return portfolio.orders.records_readable.to_dict("records") + + +def _trades(portfolio: Any) -> list[dict[str, Any]]: + return portfolio.trades.records_readable.to_dict("records") + + +def _cash(portfolio: Any) -> list[float]: + value = portfolio.cash() if callable(portfolio.cash) else portfolio.cash + return np.asarray(value, dtype=float).tolist() + + +def _source_location(package: Any, function: Any, target: dict[str, str]) -> dict: + source_file = inspect.getsourcefile(function) + if source_file is None: + raise RuntimeError(f"Could not locate source for {function}") + package_root = Path(package.__file__).resolve().parent.parent + relative_path = Path(source_file).resolve().relative_to(package_root).as_posix() + line = inspect.getsourcelines(function)[1] + return { + "module": function.__module__, + "qualname": function.__qualname__, + "path": relative_path, + "line": line, + "source_url": (f"{target['repository']}/blob/{target['commit']}/{relative_path}#L{line}"), + } + + +def _defaults(framework: str, vbt: Any) -> dict[str, Any]: + portfolio = vbt.settings.portfolio + if framework == "vectorbt_pro": + signals = portfolio["from_signals"] + return { + "accumulate": signals["accumulate"], + "allow_partial": portfolio["allow_partial"], + "call_seq": portfolio["call_seq"], + "cash_sharing": portfolio["cash_sharing"], + "fees": portfolio["fees"], + "ffill_val_price": portfolio["ffill_val_price"], + "fillna_close": portfolio["fillna_close"], + "fixed_fees": portfolio["fixed_fees"], + "raise_reject": portfolio["raise_reject"], + "slippage": portfolio["slippage"], + "upon_dir_conflict": signals["upon_dir_conflict"], + "upon_long_conflict": signals["upon_long_conflict"], + "upon_opposite_entry": signals["upon_opposite_entry"], + "upon_short_conflict": signals["upon_short_conflict"], + "update_value": portfolio["update_value"], + } + return { + key: portfolio[key] + for key in ( + "accumulate", + "allow_partial", + "call_seq", + "cash_sharing", + "fees", + "ffill_val_price", + "fillna_close", + "fixed_fees", + "raise_reject", + "slippage", + "upon_dir_conflict", + "upon_long_conflict", + "upon_opposite_entry", + "upon_short_conflict", + "update_value", + ) + } + + +def _expected_defaults(framework: str) -> dict[str, Any]: + return { + "accumulate": False, + "allow_partial": True, + "call_seq": None if framework == "vectorbt_pro" else "default", + "cash_sharing": False, + "fees": 0.0, + "ffill_val_price": True, + "fillna_close": True, + "fixed_fees": 0.0, + "raise_reject": False, + "slippage": 0.0, + "upon_dir_conflict": "ignore", + "upon_long_conflict": "ignore", + "upon_opposite_entry": "reversereduce", + "upon_short_conflict": "ignore", + "update_value": False, + } + + +def _behavior_checks(framework: str, vbt: Any) -> list[tuple[str, Any, Any]]: + index = pd.date_range("2024-01-01", periods=3) + close = pd.Series([100.0, 110.0, 120.0], index=index) + entries = _bool([1, 0, 0]) + exits = _bool([0, 1, 0]) + + signal_pf = vbt.Portfolio.from_signals( + close, entries=entries, exits=exits, size=1, init_cash=1_000 + ) + signal_orders = _orders(signal_pf) + time_key = "Fill Index" if framework == "vectorbt_pro" else "Timestamp" + + explicit_pf = vbt.Portfolio.from_signals( + close, + entries=entries, + exits=exits, + price=pd.Series([99.0, 109.0, 119.0], index=index), + size=1, + init_cash=1_000, + ) + target_pf = vbt.Portfolio.from_orders( + pd.Series([100.0, 200.0], index=index[:2]), + size=[0.5, 0.0], + size_type="targetpercent", + init_cash=1_000, + ) + shared_close = pd.DataFrame([[100.0, 100.0]], index=index[:1], columns=pd.Index(["a", "b"])) + shared_default = vbt.Portfolio.from_orders( + shared_close, + size=1, + init_cash=100, + cash_sharing=True, + group_by=True, + ) + shared_reversed = vbt.Portfolio.from_orders( + shared_close, + size=1, + init_cash=100, + cash_sharing=True, + group_by=True, + call_seq="reversed", + ) + accumulate_default = vbt.Portfolio.from_signals( + close, entries=_bool([1, 1, 0]), exits=False, size=1, init_cash=1_000 + ) + accumulate_true = vbt.Portfolio.from_signals( + close, + entries=_bool([1, 1, 0]), + exits=False, + size=1, + accumulate=True, + init_cash=1_000, + ) + conflict_kwargs = { + "entries": _bool([1, 1, 0]), + "exits": _bool([0, 1, 0]), + "size": 1, + "accumulate": True, + "init_cash": 1_000, + } + conflict_default = vbt.Portfolio.from_signals(close, **conflict_kwargs) + conflict_entry = vbt.Portfolio.from_signals( + close, **conflict_kwargs, upon_long_conflict="entry" + ) + conflict_exit = vbt.Portfolio.from_signals(close, **conflict_kwargs, upon_long_conflict="exit") + short_pf = vbt.Portfolio.from_signals( + close, + short_entries=entries, + short_exits=exits, + size=1, + init_cash=1_000, + ) + stop_pf = vbt.Portfolio.from_signals( + pd.Series([100.0, 95.0, 100.0], index=index), + open=pd.Series([100.0, 100.0, 100.0], index=index), + high=pd.Series([101.0, 101.0, 101.0], index=index), + low=pd.Series([99.0, 85.0, 99.0], index=index), + entries=entries, + size=1, + sl_stop=0.1, + init_cash=1_000, + ) + trailing_kwargs: dict[str, Any] = { + "close": pd.Series( + [100.0, 110.0, 107.0, 107.0], index=pd.date_range("2024-01-01", periods=4) + ), + "open": pd.Series( + [100.0, 110.0, 109.0, 107.0], index=pd.date_range("2024-01-01", periods=4) + ), + "high": pd.Series( + [101.0, 120.0, 110.0, 108.0], index=pd.date_range("2024-01-01", periods=4) + ), + "low": pd.Series([99.0, 109.0, 105.0, 106.0], index=pd.date_range("2024-01-01", periods=4)), + "entries": _bool([1, 0, 0, 0]), + "size": 1, + "init_cash": 1_000, + } + if framework == "vectorbt_pro": + trailing_kwargs["tsl_stop"] = 0.1 + else: + trailing_kwargs["sl_stop"] = 0.1 + trailing_kwargs["sl_trail"] = True + trailing_pf = vbt.Portfolio.from_signals(**trailing_kwargs) + cost_pf = vbt.Portfolio.from_signals( + pd.Series([100.0, 100.0], index=index[:2]), + entries=_bool([1, 0]), + exits=_bool([0, 1]), + size=1, + fees=0.01, + fixed_fees=2, + slippage=0.01, + init_cash=1_000, + ) + missing_pf = vbt.Portfolio.from_signals( + pd.Series([100.0, np.nan, 110.0], index=index), + entries=entries, + exits=exits, + size=1, + init_cash=1_000, + ) + partial_pf = vbt.Portfolio.from_signals( + pd.Series([100.0]), + entries=_bool([1]), + size=2, + init_cash=100, + ) + trade = _trades(signal_pf)[0] + dtype_result: str + try: + vbt.Portfolio.from_signals( + close, entries=np.asarray([1, 0, 0]), exits=np.asarray([0, 1, 0]), size=1 + ) + dtype_result = "accepted" + except AssertionError: + dtype_result = "rejected" + + return [ + ("defaults", _defaults(framework, vbt), _expected_defaults(framework)), + ( + "signal_timing_and_default_fill", + { + "timestamps": [str(order[time_key]) for order in signal_orders], + "prices": [order["Price"] for order in signal_orders], + }, + { + "timestamps": ["2024-01-01 00:00:00", "2024-01-02 00:00:00"], + "prices": [100.0, 110.0], + }, + ), + ( + "explicit_fill_price", + [order["Price"] for order in _orders(explicit_pf)], + [99.0, 109.0], + ), + ( + "target_percent_sizing", + [order["Size"] for order in _orders(target_pf)], + [5.0, 5.0], + ), + ( + "cash_sharing_and_call_sequence", + { + "default": [_orders(shared_default)[0]["Column"]], + "reversed": [_orders(shared_reversed)[0]["Column"]], + }, + {"default": ["a"], "reversed": ["b"]}, + ), + ( + "accumulation", + { + "default_orders": len(_orders(accumulate_default)), + "enabled_orders": len(_orders(accumulate_true)), + }, + {"default_orders": 1, "enabled_orders": 2}, + ), + ( + "long_signal_conflict", + { + "default": [order["Side"] for order in _orders(conflict_default)], + "entry": [order["Side"] for order in _orders(conflict_entry)], + "exit": [order["Side"] for order in _orders(conflict_exit)], + }, + {"default": ["Buy"], "entry": ["Buy", "Buy"], "exit": ["Buy", "Sell"]}, + ), + ( + "short_cash", + {"cash": _cash(short_pf)[:2], "sides": [order["Side"] for order in _orders(short_pf)]}, + {"cash": [1_100.0, 990.0], "sides": ["Sell", "Buy"]}, + ), + ("stop_fill", [order["Price"] for order in _orders(stop_pf)], [100.0, 90.0]), + ( + "trailing_stop_extreme_and_intrabar_fill", + [order["Price"] for order in _orders(trailing_pf)], + [100.0, 108.0], + ), + ( + "fees_and_slippage", + { + "fees": [order["Fees"] for order in _orders(cost_pf)], + "prices": [order["Price"] for order in _orders(cost_pf)], + }, + {"fees": [3.01, 2.99], "prices": [101.0, 99.0]}, + ), + ( + "missing_order_price", + {"order_count": len(_orders(missing_pf)), "cash": _cash(missing_pf)}, + {"order_count": 1, "cash": [900.0, 900.0, 900.0]}, + ), + ( + "insufficient_cash_partial_fill", + [order["Size"] for order in _orders(partial_pf)], + [1.0], + ), + ( + "record_construction", + { + "direction": trade["Direction"], + "order_ids": [order["Order Id"] for order in signal_orders], + "pnl": trade["PnL"], + "status": trade["Status"], + "trade_count": len(_trades(signal_pf)), + }, + { + "direction": "Long", + "order_ids": [0, 1], + "pnl": 10.0, + "status": "Closed", + "trade_count": 1, + }, + ), + ( + "integer_signal_dtype", + dtype_result, + "rejected" if framework == "vectorbt_pro" else "accepted", + ), + ] + + +def _equal(actual: Any, expected: Any) -> bool: + if isinstance(actual, float) and isinstance(expected, (float, int)): + return math.isclose(actual, float(expected), rel_tol=0.0, abs_tol=1e-12) + if isinstance(actual, list) and isinstance(expected, list) and len(actual) == len(expected): + return all(_equal(left, right) for left, right in zip(actual, expected, strict=True)) + if isinstance(actual, dict) and isinstance(expected, dict) and actual.keys() == expected.keys(): + return all(_equal(actual[key], expected[key]) for key in actual) + return bool(actual == expected) + + +def run(framework: str) -> dict[str, Any]: + """Execute the frozen framework directly and return native evidence.""" + target = TARGETS[framework] + vbt = importlib.import_module(target["package"]) + version = importlib.metadata.version(target["package"]) + if version != target["version"]: + raise RuntimeError(f"{target['package']} version differs: {version} != {target['version']}") + + source_locations = { + "from_orders": _source_location(vbt, vbt.Portfolio.from_orders, target), + "from_signals": _source_location(vbt, vbt.Portfolio.from_signals, target), + } + checks: list[dict[str, Any]] = [] + for check_id, actual, expected in _behavior_checks(framework, vbt): + checks.append( + { + "id": check_id, + "actual": actual, + "expected": expected, + "passed": _equal(actual, expected), + "source": "from_orders" + if check_id in {"target_percent_sizing", "cash_sharing_and_call_sequence"} + else "from_signals", + } + ) + return { + "schema_version": 1, + "oracle_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), + "framework": framework, + "package": target["package"], + "version": version, + "source_commit": target["commit"], + "source_locations": source_locations, + "checks": checks, + "passed": all(check["passed"] for check in checks), + } + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--framework", choices=tuple(TARGETS), required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + try: + evidence = run(args.framework) + except (ImportError, OSError, RuntimeError, ValueError) as error: + print(f"VectorBT native behavior run failed: {error}", file=sys.stderr) + return 2 + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8") + failed = [check["id"] for check in evidence["checks"] if not check["passed"]] + if failed: + print(f"VectorBT native behavior differs: {failed}", file=sys.stderr) + return 1 + print(f"VectorBT native behavior passed: {len(evidence['checks'])} checks") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 60475a59..263370f1 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -16,4 +16,5 @@ validation/common/framework_registry.py validation/common/ml4t_runner.py validation/common/provenance.py validation/common/types.py +validation/native/vectorbt_behavior.py validation/scenarios/definitions.py From 5a58020ce65b4605400d999751616ebff60e3738 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 13 Aug 2026 23:36:00 -0400 Subject: [PATCH 05/44] fix(validation): align Backtrader profile with native behavior --- .github/workflows/ci.yml | 7 + src/ml4t/backtest/config.py | 2 + src/ml4t/backtest/execution/fill_executor.py | 22 +- src/ml4t/backtest/profiles.py | 20 +- tests/compatibility/snapshots/v0.1.json | 48 +- .../test_backtrader_native_evidence.py | 51 ++ tests/contracts/test_profile_parity_basics.py | 57 +- tests/contracts/test_release_workflow.py | 1 + tests/test_config_wiring.py | 7 + validation/METHODOLOGY.md | 79 +- validation/native/backtrader_behavior.py | 678 ++++++++++++++++++ .../evidence/backtrader-1.9.78.123.json | 514 +++++++++++++ validation/release_checks.txt | 1 + 13 files changed, 1410 insertions(+), 77 deletions(-) create mode 100644 tests/contracts/test_backtrader_native_evidence.py create mode 100644 validation/native/backtrader_behavior.py create mode 100644 validation/native/evidence/backtrader-1.9.78.123.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76b13fc9..1d6fcb78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -216,6 +216,13 @@ jobs: --framework vectorbt_oss --output native-evidence.json + - name: Measure native Backtrader behavior + if: matrix.framework == 'backtrader' + run: >- + "${{ matrix.environment }}/bin/python" + validation/native/backtrader_behavior.py + --output native-evidence.json + - name: Run the complete required scenario matrix run: >- "${{ matrix.environment }}/bin/python" diff --git a/src/ml4t/backtest/config.py b/src/ml4t/backtest/config.py index 93c12026..8e5f9736 100644 --- a/src/ml4t/backtest/config.py +++ b/src/ml4t/backtest/config.py @@ -262,6 +262,7 @@ class InitialHwmSource(str, Enum): Controls what price is used for HWM when a new position is created: - FILL_PRICE: Use the actual fill price including slippage (default) + - SIGNAL_PRICE: Use the price observed when the entry order was submitted - BAR_CLOSE: Use the bar's close price - BAR_HIGH: Use the bar's high price (VBT Pro with OHLC data) @@ -271,6 +272,7 @@ class InitialHwmSource(str, Enum): """ FILL_PRICE = "fill_price" # Use fill price (default, most frameworks) + SIGNAL_PRICE = "signal_price" # Use the entry order's signal price (Backtrader) BAR_CLOSE = "bar_close" # Use bar's close BAR_HIGH = "bar_high" # Use bar's high (VBT Pro with OHLC) diff --git a/src/ml4t/backtest/execution/fill_executor.py b/src/ml4t/backtest/execution/fill_executor.py index 7567e74a..8f52d89f 100644 --- a/src/ml4t/backtest/execution/fill_executor.py +++ b/src/ml4t/backtest/execution/fill_executor.py @@ -435,7 +435,9 @@ def _update_position(self, ctx: FillContext) -> float: self._scale_position(ctx, pos, old_qty, new_qty) return ctx.commission - def _get_initial_hwm(self, asset: str, fill_price: float) -> float: + def _get_initial_hwm( + self, asset: str, fill_price: float, signal_price: float | None = None + ) -> float: """Get initial high water mark based on configuration. This is the single source of truth for HWM initialization, @@ -449,6 +451,8 @@ def _get_initial_hwm(self, asset: str, fill_price: float) -> float: Initial HWM value based on configuration """ broker = self.broker + if broker.initial_hwm_source == InitialHwmSource.SIGNAL_PRICE: + return signal_price if signal_price is not None else fill_price if broker.initial_hwm_source == InitialHwmSource.BAR_HIGH: return self.market.highs.get(asset, fill_price) elif broker.initial_hwm_source == InitialHwmSource.BAR_CLOSE: @@ -456,7 +460,9 @@ def _get_initial_hwm(self, asset: str, fill_price: float) -> float: else: return fill_price - def _get_initial_lwm(self, asset: str, fill_price: float) -> float: + def _get_initial_lwm( + self, asset: str, fill_price: float, signal_price: float | None = None + ) -> float: """Get initial low water mark based on configuration. For VBT Pro compatibility with OHLC data, LWM should be initialized @@ -471,6 +477,8 @@ def _get_initial_lwm(self, asset: str, fill_price: float) -> float: Initial LWM value based on configuration """ broker = self.broker + if broker.initial_hwm_source == InitialHwmSource.SIGNAL_PRICE: + return signal_price if signal_price is not None else fill_price # When using BAR_HIGH for HWM, use BAR_LOW for LWM if broker.initial_hwm_source == InitialHwmSource.BAR_HIGH: return self.market.lows.get(asset, fill_price) @@ -513,8 +521,9 @@ def _create_position(self, ctx: FillContext) -> None: broker = self.broker order = ctx.order - initial_hwm = self._get_initial_hwm(order.asset, ctx.fill_price) - initial_lwm = self._get_initial_lwm(order.asset, ctx.fill_price) + signal_price = getattr(order, "_signal_price", None) + initial_hwm = self._get_initial_hwm(order.asset, ctx.fill_price, signal_price) + initial_lwm = self._get_initial_lwm(order.asset, ctx.fill_price, signal_price) context = self._build_position_context(order) pos = Position( @@ -658,8 +667,9 @@ def _flip_position( self.record_pnl(order.asset, pnl) # Create new position in opposite direction - initial_hwm = self._get_initial_hwm(order.asset, ctx.fill_price) - initial_lwm = self._get_initial_lwm(order.asset, ctx.fill_price) + signal_price = getattr(order, "_signal_price", None) + initial_hwm = self._get_initial_hwm(order.asset, ctx.fill_price, signal_price) + initial_lwm = self._get_initial_lwm(order.asset, ctx.fill_price, signal_price) context = self._build_position_context(order) self.account.positions[order.asset] = Position( diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index 92732775..d212f224 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -53,10 +53,7 @@ BACKTRADER_PROFILE = { "account": { "allow_short_selling": True, - "allow_leverage": True, - "initial_margin": 0.5, - "long_maintenance_margin": 0.25, - "short_maintenance_margin": 0.30, + "allow_leverage": False, "short_cash_policy": "credit", }, "execution": { @@ -67,18 +64,19 @@ "stop_fill_mode": "stop_price", "stop_level_basis": "signal_price", "trail_hwm_source": "close", + "initial_hwm_source": "signal_price", "trail_stop_timing": "lagged", }, "position_sizing": { "share_type": "integer", }, "commission": { - "model": "percentage", - "rate": 0.001, + "model": "none", + "rate": 0.0, }, "slippage": { - "model": "percentage", - "rate": 0.001, + "model": "none", + "rate": 0.0, }, "cash": { "initial": 100000.0, @@ -90,10 +88,10 @@ "fill_ordering": "fifo", "entry_order_priority": "submission", "rebalance_mode": "snapshot", - "rebalance_headroom_pct": 0.998, + "rebalance_headroom_pct": 1.0, "missing_price_policy": "use_last", - "late_asset_policy": "require_history", - "late_asset_min_bars": 2, + "late_asset_policy": "allow", + "late_asset_min_bars": 1, }, } diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index d51cfe89..e67a3b5c 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -754,6 +754,10 @@ "name": "FILL_PRICE", "value": "fill_price" }, + { + "name": "SIGNAL_PRICE", + "value": "signal_price" + }, { "name": "BAR_CLOSE", "value": "bar_close" @@ -1200,20 +1204,17 @@ "canonical": { "backtrader": { "account": { - "allow_leverage": true, + "allow_leverage": false, "allow_short_selling": true, - "initial_margin": 0.5, - "long_maintenance_margin": 0.25, - "short_cash_policy": "credit", - "short_maintenance_margin": 0.3 + "short_cash_policy": "credit" }, "cash": { "buffer_pct": 0.0, "initial": 100000.0 }, "commission": { - "model": "percentage", - "rate": 0.001 + "model": "none", + "rate": 0.0 }, "execution": { "execution_mode": "next_bar", @@ -1222,11 +1223,11 @@ "orders": { "entry_order_priority": "submission", "fill_ordering": "fifo", - "late_asset_min_bars": 2, - "late_asset_policy": "require_history", + "late_asset_min_bars": 1, + "late_asset_policy": "allow", "missing_price_policy": "use_last", "partial_fills_allowed": false, - "rebalance_headroom_pct": 0.998, + "rebalance_headroom_pct": 1.0, "rebalance_mode": "snapshot", "reject_on_insufficient_cash": true }, @@ -1234,10 +1235,11 @@ "share_type": "integer" }, "slippage": { - "model": "percentage", - "rate": 0.001 + "model": "none", + "rate": 0.0 }, "stops": { + "initial_hwm_source": "signal_price", "stop_fill_mode": "stop_price", "stop_level_basis": "signal_price", "trail_hwm_source": "close", @@ -1246,20 +1248,17 @@ }, "backtrader_strict": { "account": { - "allow_leverage": true, + "allow_leverage": false, "allow_short_selling": true, - "initial_margin": 0.5, - "long_maintenance_margin": 0.25, - "short_cash_policy": "credit", - "short_maintenance_margin": 0.3 + "short_cash_policy": "credit" }, "cash": { "buffer_pct": 0.0, "initial": 100000.0 }, "commission": { - "model": "percentage", - "rate": 0.001 + "model": "none", + "rate": 0.0 }, "execution": { "execution_mode": "next_bar", @@ -1268,13 +1267,13 @@ "orders": { "entry_order_priority": "submission", "fill_ordering": "fifo", - "late_asset_min_bars": 2, - "late_asset_policy": "require_history", + "late_asset_min_bars": 1, + "late_asset_policy": "allow", "missing_price_policy": "use_last", "next_bar_simple_cash_check": true, "next_bar_submission_precheck": true, "partial_fills_allowed": false, - "rebalance_headroom_pct": 0.998, + "rebalance_headroom_pct": 1.0, "rebalance_mode": "snapshot", "reject_on_insufficient_cash": true }, @@ -1282,10 +1281,11 @@ "share_type": "integer" }, "slippage": { - "model": "percentage", - "rate": 0.001 + "model": "none", + "rate": 0.0 }, "stops": { + "initial_hwm_source": "signal_price", "stop_fill_mode": "stop_price", "stop_level_basis": "signal_price", "trail_hwm_source": "close", diff --git a/tests/contracts/test_backtrader_native_evidence.py b/tests/contracts/test_backtrader_native_evidence.py new file mode 100644 index 00000000..1116aaf4 --- /dev/null +++ b/tests/contracts/test_backtrader_native_evidence.py @@ -0,0 +1,51 @@ +"""Contracts for retained framework-native Backtrader evidence.""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +_ROOT = Path(__file__).parents[2] +_ORACLE = _ROOT / "validation/native/backtrader_behavior.py" +_EVIDENCE = _ROOT / "validation/native/evidence/backtrader-1.9.78.123.json" + +EXPECTED_CHECKS = { + "cash_rejection_and_configured_leverage", + "cheat_on_close", + "commission_headroom", + "defaults", + "final_bar_market_order", + "integer_target_percent", + "late_feed_start", + "missing_bar_uses_last_value", + "next_bar_open_and_gap", + "short_cash", + "signal_price_stop_basis", + "submission_sequence", + "trade_record", + "trailing_stop_signal_close_and_lagged", +} + + +def test_retained_backtrader_native_evidence_is_complete_and_current() -> None: + payload = json.loads(_EVIDENCE.read_text(encoding="utf-8")) + + assert payload["schema_version"] == 1 + assert payload["framework"] == "backtrader" + assert payload["package"] == "backtrader" + assert payload["version"] == "1.9.78.123" + assert payload["artifact"] == "backtrader-1.9.78.123-py2.py3-none-any.whl" + assert payload["artifact_sha256"] == ( + "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd" + ) + assert payload["oracle_sha256"] == hashlib.sha256(_ORACLE.read_bytes()).hexdigest() + assert payload["passed"] is True + assert {check["id"] for check in payload["checks"]} == EXPECTED_CHECKS + assert all(check["passed"] for check in payload["checks"]) + assert all(check["actual"] == check["expected"] for check in payload["checks"]) + for location in payload["source_locations"].values(): + assert location["artifact"] == payload["artifact"] + assert location["artifact_sha256"] == payload["artifact_sha256"] + assert location["path"].startswith("backtrader/") + assert location["source"].endswith("/backtrader/1.9.78.123/") diff --git a/tests/contracts/test_profile_parity_basics.py b/tests/contracts/test_profile_parity_basics.py index 1d7aff2f..f7149b03 100644 --- a/tests/contracts/test_profile_parity_basics.py +++ b/tests/contracts/test_profile_parity_basics.py @@ -7,6 +7,7 @@ from ml4t.backtest.config import BacktestConfig from ml4t.backtest.engine import run_backtest from ml4t.backtest.profiles import list_profiles +from ml4t.backtest.risk.position.dynamic import TrailingStop from ml4t.backtest.strategy import Strategy from ml4t.backtest.types import StopLevelBasis @@ -46,6 +47,41 @@ def on_data(self, timestamp, data, context, broker) -> None: broker.submit_order("AAPL", 1.0) +class _BuyWithTrailingStop(Strategy): + def __init__(self) -> None: + self.done = False + + def on_data(self, timestamp, data, context, broker) -> None: + if not self.done: + broker.set_position_rules(TrailingStop(pct=0.1)) + broker.submit_order("AAPL", 1.0) + self.done = True + + +def _backtrader_trailing_prices() -> pl.DataFrame: + start = datetime(2024, 1, 1) + rows = [] + bars = [ + (100.0, 101.0, 99.0, 100.0), + (110.0, 111.0, 94.0, 95.0), + (95.0, 96.0, 85.0, 90.0), + (100.0, 101.0, 99.0, 100.0), + ] + for offset, (open_, high, low, close) in enumerate(bars): + rows.append( + { + "timestamp": start + timedelta(days=offset), + "asset": "AAPL", + "open": open_, + "high": high, + "low": low, + "close": close, + "volume": 1_000_000.0, + } + ) + return pl.DataFrame(rows) + + def test_profile_registry_has_expected_core_profiles() -> None: assert list_profiles() == ["backtrader", "default", "lean", "realistic", "vectorbt", "zipline"] @@ -68,7 +104,7 @@ def test_profiles_enforce_expected_entry_timing_contract() -> None: zl = run_backtest(prices=_prices(), strategy=_BuyOnce(), config="zipline") assert vbt.trades[0].entry_price == 101.0 # same-bar close - assert 110.0 < bt.trades[0].entry_price < 111.0 # next-bar open with default slippage + assert bt.trades[0].entry_price == 110.0 # next-bar open with zero default slippage assert 110.0 < zl.trades[0].entry_price < 111.0 # next-bar open with volume slippage @@ -109,12 +145,23 @@ def test_backtrader_profile_uses_signal_price_stop_basis() -> None: assert cfg.stop_level_basis == StopLevelBasis.SIGNAL_PRICE +def test_backtrader_profile_trailing_stop_uses_signal_close_before_fill() -> None: + result = run_backtest( + prices=_backtrader_trailing_prices(), + strategy=_BuyWithTrailingStop(), + config="backtrader", + ) + + assert result.trades[0].entry_price == 110.0 + assert result.trades[0].exit_price == 90.0 + + def test_backtrader_profile_parity_order_knobs() -> None: cfg = BacktestConfig.from_preset("backtrader") - assert cfg.rebalance_headroom_pct == 0.998 + assert cfg.rebalance_headroom_pct == 1.0 assert cfg.missing_price_policy.value == "use_last" - assert cfg.late_asset_policy.value == "require_history" - assert cfg.late_asset_min_bars == 2 + assert cfg.late_asset_policy.value == "allow" + assert cfg.late_asset_min_bars == 1 def test_zipline_profile_parity_order_knobs() -> None: @@ -146,7 +193,7 @@ def test_lean_profile_is_independent_of_backtrader() -> None: assert lean.fill_ordering.value == "exit_first" assert bt.fill_ordering.value == "fifo" assert lean.commission_per_share == 0.005 - assert bt.commission_rate == 0.001 + assert bt.commission_rate == 0.0 def test_quantconnect_alias_resolves_to_lean() -> None: diff --git a/tests/contracts/test_release_workflow.py b/tests/contracts/test_release_workflow.py index f1867c83..f8d826a4 100644 --- a/tests/contracts/test_release_workflow.py +++ b/tests/contracts/test_release_workflow.py @@ -158,6 +158,7 @@ def test_release_reuses_all_ci_gates_and_publishes_the_exact_candidate() -> None parity_commands = "\n".join(step.get("run", "") for step in parity["steps"]) assert "validation/build_framework_env.py" in parity_commands assert "validation/native/vectorbt_behavior.py" in parity_commands + assert "validation/native/backtrader_behavior.py" in parity_commands assert "validation/run_all_correctness.py" in parity_commands assert "--extra comparison" not in parity_commands build_commands = "\n".join(step.get("run", "") for step in jobs["build"]["steps"]) diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index f0a1f81e..244dce64 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -25,6 +25,7 @@ EntryOrderPriority, ExecutionPrice, FillOrdering, + LateAssetPolicy, MissingPricePolicy, ShareType, ShortCashPolicy, @@ -870,6 +871,12 @@ def test_backtrader_preset_values(self): assert config.share_type == ShareType.INTEGER assert config.fill_ordering == FillOrdering.FIFO assert config.reject_on_insufficient_cash is True + assert config.allow_leverage is False + assert config.commission_type == CommissionType.NONE + assert config.slippage_type == SlippageType.NONE + assert config.missing_price_policy == MissingPricePolicy.USE_LAST + assert config.late_asset_policy == LateAssetPolicy.ALLOW + assert config.late_asset_min_bars == 1 def test_vectorbt_preset_values(self): config = BacktestConfig.from_preset("vectorbt") diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index 544aeb94..3783cb46 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -173,13 +173,27 @@ Pro uses the corresponding methods at [`Portfolio.from_orders`](https://github.com/polakowo/vectorbt.pro/blob/6e18cf0aa37849cfc20848f40f1d26ecfdc771b4/vectorbtpro/portfolio/base.py#L4145) and [`Portfolio.from_signals`](https://github.com/polakowo/vectorbt.pro/blob/6e18cf0aa37849cfc20848f40f1d26ecfdc771b4/vectorbtpro/portfolio/base.py#L4646). +### Backtrader native evidence + +The Backtrader column cites checks from `native/backtrader_behavior.py`. The probe imports only +Backtrader 1.9.78.123 and pandas. It passed all 14 checks in the retained +[Backtrader evidence](native/evidence/backtrader-1.9.78.123.json). The evidence identifies the +installed wheel and its SHA-256 digest, and records source locations inside that artifact. + +`BT-T` refers to `next_bar_open_and_gap`, `cheat_on_close`, and `final_bar_market_order`. `BT-S` +refers to `integer_target_percent` and `commission_headroom`. `BT-C` refers to `defaults`, +`cash_rejection_and_configured_leverage`, `short_cash`, and `trade_record`. `BT-O` refers to +`submission_sequence`. `BT-R` refers to `signal_price_stop_basis` and +`trailing_stop_signal_close_and_lagged`. `BT-D` refers to `missing_bar_uses_last_value` and +`late_feed_start`. + ### Execution Timing | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar | next_bar | **same_bar** | -| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open | next_bar_open | **same_bar** | -| `execution_price` | open | **close** | VBT-S | open | open | **close** | +| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar (BT-T) | next_bar | **same_bar** | +| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open (BT-T) | next_bar_open | **same_bar** | +| `execution_price` | open | **close** | VBT-S | open (BT-T) | open | **close** | VectorBT and LEAN both use same-bar execution with close fills. VectorBT is vectorized (inherently same-bar), while LEAN processes market orders immediately at bar close in its @@ -189,11 +203,11 @@ event-driven loop. All event-driven frameworks (BT, Zipline) except LEAN use nex | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price | stop_price | stop_price | -| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price** | fill_price | fill_price | -| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close | close | close | -| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | fill_price | fill_price | fill_price | -| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged | lagged | lagged | +| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price (BT-R) | stop_price | stop_price | +| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price (BT-R)** | fill_price | fill_price | +| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close (BT-R) | close | close | +| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | signal_price (BT-R) | fill_price | fill_price | +| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged (BT-R) | lagged | lagged | Backtrader calculates stop levels from **signal bar close** (the price when the strategy decided to trade), not the actual fill price. This matters when next-bar open differs significantly from @@ -203,45 +217,48 @@ previous close. | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `allow_short_selling` | false | **true** | VBT-C | **true** | false | true | -| `allow_leverage` | false | false | VBT-C | **true** | false | true | -| `short_cash_policy` | credit | credit | VBT-C | credit | credit | credit | -| `initial_margin` | 0.5 | -- | VBT-C | **0.5** | -- | varies | -| `long_maint_margin` | 0.25 | -- | VBT-C | **0.25** | -- | varies | -| `short_maint_margin` | 0.30 | -- | VBT-C | **0.30** | -- | varies | +| `allow_short_selling` | false | **true** | VBT-C | **true (BT-C)** | false | true | +| `allow_leverage` | false | false | VBT-C | false by default (BT-C) | false | true | +| `short_cash_policy` | credit | credit | VBT-C | credit (BT-C) | credit | credit | +| `initial_margin` | 0.5 | -- | VBT-C | -- (BT-C) | -- | varies | +| `long_maint_margin` | 0.25 | -- | VBT-C | -- (BT-C) | -- | varies | +| `short_maint_margin` | 0.30 | -- | VBT-C | -- (BT-C) | -- | varies | ### Order Handling | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo** | exit_first | **exit_first** | -| `entry_order_priority` | submission | submission | VBT-C | submission | submission | submission | -| `immediate_fill` | false | **true** | VBT-S, VBT-O | false | false | **true** | -| `rebalance_mode` | incremental | **hybrid** | VBT-O | **snapshot** | **snapshot** | snapshot | -| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | **0.998** | **0.998** | 0.998 | -| `reject_on_insufficient_cash` | true | **false** | VBT-C | true | true | true | -| `partial_fills_allowed` | false | **true** | VBT-C | false | **true** | false | -| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last** | **use_last** | use_last | +| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo (BT-O)** | exit_first | **exit_first** | +| `entry_order_priority` | submission | submission | VBT-C | submission (BT-O) | submission | submission | +| `immediate_fill` | false | **true** | VBT-S, VBT-O | false (BT-T) | false | **true** | +| `rebalance_mode` | incremental | **hybrid** | VBT-O | **snapshot (BT-O)** | **snapshot** | snapshot | +| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | 1.0 (BT-S) | **0.998** | 0.998 | +| `reject_on_insufficient_cash` | true | **false** | VBT-C | true (BT-C, BT-O) | true | true | +| `partial_fills_allowed` | false | **true** | VBT-C | false (BT-C) | **true** | false | +| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last (BT-D)** | **use_last** | use_last | +| `late_asset_policy` | allow after 1 bar | allow after 1 bar | VBT-O | allow after 1 bar (BT-D) | allow | allow | ### Position Sizing & Costs | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `share_type` | fractional | fractional | VBT-O | **integer** | **integer** | **integer** | -| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | check position | check position | check position | -| `commission_model` | percentage | **none** | VBT-F | percentage | **per_share** | per_share | -| `commission_rate` | 0.1% | 0% | VBT-F | 0.1% | -- | -- | +| `share_type` | integer | fractional | VBT-O | integer (BT-S) | integer | integer | +| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | adapter checks position | check position | check position | +| `commission_model` | none | none | VBT-F | none (BT-C) | **per_share** | per_share | +| `commission_rate` | 0% | 0% | VBT-F | 0% (BT-C) | -- | -- | | `commission_per_share` | -- | -- | VBT-F | -- | **$0.005** | varies | | `commission_minimum` | $0 | -- | VBT-F | -- | **$1.00** | varies | -| `slippage_model` | percentage | **none** | VBT-F | percentage | **volume_based** | volume_based | -| `slippage_rate` | 0.1% | 0% | VBT-F | 0.1% | **10%** | varies | +| `slippage_model` | none | none | VBT-F | none (BT-C) | **volume_based** | volume_based | +| `slippage_rate` | 0% | 0% | VBT-F | 0% (BT-C) | **10%** | varies | ### Comparison profiles `vectorbt_strict` now resolves to the same settings as `vectorbt`. Native evidence does not support -the prior locked-short-proceeds, rejection, or FIFO overrides. Backtrader and Zipline retain -comparison-specific settings until their native checks and current large-scale workloads verify -or replace those settings. +the prior locked-short-proceeds, rejection, or FIFO overrides. `backtrader` now uses the measured +framework defaults for costs, leverage, target headroom, missing bars, and late feeds. +`backtrader_strict` adds submission-time cash checks to reproduce Backtrader's enabled +`checksubmit` path. Zipline retains comparison-specific settings pending its native checks and +current large-scale workload. --- diff --git a/validation/native/backtrader_behavior.py b/validation/native/backtrader_behavior.py new file mode 100644 index 00000000..f44549a5 --- /dev/null +++ b/validation/native/backtrader_behavior.py @@ -0,0 +1,678 @@ +#!/usr/bin/env python3 +"""Measure frozen Backtrader behavior without importing ML4T comparison code.""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib +import importlib.metadata +import inspect +import json +import math +import sys +import warnings +from pathlib import Path +from typing import Any + +import pandas as pd + +with warnings.catch_warnings(): + warnings.filterwarnings("ignore", message="invalid escape sequence.*", category=SyntaxWarning) + bt: Any = importlib.import_module("backtrader") + +VERSION = "1.9.78.123" +ARTIFACT = "backtrader-1.9.78.123-py2.py3-none-any.whl" +ARTIFACT_SHA256 = "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd" +SOURCE = "https://pypi.org/project/backtrader/1.9.78.123/" + + +def _frame( + opens: list[float], + *, + closes: list[float] | None = None, + lows: list[float] | None = None, + highs: list[float] | None = None, + dates: list[str] | None = None, +) -> pd.DataFrame: + closes = closes or opens + lows = lows or [min(open_, close) for open_, close in zip(opens, closes, strict=True)] + highs = highs or [max(open_, close) for open_, close in zip(opens, closes, strict=True)] + index = ( + pd.to_datetime(dates) + if dates is not None + else pd.date_range("2024-01-01", periods=len(opens)) + ) + return pd.DataFrame( + {"open": opens, "high": highs, "low": lows, "close": closes, "volume": 1_000.0}, + index=index, + ) + + +def _feed(frame: pd.DataFrame, name: str = "asset") -> Any: + return bt.feeds.PandasData(dataname=frame, name=name) + + +def _run( + strategy: type, + *frames: tuple[str, pd.DataFrame], + cash: float = 1_000.0, + configure: Any = None, + **strategy_kwargs: Any, +) -> tuple[Any, Any]: + cerebro = bt.Cerebro() + cerebro.broker.setcash(cash) + if configure is not None: + configure(cerebro.broker) + for name, frame in frames: + cerebro.adddata(_feed(frame, name)) + cerebro.addstrategy(strategy, **strategy_kwargs) + instance = cerebro.run()[0] + return cerebro, instance + + +def _terminal(order: Any) -> bool: + return order.status in {order.Completed, order.Margin, order.Rejected, order.Canceled} + + +def _defaults() -> dict[str, Any]: + broker = bt.Cerebro().broker + commission = bt.CommInfoBase() + return { + "cash": broker.p.cash, + "checksubmit": broker.p.checksubmit, + "cheat_on_close": broker.p.coc, + "cheat_on_open": broker.p.coo, + "commission": commission.p.commission, + "leverage": commission.p.leverage, + "short_cash": broker.p.shortcash, + "slippage_fixed": broker.p.slip_fixed, + "slippage_percent": broker.p.slip_perc, + } + + +def _timing(coc: bool = False) -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.buy(size=1) + + def notify_order(self, order: Any) -> None: + if order.status == order.Completed: + self.events.append( + { + "date": bt.num2date(order.executed.dt).date().isoformat(), + "price": order.executed.price, + "size": order.executed.size, + } + ) + + def configure(broker: Any) -> None: + broker.set_coc(coc) + + _, strategy = _run( + Strategy, + ("asset", _frame([100.0, 110.0, 120.0], closes=[100.0, 105.0, 120.0])), + configure=configure, + ) + return strategy.events + + +def _target_percent(target: float, commission: float = 0.0) -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.order_target_percent(target=target) + + def notify_order(self, order: Any) -> None: + if _terminal(order): + self.events.append( + { + "status": order.getstatusname(), + "created_size": order.created.size, + "executed_size": order.executed.size, + "price": order.executed.price, + "commission": order.executed.comm, + } + ) + + def configure(broker: Any) -> None: + broker.setcommission(commission=commission) + + _, strategy = _run( + Strategy, + ("asset", _frame([100.0, 100.0])), + configure=configure, + ) + return strategy.events + + +def _cash_and_margin(leverage: float) -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.buy(size=20) + + def notify_order(self, order: Any) -> None: + if _terminal(order): + self.events.append({"status": order.getstatusname(), "size": order.executed.size}) + + def configure(broker: Any) -> None: + broker.setcommission(leverage=leverage) + + _, strategy = _run( + Strategy, + ("asset", _frame([100.0, 100.0])), + configure=configure, + ) + return strategy.events + + +def _submission_sequence(reverse: bool) -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + data_sequence = list(reversed(self.datas)) if reverse else self.datas + for data in data_sequence: + self.order_target_percent(data=data, target=0.6) + + def notify_order(self, order: Any) -> None: + if _terminal(order): + self.events.append( + { + "asset": order.data._name, + "created_size": order.created.size, + "reference": order.ref, + "status": order.getstatusname(), + } + ) + + _, strategy = _run( + Strategy, + ("a", _frame([100.0, 100.0])), + ("b", _frame([100.0, 100.0])), + cash=1_000.0, + ) + return [ + { + "asset": event["asset"], + "created_size": event["created_size"], + "status": event["status"], + } + for event in sorted(strategy.events, key=lambda event: event["reference"]) + ] + + +def _signal_price_stop() -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.buy(size=1) + self.sell(size=1, exectype=bt.Order.Stop, price=self.data.close[0] * 0.9) + + def notify_order(self, order: Any) -> None: + if order.status == order.Completed: + self.events.append( + { + "created_price": order.created.price, + "executed_price": order.executed.price, + "size": order.executed.size, + } + ) + + _, strategy = _run( + Strategy, + ( + "asset", + _frame( + [100.0, 110.0, 95.0], + closes=[100.0, 100.0, 95.0], + highs=[101.0, 111.0, 96.0], + lows=[99.0, 85.0, 94.0], + ), + ), + ) + return strategy.events + + +def _trailing_stop() -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.buy(size=1) + self.sell(size=1, exectype=bt.Order.StopTrail, trailpercent=0.1) + + def notify_order(self, order: Any) -> None: + if order.status == order.Completed: + self.events.append( + { + "date": bt.num2date(order.executed.dt).date().isoformat(), + "executed_price": order.executed.price, + "size": order.executed.size, + } + ) + + _, strategy = _run( + Strategy, + ( + "asset", + _frame( + [100.0, 110.0, 95.0, 100.0], + closes=[100.0, 95.0, 90.0, 100.0], + highs=[101.0, 111.0, 96.0, 101.0], + lows=[99.0, 94.0, 85.0, 99.0], + ), + ), + ) + return strategy.events + + +def _short_cash(short_cash: bool) -> dict[str, Any]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.event: dict[str, Any] = {} + + def next(self) -> None: + if len(self) == 1: + self.sell(size=1) + + def notify_order(self, order: Any) -> None: + if order.status == order.Completed: + self.event = { + "cash": self.broker.getcash(), + "position": self.position.size, + "price": order.executed.price, + } + + def configure(broker: Any) -> None: + broker.set_shortcash(short_cash) + + _, strategy = _run( + Strategy, + ("asset", _frame([100.0, 100.0, 100.0])), + configure=configure, + ) + return strategy.event + + +def _missing_and_late_bars() -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def prenext(self) -> None: + self._record("prenext") + + def nextstart(self) -> None: + self._record("nextstart") + + def next(self) -> None: + self._record("next") + + def _record(self, callback: str) -> None: + self.events.append( + { + "callback": callback, + "date": self.datetime.date().isoformat(), + "lengths": [len(data) for data in self.datas], + "values": [float(data.close[0]) if len(data) else None for data in self.datas], + } + ) + + _, strategy = _run( + Strategy, + ( + "a", + _frame( + [100.0, 120.0], + dates=["2024-01-01", "2024-01-03"], + ), + ), + ( + "b", + _frame( + [200.0, 210.0, 220.0], + dates=["2024-01-01", "2024-01-02", "2024-01-03"], + ), + ), + ) + return strategy.events + + +def _late_start() -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def prenext(self) -> None: + self._record("prenext") + + def nextstart(self) -> None: + self._record("nextstart") + + def next(self) -> None: + self._record("next") + + def _record(self, callback: str) -> None: + self.events.append( + { + "callback": callback, + "date": self.datetime.date().isoformat(), + "lengths": [len(data) for data in self.datas], + } + ) + + _, strategy = _run( + Strategy, + ("a", _frame([100.0, 100.0, 100.0])), + ( + "b", + _frame([100.0, 100.0], dates=["2024-01-02", "2024-01-03"]), + ), + ) + return strategy.events + + +def _final_bar_order() -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 2: + self.buy(size=1) + + def notify_order(self, order: Any) -> None: + if order.status == order.Completed: + self.events.append({"price": order.executed.price}) + + _, strategy = _run(Strategy, ("asset", _frame([100.0, 110.0]))) + return strategy.events + + +def _trade_record() -> list[dict[str, Any]]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.buy(size=2) + elif len(self) == 2: + self.close() + + def notify_trade(self, trade: Any) -> None: + if trade.isclosed: + self.events.append( + { + "commission": trade.commission, + "entry_price": trade.price, + "is_long": trade.long, + "pnl": trade.pnl, + "pnl_after_commission": trade.pnlcomm, + } + ) + + def configure(broker: Any) -> None: + broker.setcommission(commission=0.01) + + _, strategy = _run( + Strategy, + ("asset", _frame([100.0, 110.0, 120.0, 130.0])), + configure=configure, + ) + return strategy.events + + +def _source_location(function: Any) -> dict[str, Any]: + source_file = inspect.getsourcefile(function) + if source_file is None: + raise RuntimeError(f"Could not locate source for {function}") + package_root = Path(bt.__file__).resolve().parent.parent + relative_path = Path(source_file).resolve().relative_to(package_root).as_posix() + return { + "artifact": ARTIFACT, + "artifact_sha256": ARTIFACT_SHA256, + "line": inspect.getsourcelines(function)[1], + "module": function.__module__, + "path": relative_path, + "qualname": function.__qualname__, + "source": SOURCE, + } + + +def _equal(actual: Any, expected: Any) -> bool: + if isinstance(actual, float) and isinstance(expected, (float, int)): + return math.isclose(actual, float(expected), rel_tol=0.0, abs_tol=1e-12) + if isinstance(actual, list) and isinstance(expected, list) and len(actual) == len(expected): + return all(_equal(left, right) for left, right in zip(actual, expected, strict=True)) + if isinstance(actual, dict) and isinstance(expected, dict) and actual.keys() == expected.keys(): + return all(_equal(actual[key], expected[key]) for key in actual) + return bool(actual == expected) + + +def run() -> dict[str, Any]: + """Execute Backtrader directly and return framework-native evidence.""" + actual_version = importlib.metadata.version("backtrader") + if actual_version != VERSION: + raise RuntimeError(f"backtrader version differs: {actual_version} != {VERSION}") + + measurements = [ + ( + "defaults", + _defaults(), + { + "cash": 10_000.0, + "checksubmit": True, + "cheat_on_close": False, + "cheat_on_open": False, + "commission": 0.0, + "leverage": 1.0, + "short_cash": True, + "slippage_fixed": 0.0, + "slippage_percent": 0.0, + }, + ), + ( + "next_bar_open_and_gap", + _timing(), + [{"date": "2024-01-02", "price": 110.0, "size": 1}], + ), + ( + "cheat_on_close", + _timing(coc=True), + [{"date": "2024-01-01", "price": 100.0, "size": 1}], + ), + ( + "integer_target_percent", + _target_percent(0.5), + [ + { + "status": "Completed", + "created_size": 5, + "executed_size": 5, + "price": 100.0, + "commission": 0.0, + } + ], + ), + ( + "commission_headroom", + {"full": _target_percent(1.0, 0.001), "headroom": _target_percent(0.998, 0.001)}, + { + "full": [ + { + "status": "Margin", + "created_size": 10, + "executed_size": 0, + "price": 0.0, + "commission": 0.0, + } + ], + "headroom": [ + { + "status": "Completed", + "created_size": 9, + "executed_size": 9, + "price": 100.0, + "commission": 0.9000000000000001, + } + ], + }, + ), + ( + "cash_rejection_and_configured_leverage", + {"default": _cash_and_margin(1.0), "leverage_2": _cash_and_margin(2.0)}, + { + "default": [{"status": "Margin", "size": 0}], + "leverage_2": [{"status": "Completed", "size": 20}], + }, + ), + ( + "submission_sequence", + {"forward": _submission_sequence(False), "reverse": _submission_sequence(True)}, + { + "forward": [ + {"asset": "a", "created_size": 6, "status": "Completed"}, + {"asset": "b", "created_size": 6, "status": "Margin"}, + ], + "reverse": [ + {"asset": "b", "created_size": 6, "status": "Completed"}, + {"asset": "a", "created_size": 6, "status": "Margin"}, + ], + }, + ), + ( + "signal_price_stop_basis", + _signal_price_stop(), + [ + {"created_price": 100.0, "executed_price": 110.0, "size": 1}, + {"created_price": 90.0, "executed_price": 90.0, "size": -1}, + ], + ), + ( + "trailing_stop_signal_close_and_lagged", + _trailing_stop(), + [ + {"date": "2024-01-02", "executed_price": 110.0, "size": 1}, + {"date": "2024-01-03", "executed_price": 90.0, "size": -1}, + ], + ), + ( + "short_cash", + {"credit": _short_cash(True), "debit": _short_cash(False)}, + { + "credit": {"cash": 1_100.0, "position": -1, "price": 100.0}, + "debit": {"cash": 900.0, "position": -1, "price": 100.0}, + }, + ), + ( + "missing_bar_uses_last_value", + _missing_and_late_bars(), + [ + { + "callback": "nextstart", + "date": "2024-01-01", + "lengths": [1, 1], + "values": [100.0, 200.0], + }, + { + "callback": "nextstart", + "date": "2024-01-02", + "lengths": [1, 2], + "values": [100.0, 210.0], + }, + { + "callback": "next", + "date": "2024-01-03", + "lengths": [2, 3], + "values": [120.0, 220.0], + }, + ], + ), + ( + "late_feed_start", + _late_start(), + [ + {"callback": "prenext", "date": "2024-01-01", "lengths": [1, 0]}, + {"callback": "nextstart", "date": "2024-01-02", "lengths": [2, 1]}, + {"callback": "next", "date": "2024-01-03", "lengths": [3, 2]}, + ], + ), + ("final_bar_market_order", _final_bar_order(), []), + ( + "trade_record", + _trade_record(), + [ + { + "commission": 4.6, + "entry_price": 110.0, + "is_long": True, + "pnl": 20.0, + "pnl_after_commission": 15.4, + } + ], + ), + ] + checks = [ + {"id": check_id, "actual": actual, "expected": expected, "passed": _equal(actual, expected)} + for check_id, actual, expected in measurements + ] + return { + "schema_version": 1, + "framework": "backtrader", + "package": "backtrader", + "version": actual_version, + "artifact": ARTIFACT, + "artifact_sha256": ARTIFACT_SHA256, + "oracle_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), + "source_locations": { + "broker_next": _source_location(bt.brokers.BackBroker.next), + "order_execute": _source_location(bt.Order.execute), + "target_percent": _source_location(bt.Strategy.order_target_percent), + "target_size": _source_location(bt.CommInfoBase.getsize), + }, + "checks": checks, + "passed": all(check["passed"] for check in checks), + } + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + try: + evidence = run() + except (ImportError, OSError, RuntimeError, ValueError) as error: + print(f"Backtrader native behavior run failed: {error}", file=sys.stderr) + return 2 + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8") + failed = [check["id"] for check in evidence["checks"] if not check["passed"]] + if failed: + print(f"Backtrader native behavior differs: {failed}", file=sys.stderr) + return 1 + print(f"Backtrader native behavior passed: {len(evidence['checks'])} checks") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/native/evidence/backtrader-1.9.78.123.json b/validation/native/evidence/backtrader-1.9.78.123.json new file mode 100644 index 00000000..c09e54f5 --- /dev/null +++ b/validation/native/evidence/backtrader-1.9.78.123.json @@ -0,0 +1,514 @@ +{ + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "artifact_sha256": "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "checks": [ + { + "actual": { + "cash": 10000.0, + "cheat_on_close": false, + "cheat_on_open": false, + "checksubmit": true, + "commission": 0.0, + "leverage": 1.0, + "short_cash": true, + "slippage_fixed": 0.0, + "slippage_percent": 0.0 + }, + "expected": { + "cash": 10000.0, + "cheat_on_close": false, + "cheat_on_open": false, + "checksubmit": true, + "commission": 0.0, + "leverage": 1.0, + "short_cash": true, + "slippage_fixed": 0.0, + "slippage_percent": 0.0 + }, + "id": "defaults", + "passed": true + }, + { + "actual": [ + { + "date": "2024-01-02", + "price": 110.0, + "size": 1 + } + ], + "expected": [ + { + "date": "2024-01-02", + "price": 110.0, + "size": 1 + } + ], + "id": "next_bar_open_and_gap", + "passed": true + }, + { + "actual": [ + { + "date": "2024-01-01", + "price": 100.0, + "size": 1 + } + ], + "expected": [ + { + "date": "2024-01-01", + "price": 100.0, + "size": 1 + } + ], + "id": "cheat_on_close", + "passed": true + }, + { + "actual": [ + { + "commission": 0.0, + "created_size": 5, + "executed_size": 5, + "price": 100.0, + "status": "Completed" + } + ], + "expected": [ + { + "commission": 0.0, + "created_size": 5, + "executed_size": 5, + "price": 100.0, + "status": "Completed" + } + ], + "id": "integer_target_percent", + "passed": true + }, + { + "actual": { + "full": [ + { + "commission": 0.0, + "created_size": 10, + "executed_size": 0, + "price": 0.0, + "status": "Margin" + } + ], + "headroom": [ + { + "commission": 0.9000000000000001, + "created_size": 9, + "executed_size": 9, + "price": 100.0, + "status": "Completed" + } + ] + }, + "expected": { + "full": [ + { + "commission": 0.0, + "created_size": 10, + "executed_size": 0, + "price": 0.0, + "status": "Margin" + } + ], + "headroom": [ + { + "commission": 0.9000000000000001, + "created_size": 9, + "executed_size": 9, + "price": 100.0, + "status": "Completed" + } + ] + }, + "id": "commission_headroom", + "passed": true + }, + { + "actual": { + "default": [ + { + "size": 0, + "status": "Margin" + } + ], + "leverage_2": [ + { + "size": 20, + "status": "Completed" + } + ] + }, + "expected": { + "default": [ + { + "size": 0, + "status": "Margin" + } + ], + "leverage_2": [ + { + "size": 20, + "status": "Completed" + } + ] + }, + "id": "cash_rejection_and_configured_leverage", + "passed": true + }, + { + "actual": { + "forward": [ + { + "asset": "a", + "created_size": 6, + "status": "Completed" + }, + { + "asset": "b", + "created_size": 6, + "status": "Margin" + } + ], + "reverse": [ + { + "asset": "b", + "created_size": 6, + "status": "Completed" + }, + { + "asset": "a", + "created_size": 6, + "status": "Margin" + } + ] + }, + "expected": { + "forward": [ + { + "asset": "a", + "created_size": 6, + "status": "Completed" + }, + { + "asset": "b", + "created_size": 6, + "status": "Margin" + } + ], + "reverse": [ + { + "asset": "b", + "created_size": 6, + "status": "Completed" + }, + { + "asset": "a", + "created_size": 6, + "status": "Margin" + } + ] + }, + "id": "submission_sequence", + "passed": true + }, + { + "actual": [ + { + "created_price": 100.0, + "executed_price": 110.0, + "size": 1 + }, + { + "created_price": 90.0, + "executed_price": 90.0, + "size": -1 + } + ], + "expected": [ + { + "created_price": 100.0, + "executed_price": 110.0, + "size": 1 + }, + { + "created_price": 90.0, + "executed_price": 90.0, + "size": -1 + } + ], + "id": "signal_price_stop_basis", + "passed": true + }, + { + "actual": [ + { + "date": "2024-01-02", + "executed_price": 110.0, + "size": 1 + }, + { + "date": "2024-01-03", + "executed_price": 90.0, + "size": -1 + } + ], + "expected": [ + { + "date": "2024-01-02", + "executed_price": 110.0, + "size": 1 + }, + { + "date": "2024-01-03", + "executed_price": 90.0, + "size": -1 + } + ], + "id": "trailing_stop_signal_close_and_lagged", + "passed": true + }, + { + "actual": { + "credit": { + "cash": 1100.0, + "position": -1, + "price": 100.0 + }, + "debit": { + "cash": 900.0, + "position": -1, + "price": 100.0 + } + }, + "expected": { + "credit": { + "cash": 1100.0, + "position": -1, + "price": 100.0 + }, + "debit": { + "cash": 900.0, + "position": -1, + "price": 100.0 + } + }, + "id": "short_cash", + "passed": true + }, + { + "actual": [ + { + "callback": "nextstart", + "date": "2024-01-01", + "lengths": [ + 1, + 1 + ], + "values": [ + 100.0, + 200.0 + ] + }, + { + "callback": "nextstart", + "date": "2024-01-02", + "lengths": [ + 1, + 2 + ], + "values": [ + 100.0, + 210.0 + ] + }, + { + "callback": "next", + "date": "2024-01-03", + "lengths": [ + 2, + 3 + ], + "values": [ + 120.0, + 220.0 + ] + } + ], + "expected": [ + { + "callback": "nextstart", + "date": "2024-01-01", + "lengths": [ + 1, + 1 + ], + "values": [ + 100.0, + 200.0 + ] + }, + { + "callback": "nextstart", + "date": "2024-01-02", + "lengths": [ + 1, + 2 + ], + "values": [ + 100.0, + 210.0 + ] + }, + { + "callback": "next", + "date": "2024-01-03", + "lengths": [ + 2, + 3 + ], + "values": [ + 120.0, + 220.0 + ] + } + ], + "id": "missing_bar_uses_last_value", + "passed": true + }, + { + "actual": [ + { + "callback": "prenext", + "date": "2024-01-01", + "lengths": [ + 1, + 0 + ] + }, + { + "callback": "nextstart", + "date": "2024-01-02", + "lengths": [ + 2, + 1 + ] + }, + { + "callback": "next", + "date": "2024-01-03", + "lengths": [ + 3, + 2 + ] + } + ], + "expected": [ + { + "callback": "prenext", + "date": "2024-01-01", + "lengths": [ + 1, + 0 + ] + }, + { + "callback": "nextstart", + "date": "2024-01-02", + "lengths": [ + 2, + 1 + ] + }, + { + "callback": "next", + "date": "2024-01-03", + "lengths": [ + 3, + 2 + ] + } + ], + "id": "late_feed_start", + "passed": true + }, + { + "actual": [], + "expected": [], + "id": "final_bar_market_order", + "passed": true + }, + { + "actual": [ + { + "commission": 4.6, + "entry_price": 110.0, + "is_long": true, + "pnl": 20.0, + "pnl_after_commission": 15.4 + } + ], + "expected": [ + { + "commission": 4.6, + "entry_price": 110.0, + "is_long": true, + "pnl": 20.0, + "pnl_after_commission": 15.4 + } + ], + "id": "trade_record", + "passed": true + } + ], + "framework": "backtrader", + "oracle_sha256": "02dddf9eca15abc25dcfa51a362505220de4dbc2608deb520e126904e4399f51", + "package": "backtrader", + "passed": true, + "schema_version": 1, + "source_locations": { + "broker_next": { + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "artifact_sha256": "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "line": 1176, + "module": "backtrader.brokers.bbroker", + "path": "backtrader/brokers/bbroker.py", + "qualname": "BackBroker.next", + "source": "https://pypi.org/project/backtrader/1.9.78.123/" + }, + "order_execute": { + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "artifact_sha256": "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "line": 566, + "module": "backtrader.order", + "path": "backtrader/order.py", + "qualname": "Order.execute", + "source": "https://pypi.org/project/backtrader/1.9.78.123/" + }, + "target_percent": { + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "artifact_sha256": "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "line": 1330, + "module": "backtrader.strategy", + "path": "backtrader/strategy.py", + "qualname": "Strategy.order_target_percent", + "source": "https://pypi.org/project/backtrader/1.9.78.123/" + }, + "target_size": { + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "artifact_sha256": "9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "line": 192, + "module": "backtrader.comminfo", + "path": "backtrader/comminfo.py", + "qualname": "CommInfoBase.getsize", + "source": "https://pypi.org/project/backtrader/1.9.78.123/" + } + }, + "version": "1.9.78.123" +} diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 263370f1..1e353fa7 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -17,4 +17,5 @@ validation/common/ml4t_runner.py validation/common/provenance.py validation/common/types.py validation/native/vectorbt_behavior.py +validation/native/backtrader_behavior.py validation/scenarios/definitions.py From 9660adf9703407167d0fdd0622e1ea296d291276 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Thu, 13 Aug 2026 23:51:49 -0400 Subject: [PATCH 06/44] fix(validation): separate Zipline defaults from comparison protocol --- .github/workflows/ci.yml | 7 + README.md | 2 +- docs/getting-started/quickstart.md | 4 +- docs/user-guide/accounts.md | 7 +- docs/user-guide/execution-semantics.md | 2 +- docs/user-guide/profiles.md | 28 +- src/ml4t/backtest/core/execution_engine.py | 19 +- src/ml4t/backtest/profiles.py | 31 +- tests/compatibility/snapshots/v0.1.json | 51 +- tests/contracts/test_profile_parity_basics.py | 69 +- tests/contracts/test_release_workflow.py | 1 + .../contracts/test_zipline_native_evidence.py | 66 ++ tests/test_config_wiring.py | 6 + validation/METHODOLOGY.md | 105 ++- validation/benchmark_suite.py | 5 +- validation/common/provenance.py | 13 + validation/native/evidence/zipline-3.1.1.json | 608 +++++++++++++++ validation/native/zipline_behavior.py | 712 ++++++++++++++++++ validation/release_checks.txt | 1 + 19 files changed, 1602 insertions(+), 135 deletions(-) create mode 100644 tests/contracts/test_zipline_native_evidence.py create mode 100644 validation/native/evidence/zipline-3.1.1.json create mode 100644 validation/native/zipline_behavior.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d6fcb78..4bb4450e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -223,6 +223,13 @@ jobs: validation/native/backtrader_behavior.py --output native-evidence.json + - name: Measure native Zipline behavior + if: matrix.framework == 'zipline' + run: >- + "${{ matrix.environment }}/bin/python" + validation/native/zipline_behavior.py + --output native-evidence.json + - name: Run the complete required scenario matrix run: >- "${{ matrix.environment }}/bin/python" diff --git a/README.md b/README.md index 99733399..094501b8 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ config = BacktestConfig.from_preset("vectorbt") # Match Backtrader behavior (next-bar open fills, integer shares) config = BacktestConfig.from_preset("backtrader") -# Match Zipline behavior (next-bar open fills, integer shares, per-share commission) +# Match the documented Zipline comparison protocol (next-bar open, no default costs) config = BacktestConfig.from_preset("zipline") # Match QuantConnect LEAN behavior (same-bar close fills, integer shares) diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 0c50993c..6ba6ad60 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -171,13 +171,13 @@ result = run_backtest(prices, strategy, config=config) Match the exact behavior of another backtesting framework: ```python -# Backtrader-compatible: next-bar execution, integer shares, margin account +# Backtrader-compatible: next-bar execution, integer shares, default cash checks result = run_backtest(prices, strategy, config="backtrader") # VectorBT-compatible: same-bar execution, fractional shares, no costs result = run_backtest(prices, strategy, config="vectorbt") -# Zipline-compatible: next-bar execution, per-share commission +# Zipline comparison protocol: next-bar open execution, no default costs result = run_backtest(prices, strategy, config="zipline") # Conservative production settings diff --git a/docs/user-guide/accounts.md b/docs/user-guide/accounts.md index bc482e42..e5293348 100644 --- a/docs/user-guide/accounts.md +++ b/docs/user-guide/accounts.md @@ -185,9 +185,10 @@ config = BacktestConfig.from_preset("lean") config = BacktestConfig.from_preset("realistic") ``` -Each preset sets all 40+ behavioral knobs to match the target framework's behavior. -Strict variants (`backtrader_strict`, `vectorbt_strict`, `zipline_strict`) -are also available for exact parity testing. +Each preset configures the measured behavior used by its comparison protocol. The native defaults, +explicit overrides, and adapter-emulated behavior are listed in the +[validation methodology](../../validation/METHODOLOGY.md). Strict aliases are also available for +the retained comparison commands. ## Insufficient Funds diff --git a/docs/user-guide/execution-semantics.md b/docs/user-guide/execution-semantics.md index 8db6097b..7358f0d1 100644 --- a/docs/user-guide/execution-semantics.md +++ b/docs/user-guide/execution-semantics.md @@ -480,7 +480,7 @@ config = BacktestConfig( | `NONE` | No slippage | | | `PERCENTAGE` | % of price | `slippage_rate=0.001` (0.1%) | | `FIXED` | Fixed $ per share | `slippage_fixed=0.01` | -| `VOLUME_BASED` | Size vs volume | `slippage_rate=0.1` (10% volume limit) | +| `VOLUME_BASED` | Linear size-to-volume impact | `slippage_rate=0.1` (impact coefficient) | Slippage models remain separate from quote-side execution: diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index bc182ccc..9da5e7bd 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -14,7 +14,7 @@ exactly and which remain release-blocking. | `fast` | Zero-cost, integer-share execution -- fastest possible execution | | `backtrader` | Match Backtrader's default behavior | | `vectorbt` | Match VectorBT's default behavior (including fractional shares) | -| `zipline` | Match Zipline Reloaded's default behavior | +| `zipline` | Match the documented Zipline comparison protocol | | `lean` | Match QuantConnect LEAN's default behavior | | `realistic` | Conservative settings for production | @@ -32,13 +32,13 @@ The broker preset also supports a modular alias: ### Strict Profiles -Strict variants tune additional knobs (cash validation, settlement, short policies) for maximum parity on large-scale comparisons: +Strict variants are the names used by retained comparison commands: | Profile | Base | Additional Tuning | |---------|------|-------------------| | `backtrader_strict` | backtrader | Submission precheck, simple cash check | -| `vectorbt_strict` | vectorbt | Lock notional for shorts, FIFO ordering | -| `zipline_strict` | zipline | Skip cash validation, allow shorts | +| `vectorbt_strict` | vectorbt | Same settings as `vectorbt` | +| `zipline_strict` | zipline | Same settings as `zipline` | ### Aliases @@ -90,25 +90,25 @@ Profiles define behavioral defaults. Quote-aware feeds layer on top of them: you | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Fill mode | stop_price | stop_price | stop_price | stop_price | stop_price | next_bar_open | +| Fill mode | stop_price | stop_price | stop_price | next_bar_open | stop_price | next_bar_open | | Level basis | fill_price | signal_price | fill_price | fill_price | fill_price | fill_price | -| Trail HWM | close | close | bar_extreme | close | close | close | -| Trail timing | lagged | lagged | intrabar | lagged | lagged | lagged | +| Trail HWM | close | close | bar_extreme | bar_extreme | close | close | +| Trail timing | lagged | lagged | intrabar | intrabar | lagged | lagged | ### Account | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Short selling | No | Yes (margin) | Yes | No | Yes | No | -| Leverage | No | Yes (50%) | No | No | No | No | +| Short selling | No | Yes | Yes | Yes | Yes | No | +| Leverage | No | No | No | Cash validation disabled | No | No | | Share type | integer | integer | fractional | integer | integer | integer | ### Costs | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Commission | none | 0.1% | none | $0.005/share | $0.005/share | 0.2% | -| Slippage | none | 0.1% | none | 10% volume | 0.1% | 0.2% | +| Commission | none | none | none | none | $0.005/share | 0.2% | +| Slippage | none | none | none | none | 0.1% | 0.2% | | Stop slippage | 0 | 0 | 0 | 0 | 0 | 0.1% | | Cash buffer | 0% | 0% | 0% | 0% | 0% | 2% | @@ -116,9 +116,9 @@ Profiles define behavioral defaults. Quote-aware feeds layer on top of them: you | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Fill ordering | exit_first | fifo | exit_first | exit_first | exit_first | exit_first | -| Reject insuff. | yes | yes | no | yes | yes | yes | -| Partial fills | no | no | yes | yes | no | no | +| Fill ordering | exit_first | fifo | exit_first | fifo | exit_first | exit_first | +| Reject insuff. | yes | yes | no | no | yes | yes | +| Partial fills | no | no | yes | no | no | no | | Rebalance mode | incremental | snapshot | hybrid | snapshot | snapshot | incremental | ## Parity Validation diff --git a/src/ml4t/backtest/core/execution_engine.py b/src/ml4t/backtest/core/execution_engine.py index 06a513b5..4a8893e4 100644 --- a/src/ml4t/backtest/core/execution_engine.py +++ b/src/ml4t/backtest/core/execution_engine.py @@ -3,7 +3,8 @@ from __future__ import annotations import copy -from typing import TYPE_CHECKING +import math +from typing import TYPE_CHECKING, TypeGuard from ..models import calculate_commission from ..types import ExecutionMode, Order, OrderSide, OrderStatus, OrderType, Position @@ -16,6 +17,10 @@ from .fill_engine import FillEngine +def _price_available(price: object) -> TypeGuard[int | float]: + return isinstance(price, (int, float)) and math.isfinite(price) + + class ExecutionEngine: """Executes pending orders using configured fill ordering.""" @@ -129,7 +134,7 @@ def _process_orders_exit_first( deferred_entries.append(order) continue price = fill.get_fill_price_for_order(order, use_open) - if price is None: + if not _price_available(price): continue fill_price = fill.check_fill(order, price) if fill_price is not None: @@ -221,7 +226,7 @@ def _process_orders_next_bar_queue_shadow( for order in eligible_orders: price = fill.get_fill_price_for_order(order, use_open) - if price is None: + if not _price_available(price): continue fill.apply_share_rounding(order) @@ -451,7 +456,7 @@ def _process_orders_sequential( continue price = fill.get_fill_price_for_order(order, use_open) - if price is None: + if not _price_available(price): continue fill.apply_share_rounding(order) @@ -500,7 +505,7 @@ def _process_single_order( if order.status is not OrderStatus.PENDING: return price = fill.get_fill_price_for_order(order, use_open) - if price is None: + if not _price_available(price): return skip_cash = broker.skip_cash_validation @@ -711,8 +716,10 @@ def _sort_entry_orders(self, orders: list, use_open: bool) -> list: def notional(order) -> float: px = fill.get_fill_price_for_order(order, use_open) - if px is None: + if not _price_available(px): px = self.market.prices.get(order.asset, self.market.opens.get(order.asset, 0.0)) + if not _price_available(px): + return 0.0 return abs(order.quantity * px) reverse = priority == "notional_desc" diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index d212f224..91347aa5 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -143,7 +143,7 @@ ZIPLINE_PROFILE = { "account": { - "allow_short_selling": False, + "allow_short_selling": True, "allow_leverage": False, "short_cash_policy": "credit", }, @@ -152,36 +152,37 @@ "execution_mode": "next_bar", }, "stops": { - "stop_fill_mode": "stop_price", + "stop_fill_mode": "next_bar_open", "stop_level_basis": "fill_price", - "trail_hwm_source": "close", - "trail_stop_timing": "lagged", + "trail_hwm_source": "bar_extreme", + "trail_stop_timing": "intrabar", }, "position_sizing": { "share_type": "integer", }, "commission": { - "model": "per_share", + "model": "none", "rate": 0.0, - "per_share": 0.005, - "minimum": 1.0, + "per_share": 0.0, + "minimum": 0.0, }, "slippage": { - "model": "volume_based", - "rate": 0.1, + "model": "none", + "rate": 0.0, }, "cash": { "initial": 100000.0, "buffer_pct": 0.0, }, "orders": { - "reject_on_insufficient_cash": True, - "partial_fills_allowed": True, - "fill_ordering": "exit_first", + "reject_on_insufficient_cash": False, + "skip_cash_validation": True, + "partial_fills_allowed": False, + "fill_ordering": "fifo", "entry_order_priority": "submission", "next_bar_queue_shadow_validation": True, "rebalance_mode": "snapshot", - "rebalance_headroom_pct": 0.998, + "rebalance_headroom_pct": 1.0, "missing_price_policy": "use_last", "late_asset_policy": "allow", "late_asset_min_bars": 1, @@ -287,10 +288,6 @@ BACKTRADER_STRICT_PROFILE["orders"]["next_bar_simple_cash_check"] = True ZIPLINE_STRICT_PROFILE = deepcopy(ZIPLINE_PROFILE) -ZIPLINE_STRICT_PROFILE["account"]["allow_short_selling"] = True -ZIPLINE_STRICT_PROFILE["account"]["short_cash_policy"] = "credit" -ZIPLINE_STRICT_PROFILE["orders"]["skip_cash_validation"] = True -ZIPLINE_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" LEAN_PROFILE = { "account": { diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index e67a3b5c..edd50261 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -1611,7 +1611,7 @@ "zipline": { "account": { "allow_leverage": false, - "allow_short_selling": false, + "allow_short_selling": true, "short_cash_policy": "credit" }, "cash": { @@ -1619,9 +1619,9 @@ "initial": 100000.0 }, "commission": { - "minimum": 1.0, - "model": "per_share", - "per_share": 0.005, + "minimum": 0.0, + "model": "none", + "per_share": 0.0, "rate": 0.0 }, "execution": { @@ -1630,28 +1630,29 @@ }, "orders": { "entry_order_priority": "submission", - "fill_ordering": "exit_first", + "fill_ordering": "fifo", "late_asset_min_bars": 1, "late_asset_policy": "allow", "missing_price_policy": "use_last", "next_bar_queue_shadow_validation": true, - "partial_fills_allowed": true, - "rebalance_headroom_pct": 0.998, + "partial_fills_allowed": false, + "rebalance_headroom_pct": 1.0, "rebalance_mode": "snapshot", - "reject_on_insufficient_cash": true + "reject_on_insufficient_cash": false, + "skip_cash_validation": true }, "position_sizing": { "share_type": "integer" }, "slippage": { - "model": "volume_based", - "rate": 0.1 + "model": "none", + "rate": 0.0 }, "stops": { - "stop_fill_mode": "stop_price", + "stop_fill_mode": "next_bar_open", "stop_level_basis": "fill_price", - "trail_hwm_source": "close", - "trail_stop_timing": "lagged" + "trail_hwm_source": "bar_extreme", + "trail_stop_timing": "intrabar" } }, "zipline_strict": { @@ -1665,9 +1666,9 @@ "initial": 100000.0 }, "commission": { - "minimum": 1.0, - "model": "per_share", - "per_share": 0.005, + "minimum": 0.0, + "model": "none", + "per_share": 0.0, "rate": 0.0 }, "execution": { @@ -1676,29 +1677,29 @@ }, "orders": { "entry_order_priority": "submission", - "fill_ordering": "exit_first", + "fill_ordering": "fifo", "late_asset_min_bars": 1, "late_asset_policy": "allow", "missing_price_policy": "use_last", "next_bar_queue_shadow_validation": true, - "partial_fills_allowed": true, - "rebalance_headroom_pct": 0.998, + "partial_fills_allowed": false, + "rebalance_headroom_pct": 1.0, "rebalance_mode": "snapshot", - "reject_on_insufficient_cash": true, + "reject_on_insufficient_cash": false, "skip_cash_validation": true }, "position_sizing": { "share_type": "integer" }, "slippage": { - "model": "volume_based", - "rate": 0.1 + "model": "none", + "rate": 0.0 }, "stops": { - "stop_fill_mode": "stop_price", + "stop_fill_mode": "next_bar_open", "stop_level_basis": "fill_price", - "trail_hwm_source": "close", - "trail_stop_timing": "lagged" + "trail_hwm_source": "bar_extreme", + "trail_stop_timing": "intrabar" } } } diff --git a/tests/contracts/test_profile_parity_basics.py b/tests/contracts/test_profile_parity_basics.py index f7149b03..81125c04 100644 --- a/tests/contracts/test_profile_parity_basics.py +++ b/tests/contracts/test_profile_parity_basics.py @@ -47,6 +47,32 @@ def on_data(self, timestamp, data, context, broker) -> None: broker.submit_order("AAPL", 1.0) +def _prices_with_missing_middle() -> pl.DataFrame: + return ( + _prices() + .vstack( + pl.DataFrame( + { + "timestamp": [datetime(2024, 1, 3)], + "asset": ["AAPL"], + "open": [120.0], + "high": [120.0], + "low": [120.0], + "close": [120.0], + "volume": [1_000_000.0], + } + ) + ) + .with_columns( + pl.when(pl.col("timestamp") == datetime(2024, 1, 2)) + .then(float("nan")) + .otherwise(pl.col(column)) + .alias(column) + for column in ("open", "high", "low", "close") + ) + ) + + class _BuyWithTrailingStop(Strategy): def __init__(self) -> None: self.done = False @@ -105,41 +131,32 @@ def test_profiles_enforce_expected_entry_timing_contract() -> None: assert vbt.trades[0].entry_price == 101.0 # same-bar close assert bt.trades[0].entry_price == 110.0 # next-bar open with zero default slippage - assert 110.0 < zl.trades[0].entry_price < 111.0 # next-bar open with volume slippage + assert zl.trades[0].entry_price == 110.0 # configured next-bar open with zero slippage def test_vectorbt_profile_drops_signal_order_with_missing_close() -> None: - prices = ( - _prices() - .vstack( - pl.DataFrame( - { - "timestamp": [datetime(2024, 1, 3)], - "asset": ["AAPL"], - "open": [120.0], - "high": [120.0], - "low": [120.0], - "close": [120.0], - "volume": [1_000_000.0], - } - ) - ) - .with_columns( - pl.when(pl.col("timestamp") == datetime(2024, 1, 2)) - .then(float("nan")) - .otherwise(pl.col(column)) - .alias(column) - for column in ("open", "high", "low", "close") - ) + result = run_backtest( + prices=_prices_with_missing_middle(), + strategy=_BuyOnMissingClose(), + config="vectorbt", ) - result = run_backtest(prices=prices, strategy=_BuyOnMissingClose(), config="vectorbt") - assert result.fills == [] assert len(result.rejected_orders) == 1 assert result.rejected_orders[0].rejection_code == "price_unavailable" +def test_zipline_profile_defers_pending_order_across_stale_bar() -> None: + result = run_backtest( + prices=_prices_with_missing_middle(), + strategy=_BuyOnce(), + config="zipline", + ) + + assert result.fills[0].timestamp == datetime(2024, 1, 3) + assert result.fills[0].price == 120.0 + + def test_backtrader_profile_uses_signal_price_stop_basis() -> None: cfg = BacktestConfig.from_preset("backtrader") assert cfg.stop_level_basis == StopLevelBasis.SIGNAL_PRICE @@ -166,7 +183,7 @@ def test_backtrader_profile_parity_order_knobs() -> None: def test_zipline_profile_parity_order_knobs() -> None: cfg = BacktestConfig.from_preset("zipline") - assert cfg.rebalance_headroom_pct == 0.998 + assert cfg.rebalance_headroom_pct == 1.0 assert cfg.missing_price_policy.value == "use_last" assert cfg.late_asset_policy.value == "allow" diff --git a/tests/contracts/test_release_workflow.py b/tests/contracts/test_release_workflow.py index f8d826a4..3a162bef 100644 --- a/tests/contracts/test_release_workflow.py +++ b/tests/contracts/test_release_workflow.py @@ -159,6 +159,7 @@ def test_release_reuses_all_ci_gates_and_publishes_the_exact_candidate() -> None assert "validation/build_framework_env.py" in parity_commands assert "validation/native/vectorbt_behavior.py" in parity_commands assert "validation/native/backtrader_behavior.py" in parity_commands + assert "validation/native/zipline_behavior.py" in parity_commands assert "validation/run_all_correctness.py" in parity_commands assert "--extra comparison" not in parity_commands build_commands = "\n".join(step.get("run", "") for step in jobs["build"]["steps"]) diff --git a/tests/contracts/test_zipline_native_evidence.py b/tests/contracts/test_zipline_native_evidence.py new file mode 100644 index 00000000..f3a00f91 --- /dev/null +++ b/tests/contracts/test_zipline_native_evidence.py @@ -0,0 +1,66 @@ +"""Contracts for retained native and configured Zipline evidence.""" + +from __future__ import annotations + +import hashlib +import json +import sys +from pathlib import Path + +_ROOT = Path(__file__).parents[2] +_VALIDATION = _ROOT / "validation" +if str(_VALIDATION) not in sys.path: + sys.path.insert(0, str(_VALIDATION)) + +from common.provenance import comparison_protocol_metadata # noqa: E402 +from scenarios.definitions import SCENARIOS # noqa: E402 + +_ORACLE = _ROOT / "validation/native/zipline_behavior.py" +_EVIDENCE = _ROOT / "validation/native/evidence/zipline-3.1.1.json" + +EXPECTED_CHECKS = { + "cash_and_short_proceeds", + "configured_next_bar_open_fill", + "default_next_bar_close_fill", + "defaults", + "explicit_minimum_commission", + "final_bar_market_order", + "integer_target_percent", + "missing_bar", + "session_calendar", + "submission_sequence", + "target_percent_snapshot", + "transaction_records_not_native_trades", + "volume_share_partial_fills", +} + + +def test_retained_zipline_native_evidence_is_complete_and_current() -> None: + payload = json.loads(_EVIDENCE.read_text(encoding="utf-8")) + + assert payload["schema_version"] == 1 + assert payload["framework"] == "zipline" + assert payload["package"] == "zipline-reloaded" + assert payload["version"] == "3.1.1" + assert payload["source_commit"] == "09885a2ebc7567d40942c891b3879dc03c745070" + assert payload["artifact"] == "zipline_reloaded-3.1.1.tar.gz" + assert payload["artifact_sha256"] == ( + "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f" + ) + assert payload["oracle_sha256"] == hashlib.sha256(_ORACLE.read_bytes()).hexdigest() + assert payload["passed"] is True + assert {check["id"] for check in payload["checks"]} == EXPECTED_CHECKS + assert all(check["passed"] for check in payload["checks"]) + assert all(check["actual"] == check["expected"] for check in payload["checks"]) + for location in payload["source_locations"].values(): + assert location["artifact"] == payload["artifact"] + assert location["artifact_sha256"] == payload["artifact_sha256"] + assert payload["source_commit"] in location["source_url"] + + +def test_zipline_risk_scenarios_are_labeled_as_adapter_emulation() -> None: + for scenario in SCENARIOS.values(): + protocol = comparison_protocol_metadata(scenario, "zipline") + expected = "adapter_emulated_daily_ohlc" if scenario.risk_rules else "none" + assert protocol["risk_rules"] == expected + assert protocol["trade_records"] == "adapter_reconstructed_from_native_transactions" diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index 244dce64..76cf07ff 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -415,6 +415,12 @@ def test_zipline_strict_profile_uses_credit(self): assert config.short_cash_policy == ShortCashPolicy.CREDIT assert config.allow_leverage is False assert config.skip_cash_validation is True + assert config.fill_ordering == FillOrdering.FIFO + assert config.reject_on_insufficient_cash is False + assert config.partial_fills_allowed is False + assert config.commission_type == CommissionType.NONE + assert config.slippage_type == SlippageType.NONE + assert get_profile_config("zipline_strict") == get_profile_config("zipline") def test_backtrader_strict_profile_enables_submission_precheck(self): config = BacktestConfig.from_preset("backtrader_strict") diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index 3783cb46..03afe0aa 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -187,27 +187,58 @@ refers to `integer_target_percent` and `commission_headroom`. `BT-C` refers to ` `trailing_stop_signal_close_and_lagged`. `BT-D` refers to `missing_bar_uses_last_value` and `late_feed_start`. +### Zipline native evidence and comparison protocol + +The retained [Zipline Reloaded 3.1.1 evidence](native/evidence/zipline-3.1.1.json) contains 13 +checks executed through `zipline.run_algorithm` and direct construction of the frozen models. +The source locations resolve to commit `09885a2ebc7567d40942c891b3879dc03c745070`, and the +evidence identifies the source artifact and its SHA-256 digest. + +The native defaults and the comparison protocol are different: + +| Behavior | Zipline Reloaded 3.1.1 default | Suite comparison protocol | +|---|---|---| +| Daily fill | Next session close plus 5 basis points | Next session open | +| Equity commission | `$0.001` per share, `$0` minimum | No commission unless the scenario specifies one | +| Equity slippage | `FixedBasisPointsSlippage(5 bps, volume_limit=0.1)` | Custom open-price model with no volume cap | +| Optional volume-share model | `volume_limit=0.025`, `price_impact=0.1` | Used only by an explicit scenario or native check | +| Stop loss, take profit, trailing stop | No portfolio risk-rule protocol | Adapter evaluates daily OHLC and submits an exit | +| Closed trades | Native transactions and positions, no closed-trade column | Adapter reconstructs round trips from transactions | + +The `0.1` in `VolumeShareSlippage` is a coefficient in a quadratic price-impact formula. It is +not a 10% slippage rate. The profile and scenario matrix reproduce the suite protocol, not the +framework defaults. Each scenario record identifies adapter-emulated risk rules and reconstructed +trade records in `provenance.comparison_protocol`. + +`ZL-D` refers to `defaults` and `default_next_bar_close_fill`. `ZL-P` refers to +`configured_next_bar_open_fill` and `explicit_minimum_commission`. `ZL-S` refers to +`integer_target_percent` and `target_percent_snapshot`. `ZL-C` refers to +`cash_and_short_proceeds`. `ZL-O` refers to `submission_sequence` and +`final_bar_market_order`. `ZL-V` refers to `volume_share_partial_fills`. `ZL-X` refers to +`transaction_records_not_native_trades`. `ZL-M` refers to `session_calendar` and `missing_bar`. + ### Execution Timing -| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar (BT-T) | next_bar | **same_bar** | -| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open (BT-T) | next_bar_open | **same_bar** | -| `execution_price` | open | **close** | VBT-S | open (BT-T) | open | **close** | +| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar (BT-T) | next_bar (ZL-P) | **same_bar** | +| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open (BT-T) | next_bar_open (ZL-P) | **same_bar** | +| `execution_price` | open | **close** | VBT-S | open (BT-T) | open (ZL-P) | **close** | -VectorBT and LEAN both use same-bar execution with close fills. VectorBT is vectorized -(inherently same-bar), while LEAN processes market orders immediately at bar close in its -event-driven loop. All event-driven frameworks (BT, Zipline) except LEAN use next-bar open. +VectorBT and LEAN both use same-bar execution with close fills. VectorBT is vectorized, while LEAN +processes market orders immediately at bar close in its event-driven loop. Backtrader uses the +next bar's open. Zipline's native daily default uses the next session's close; the suite explicitly +replaces that model to fill at the next session's open. ### Stop/Risk Configuration -| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price (BT-R) | stop_price | stop_price | -| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price (BT-R)** | fill_price | fill_price | -| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close (BT-R) | close | close | -| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | signal_price (BT-R) | fill_price | fill_price | -| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged (BT-R) | lagged | lagged | +| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price (BT-R) | next_bar_open (adapter) | stop_price | +| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price (BT-R)** | fill_price (adapter) | fill_price | +| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close (BT-R) | bar_extreme (adapter) | close | +| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | signal_price (BT-R) | fill_price (adapter) | fill_price | +| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged (BT-R) | intrabar (adapter) | lagged | Backtrader calculates stop levels from **signal bar close** (the price when the strategy decided to trade), not the actual fill price. This matters when next-bar open differs significantly from @@ -215,41 +246,41 @@ previous close. ### Account & Cash -| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `allow_short_selling` | false | **true** | VBT-C | **true (BT-C)** | false | true | -| `allow_leverage` | false | false | VBT-C | false by default (BT-C) | false | true | -| `short_cash_policy` | credit | credit | VBT-C | credit (BT-C) | credit | credit | +| `allow_short_selling` | false | **true** | VBT-C | **true (BT-C)** | true (ZL-C) | true | +| `allow_leverage` | false | false | VBT-C | false by default (BT-C) | cash validation disabled (ZL-C) | true | +| `short_cash_policy` | credit | credit | VBT-C | credit (BT-C) | credit (ZL-C) | credit | | `initial_margin` | 0.5 | -- | VBT-C | -- (BT-C) | -- | varies | | `long_maint_margin` | 0.25 | -- | VBT-C | -- (BT-C) | -- | varies | | `short_maint_margin` | 0.30 | -- | VBT-C | -- (BT-C) | -- | varies | ### Order Handling -| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo (BT-O)** | exit_first | **exit_first** | -| `entry_order_priority` | submission | submission | VBT-C | submission (BT-O) | submission | submission | -| `immediate_fill` | false | **true** | VBT-S, VBT-O | false (BT-T) | false | **true** | -| `rebalance_mode` | incremental | **hybrid** | VBT-O | **snapshot (BT-O)** | **snapshot** | snapshot | -| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | 1.0 (BT-S) | **0.998** | 0.998 | -| `reject_on_insufficient_cash` | true | **false** | VBT-C | true (BT-C, BT-O) | true | true | -| `partial_fills_allowed` | false | **true** | VBT-C | false (BT-C) | **true** | false | -| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last (BT-D)** | **use_last** | use_last | -| `late_asset_policy` | allow after 1 bar | allow after 1 bar | VBT-O | allow after 1 bar (BT-D) | allow | allow | +| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo (BT-O)** | fifo (ZL-O) | **exit_first** | +| `entry_order_priority` | submission | submission | VBT-C | submission (BT-O) | submission (ZL-O) | submission | +| `immediate_fill` | false | **true** | VBT-S, VBT-O | false (BT-T) | false (ZL-P, ZL-O) | **true** | +| `rebalance_mode` | incremental | **hybrid** | VBT-O | **snapshot (BT-O)** | snapshot (ZL-S) | snapshot | +| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | 1.0 (BT-S) | 1.0 (ZL-S) | 0.998 | +| `reject_on_insufficient_cash` | true | **false** | VBT-C | true (BT-C, BT-O) | false (ZL-C) | true | +| `partial_fills_allowed` | false | **true** | VBT-C | false (BT-C) | false in protocol (ZL-P) | false | +| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last (BT-D)** | last price for sizing; stale bar defers fill (ZL-M) | use_last | +| `late_asset_policy` | allow after 1 bar | allow after 1 bar | VBT-O | allow after 1 bar (BT-D) | allow (ZL-M) | allow | ### Position Sizing & Costs -| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline | LEAN | +| Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `share_type` | integer | fractional | VBT-O | integer (BT-S) | integer | integer | -| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | adapter checks position | check position | check position | -| `commission_model` | none | none | VBT-F | none (BT-C) | **per_share** | per_share | +| `share_type` | integer | fractional | VBT-O | integer (BT-S) | integer (ZL-S) | integer | +| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | adapter checks position | adapter checks position | check position | +| `commission_model` | none | none | VBT-F | none (BT-C) | none (ZL-P) | per_share | | `commission_rate` | 0% | 0% | VBT-F | 0% (BT-C) | -- | -- | -| `commission_per_share` | -- | -- | VBT-F | -- | **$0.005** | varies | -| `commission_minimum` | $0 | -- | VBT-F | -- | **$1.00** | varies | -| `slippage_model` | none | none | VBT-F | none (BT-C) | **volume_based** | volume_based | -| `slippage_rate` | 0% | 0% | VBT-F | 0% (BT-C) | **10%** | varies | +| `commission_per_share` | -- | -- | VBT-F | -- | -- (ZL-P) | varies | +| `commission_minimum` | $0 | -- | VBT-F | -- | -- (ZL-P) | varies | +| `slippage_model` | none | none | VBT-F | none (BT-C) | custom open, zero cost (ZL-P) | volume_based | +| `slippage_rate` | 0% | 0% | VBT-F | 0% (BT-C) | 0% (ZL-P) | varies | ### Comparison profiles @@ -257,8 +288,8 @@ previous close. the prior locked-short-proceeds, rejection, or FIFO overrides. `backtrader` now uses the measured framework defaults for costs, leverage, target headroom, missing bars, and late feeds. `backtrader_strict` adds submission-time cash checks to reproduce Backtrader's enabled -`checksubmit` path. Zipline retains comparison-specific settings pending its native checks and -current large-scale workload. +`checksubmit` path. `zipline_strict` resolves to the same settings as `zipline`; both represent the +explicit comparison protocol described above. The native Zipline defaults remain separate. --- diff --git a/validation/benchmark_suite.py b/validation/benchmark_suite.py index 0e169980..ac85924b 100644 --- a/validation/benchmark_suite.py +++ b/validation/benchmark_suite.py @@ -1338,9 +1338,8 @@ def _disable_commission(cfg: BacktestConfig) -> None: # Clear every direct commission field, not just type+rate. The broker # auto-activates a cost model whenever any direct field (per_share / # per_trade / rate) is non-zero, even when commission_type is NONE, so a - # partial reset would leave a preset's per-share/minimum commission live - # (e.g. zipline_strict carries per_share=0.005, minimum=1.0) and silently - # re-enable it — breaking parity against the zero-commission reference run. + # partial reset could leave direct per-share or per-trade values live and + # silently re-enable costs, breaking parity against a zero-cost reference. cfg.commission_type = CommissionType.NONE cfg.commission_rate = 0.0 cfg.commission_per_share = 0.0 diff --git a/validation/common/provenance.py b/validation/common/provenance.py index faf0f06a..9bafee80 100644 --- a/validation/common/provenance.py +++ b/validation/common/provenance.py @@ -155,6 +155,18 @@ def installed_framework_version(target: FrameworkTarget) -> str: return importlib.metadata.version(target.package) +def comparison_protocol_metadata(scenario: ScenarioConfig, framework: str) -> dict[str, str]: + """Identify native and adapter-emulated portions of a comparison.""" + if framework != "zipline": + return {"risk_rules": "framework_adapter"} + return { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "risk_rules": "adapter_emulated_daily_ohlc" if scenario.risk_rules else "none", + "trade_records": "adapter_reconstructed_from_native_transactions", + } + + def build_record_provenance( *, scenario: ScenarioConfig, @@ -183,6 +195,7 @@ def build_record_provenance( "module": f"frameworks.{framework}", "path": adapter_path.relative_to(PROJECT_ROOT).as_posix(), }, + "comparison_protocol": comparison_protocol_metadata(scenario, framework), "digests": static_digests(scenario, framework), "input_digest": input_digest(prices, entries, exits), "record_counts": { diff --git a/validation/native/evidence/zipline-3.1.1.json b/validation/native/evidence/zipline-3.1.1.json new file mode 100644 index 00000000..32839bac --- /dev/null +++ b/validation/native/evidence/zipline-3.1.1.json @@ -0,0 +1,608 @@ +{ + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "artifact_sha256": "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "checks": [ + { + "actual": { + "commission_class": "PerShare", + "commission_minimum": 0, + "commission_per_share": 0.001, + "slippage_basis_points": 5.0, + "slippage_class": "FixedBasisPointsSlippage", + "slippage_volume_limit": 0.1, + "volume_share_price_impact": 0.1, + "volume_share_volume_limit": 0.025 + }, + "expected": { + "commission_class": "PerShare", + "commission_minimum": 0, + "commission_per_share": 0.001, + "slippage_basis_points": 5.0, + "slippage_class": "FixedBasisPointsSlippage", + "slippage_volume_limit": 0.1, + "volume_share_price_impact": 0.1, + "volume_share_volume_limit": 0.025 + }, + "id": "defaults", + "passed": true + }, + { + "actual": { + "cash_after_fill": 879.9390000000001, + "transactions": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 120.06, + "transaction_commission": 0.0 + } + ] + }, + "expected": { + "cash_after_fill": 879.9390000000001, + "transactions": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 120.06, + "transaction_commission": 0.0 + } + ] + }, + "id": "default_next_bar_close_fill", + "passed": true + }, + { + "actual": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ], + "expected": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ], + "id": "configured_next_bar_open_fill", + "passed": true + }, + { + "actual": { + "cash_after_fill": 889.0, + "transactions": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "expected": { + "cash_after_fill": 889.0, + "transactions": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "id": "explicit_minimum_commission", + "passed": true + }, + { + "actual": { + "orders": [ + { + "amount": 5, + "date": "2024-01-02", + "filled": 0, + "status": 0 + }, + { + "amount": 5, + "date": "2024-01-03", + "filled": 5, + "status": 1 + } + ], + "transactions": [ + { + "amount": 5, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "expected": { + "orders": [ + { + "amount": 5, + "date": "2024-01-02", + "filled": 0, + "status": 0 + }, + { + "amount": 5, + "date": "2024-01-03", + "filled": 5, + "status": 1 + } + ], + "transactions": [ + { + "amount": 5, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "id": "integer_target_percent", + "passed": true + }, + { + "actual": { + "submitted_amounts": [ + 5, + 5 + ], + "transactions": [ + { + "amount": 5, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + }, + { + "amount": 5, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "expected": { + "submitted_amounts": [ + 5, + 5 + ], + "transactions": [ + { + "amount": 5, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + }, + { + "amount": 5, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "id": "target_percent_snapshot", + "passed": true + }, + { + "actual": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + }, + { + "amount": -1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ], + "expected": [ + { + "amount": 1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + }, + { + "amount": -1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ], + "id": "submission_sequence", + "passed": true + }, + { + "actual": { + "long": { + "cash_after_fill": -1200.0, + "position_after_fill": 20, + "transactions": [ + { + "amount": 20, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "short": { + "cash_after_fill": 1110.0, + "position_after_fill": -1, + "transactions": [ + { + "amount": -1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + } + }, + "expected": { + "long": { + "cash_after_fill": -1200.0, + "position_after_fill": 20, + "transactions": [ + { + "amount": 20, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + }, + "short": { + "cash_after_fill": 1110.0, + "position_after_fill": -1, + "transactions": [ + { + "amount": -1, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + } + ] + } + }, + "id": "cash_and_short_proceeds", + "passed": true + }, + { + "actual": [ + { + "amount": 2, + "date": "2024-01-03", + "price": 120.0048, + "transaction_commission": 0.0 + }, + { + "amount": 2, + "date": "2024-01-04", + "price": 130.0052, + "transaction_commission": 0.0 + }, + { + "amount": 1, + "date": "2024-01-05", + "price": 140.0014, + "transaction_commission": 0.0 + } + ], + "expected": [ + { + "amount": 2, + "date": "2024-01-03", + "price": 120.0048, + "transaction_commission": 0.0 + }, + { + "amount": 2, + "date": "2024-01-04", + "price": 130.0052, + "transaction_commission": 0.0 + }, + { + "amount": 1, + "date": "2024-01-05", + "price": 140.0014, + "transaction_commission": 0.0 + } + ], + "id": "volume_share_partial_fills", + "passed": true + }, + { + "actual": { + "native_output_columns": [ + "orders", + "positions", + "transactions" + ], + "native_trade_column": false, + "transactions": [ + { + "amount": 2, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + }, + { + "amount": -2, + "date": "2024-01-05", + "price": 130.0, + "transaction_commission": 0.0 + } + ] + }, + "expected": { + "native_output_columns": [ + "orders", + "positions", + "transactions" + ], + "native_trade_column": false, + "transactions": [ + { + "amount": 2, + "date": "2024-01-03", + "price": 110.0, + "transaction_commission": 0.0 + }, + { + "amount": -2, + "date": "2024-01-05", + "price": 130.0, + "transaction_commission": 0.0 + } + ] + }, + "id": "transaction_records_not_native_trades", + "passed": true + }, + { + "actual": [], + "expected": [], + "id": "final_bar_market_order", + "passed": true + }, + { + "actual": [ + "2024-01-02", + "2024-01-03", + "2024-01-04", + "2024-01-05", + "2024-01-08", + "2024-01-09", + "2024-01-10", + "2024-01-11" + ], + "expected": [ + "2024-01-02", + "2024-01-03", + "2024-01-04", + "2024-01-05", + "2024-01-08", + "2024-01-09", + "2024-01-10", + "2024-01-11" + ], + "id": "session_calendar", + "passed": true + }, + { + "actual": { + "observations": [ + { + "close": 100.0, + "date": "2024-01-02", + "price": 100.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 120.0, + "date": "2024-01-03", + "price": 120.0, + "stale": false, + "volume": 100.0 + }, + { + "close": null, + "date": "2024-01-04", + "price": 120.0, + "stale": true, + "volume": 0.0 + }, + { + "close": 140.0, + "date": "2024-01-05", + "price": 140.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 150.0, + "date": "2024-01-08", + "price": 150.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 160.0, + "date": "2024-01-09", + "price": 160.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 170.0, + "date": "2024-01-10", + "price": 170.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 180.0, + "date": "2024-01-11", + "price": 180.0, + "stale": false, + "volume": 100.0 + } + ], + "transactions": [ + { + "amount": 1, + "date": "2024-01-05", + "price": 130.0, + "transaction_commission": 0.0 + } + ] + }, + "expected": { + "observations": [ + { + "close": 100.0, + "date": "2024-01-02", + "price": 100.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 120.0, + "date": "2024-01-03", + "price": 120.0, + "stale": false, + "volume": 100.0 + }, + { + "close": null, + "date": "2024-01-04", + "price": 120.0, + "stale": true, + "volume": 0.0 + }, + { + "close": 140.0, + "date": "2024-01-05", + "price": 140.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 150.0, + "date": "2024-01-08", + "price": 150.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 160.0, + "date": "2024-01-09", + "price": 160.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 170.0, + "date": "2024-01-10", + "price": 170.0, + "stale": false, + "volume": 100.0 + }, + { + "close": 180.0, + "date": "2024-01-11", + "price": 180.0, + "stale": false, + "volume": 100.0 + } + ], + "transactions": [ + { + "amount": 1, + "date": "2024-01-05", + "price": 130.0, + "transaction_commission": 0.0 + } + ] + }, + "id": "missing_bar", + "passed": true + } + ], + "comparison_protocol": { + "commission": "NoCommission", + "execution": "next-session custom OpenPriceSlippage", + "risk_rules": "adapter-emulated from daily OHLC; not Zipline native trade records", + "slippage": "no volume cap unless a scenario explicitly configures slippage" + }, + "framework": "zipline", + "oracle_sha256": "1804d3fae3a56ec930aba31fc832214d6be6f8a3f6d2e8043b4bd1f0a1040346", + "package": "zipline-reloaded", + "passed": true, + "schema_version": 1, + "source_commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "source_locations": { + "algorithm_target_percent": { + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "artifact_sha256": "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "line": 1807, + "module": "zipline.algorithm", + "path": "zipline/utils/api_support.py", + "qualname": "TradingAlgorithm.order_target_percent", + "source_url": "https://github.com/stefan-jansen/zipline-reloaded/blob/09885a2ebc7567d40942c891b3879dc03c745070/zipline/utils/api_support.py#L1807" + }, + "commission": { + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "artifact_sha256": "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "line": 163, + "module": "zipline.finance.commission", + "path": "zipline/finance/commission.py", + "qualname": "PerShare.__init__", + "source_url": "https://github.com/stefan-jansen/zipline-reloaded/blob/09885a2ebc7567d40942c891b3879dc03c745070/zipline/finance/commission.py#L163" + }, + "default_blotter": { + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "artifact_sha256": "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "line": 42, + "module": "zipline.finance.blotter.simulation_blotter", + "path": "zipline/finance/blotter/simulation_blotter.py", + "qualname": "SimulationBlotter.__init__", + "source_url": "https://github.com/stefan-jansen/zipline-reloaded/blob/09885a2ebc7567d40942c891b3879dc03c745070/zipline/finance/blotter/simulation_blotter.py#L42" + }, + "fixed_basis_points": { + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "artifact_sha256": "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "line": 663, + "module": "zipline.finance.slippage", + "path": "zipline/finance/slippage.py", + "qualname": "FixedBasisPointsSlippage.process_order", + "source_url": "https://github.com/stefan-jansen/zipline-reloaded/blob/09885a2ebc7567d40942c891b3879dc03c745070/zipline/finance/slippage.py#L663" + }, + "volume_share": { + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "artifact_sha256": "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "line": 288, + "module": "zipline.finance.slippage", + "path": "zipline/finance/slippage.py", + "qualname": "VolumeShareSlippage.process_order", + "source_url": "https://github.com/stefan-jansen/zipline-reloaded/blob/09885a2ebc7567d40942c891b3879dc03c745070/zipline/finance/slippage.py#L288" + } + }, + "version": "3.1.1" +} diff --git a/validation/native/zipline_behavior.py b/validation/native/zipline_behavior.py new file mode 100644 index 00000000..d8fdcc3c --- /dev/null +++ b/validation/native/zipline_behavior.py @@ -0,0 +1,712 @@ +#!/usr/bin/env python3 +"""Measure frozen Zipline Reloaded behavior without ML4T comparison code.""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib +import importlib.metadata +import inspect +import json +import math +import sys +import warnings +from pathlib import Path +from typing import Any + +import pandas as pd + +VERSION = "3.1.1" +COMMIT = "09885a2ebc7567d40942c891b3879dc03c745070" +ARTIFACT = "zipline_reloaded-3.1.1.tar.gz" +ARTIFACT_SHA256 = "4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f" +REPOSITORY = "https://github.com/stefan-jansen/zipline-reloaded" + +zipline: Any = importlib.import_module("zipline") +api: Any = importlib.import_module("zipline.api") +commission: Any = importlib.import_module("zipline.finance.commission") +slippage: Any = importlib.import_module("zipline.finance.slippage") +blotter_module: Any = importlib.import_module("zipline.finance.blotter.simulation_blotter") +algorithm_module: Any = importlib.import_module("zipline.algorithm") +calendar_module: Any = importlib.import_module("exchange_calendars") +bundles_module: Any = importlib.import_module("zipline.data.bundles") + + +def _source_location(function: Any) -> dict[str, Any]: + source_file = inspect.getsourcefile(function) + if source_file is None: + raise RuntimeError(f"Could not locate source for {function}") + package_root = Path(zipline.__file__).resolve().parent.parent + relative_path = Path(source_file).resolve().relative_to(package_root).as_posix() + line = inspect.getsourcelines(function)[1] + return { + "artifact": ARTIFACT, + "artifact_sha256": ARTIFACT_SHA256, + "line": line, + "module": function.__module__, + "path": relative_path, + "qualname": function.__qualname__, + "source_url": f"{REPOSITORY}/blob/{COMMIT}/{relative_path}#L{line}", + } + + +def _frame() -> pd.DataFrame: + calendar = calendar_module.get_calendar("XNYS") + sessions = calendar.sessions_in_range("2024-01-02", "2024-01-12")[:8] + return pd.DataFrame( + { + "open": [100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0], + "high": [101.0, 121.0, 131.0, 141.0, 151.0, 161.0, 171.0, 181.0], + "low": [99.0, 109.0, 119.0, 129.0, 139.0, 149.0, 159.0, 169.0], + "close": [100.0, 120.0, 130.0, 140.0, 150.0, 160.0, 170.0, 180.0], + "volume": [100.0] * 8, + }, + index=pd.DatetimeIndex(sessions).tz_localize(None), + ) + + +def _setup_bundle(frame: pd.DataFrame, name: str) -> str: + def ingest_function( + _environ: Any, + asset_db_writer: Any, + _minute_bar_writer: Any, + daily_bar_writer: Any, + adjustment_writer: Any, + calendar: Any, + start_session: Any, + end_session: Any, + _cache: Any, + show_progress: bool, + _output_dir: Any, + ) -> None: + sessions = calendar.sessions_in_range(start_session, end_session) + trading_frame = frame.loc[frame.index.isin(pd.DatetimeIndex(sessions).tz_localize(None))] + asset_db_writer.write( + equities=pd.DataFrame( + { + "symbol": ["TEST"], + "asset_name": ["Native behavior asset"], + "exchange": ["NYSE"], + } + ) + ) + daily_bar_writer.write( + [(0, trading_frame[["open", "high", "low", "close", "volume"]])], + show_progress=show_progress, + ) + adjustment_writer.write() + + if name in bundles_module.bundles: + bundles_module.unregister(name) + bundles_module.register( + name, + ingest_function, + calendar_name="XNYS", + start_session=frame.index[0], + end_session=frame.index[-1], + ) + bundles_module.ingest(name, show_progress=False) + return name + + +def _run( + bundle: str, + frame: pd.DataFrame, + initialize_case: Any, + handle_case: Any, +) -> pd.DataFrame: + def initialize(context: Any) -> None: + context.asset = api.symbol("TEST") + context.bar_number = 0 + initialize_case(context) + + def handle_data(context: Any, data: Any) -> None: + handle_case(context, data) + context.bar_number += 1 + + return zipline.run_algorithm( + start=frame.index[0], + end=frame.index[-1], + initialize=initialize, + handle_data=handle_data, + analyze=lambda _context, _performance: None, + capital_base=1_000.0, + bundle=bundle, + data_frequency="daily", + ) + + +class OpenPriceSlippage(slippage.SlippageModel): + """Explicit comparison protocol: next-session open with no volume cap.""" + + @staticmethod + def process_order(data: Any, order: Any) -> tuple[float, int]: + return data.current(order.asset, "open"), order.open_amount + + +def _configure_open(_context: Any) -> None: + api.set_commission(commission.NoCommission()) + api.set_slippage(OpenPriceSlippage()) + + +def _transactions(results: pd.DataFrame) -> list[dict[str, Any]]: + records: list[dict[str, Any]] = [] + for transactions in results["transactions"]: + for transaction in transactions: + records.append( + { + "amount": int(transaction["amount"]), + "date": pd.Timestamp(transaction["dt"]).date().isoformat(), + "price": float(transaction["price"]), + "transaction_commission": float(transaction["commission"] or 0.0), + } + ) + return records + + +def _orders(results: pd.DataFrame) -> list[dict[str, Any]]: + records: list[dict[str, Any]] = [] + for orders in results["orders"]: + for order in orders: + records.append( + { + "amount": int(order["amount"]), + "date": pd.Timestamp(order["dt"]).date().isoformat(), + "filled": int(order["filled"]), + "status": int(order["status"]), + } + ) + return records + + +def _submitted_amounts(results: pd.DataFrame) -> list[int]: + seen: set[str] = set() + amounts: list[int] = [] + for orders in results["orders"]: + for order in orders: + order_id = str(order["id"]) + if order_id not in seen: + seen.add(order_id) + amounts.append(int(order["amount"])) + return amounts + + +def _default_models() -> dict[str, Any]: + broker = blotter_module.SimulationBlotter() + equity_type = importlib.import_module("zipline.assets").Equity + default_slippage = broker.slippage_models[equity_type] + default_commission = broker.commission_models[equity_type] + volume_share = slippage.VolumeShareSlippage() + return { + "commission_class": type(default_commission).__name__, + "commission_per_share": default_commission.cost_per_share, + "commission_minimum": default_commission.min_trade_cost, + "slippage_class": type(default_slippage).__name__, + "slippage_basis_points": default_slippage.basis_points, + "slippage_volume_limit": default_slippage.volume_limit, + "volume_share_price_impact": volume_share.price_impact, + "volume_share_volume_limit": volume_share.volume_limit, + } + + +def _default_fill(bundle: str, frame: pd.DataFrame) -> dict[str, Any]: + results = _run( + bundle, + frame, + lambda _context: None, + lambda context, _data: api.order(context.asset, 1) if context.bar_number == 0 else None, + ) + return { + "cash_after_fill": float(results["ending_cash"].iloc[1]), + "transactions": _transactions(results), + } + + +def _explicit_minimum_commission(bundle: str, frame: pd.DataFrame) -> dict[str, Any]: + def configure(_context: Any) -> None: + api.set_commission(commission.PerShare(cost=0.005, min_trade_cost=1.0)) + api.set_slippage(OpenPriceSlippage()) + + results = _run( + bundle, + frame, + configure, + lambda context, _data: api.order(context.asset, 1) if context.bar_number == 0 else None, + ) + return { + "cash_after_fill": float(results["ending_cash"].iloc[1]), + "transactions": _transactions(results), + } + + +def _open_fill(bundle: str, frame: pd.DataFrame) -> list[dict[str, Any]]: + results = _run( + bundle, + frame, + _configure_open, + lambda context, _data: api.order(context.asset, 1) if context.bar_number == 0 else None, + ) + return _transactions(results) + + +def _target_percent(bundle: str, frame: pd.DataFrame) -> dict[str, Any]: + results = _run( + bundle, + frame, + _configure_open, + lambda context, _data: api.order_target_percent(context.asset, 0.5) + if context.bar_number == 0 + else None, + ) + return {"orders": _orders(results), "transactions": _transactions(results)} + + +def _target_percent_snapshot(bundle: str, frame: pd.DataFrame) -> dict[str, Any]: + def handle(context: Any, _data: Any) -> None: + if context.bar_number == 0: + api.order_target_percent(context.asset, 0.5) + api.order_target_percent(context.asset, 0.5) + + results = _run(bundle, frame, _configure_open, handle) + return { + "submitted_amounts": _submitted_amounts(results), + "transactions": _transactions(results), + } + + +def _submission_sequence(bundle: str, frame: pd.DataFrame) -> list[dict[str, Any]]: + def handle(context: Any, _data: Any) -> None: + if context.bar_number == 0: + api.order(context.asset, 1) + api.order(context.asset, -1) + + return _transactions(_run(bundle, frame, _configure_open, handle)) + + +def _cash_and_short(bundle: str, frame: pd.DataFrame) -> dict[str, Any]: + long_results = _run( + bundle, + frame, + _configure_open, + lambda context, _data: api.order(context.asset, 20) if context.bar_number == 0 else None, + ) + short_results = _run( + bundle, + frame, + _configure_open, + lambda context, _data: api.order(context.asset, -1) if context.bar_number == 0 else None, + ) + return { + "long": { + "cash_after_fill": float(long_results["ending_cash"].iloc[1]), + "position_after_fill": int(long_results["positions"].iloc[1][0]["amount"]), + "transactions": _transactions(long_results), + }, + "short": { + "cash_after_fill": float(short_results["ending_cash"].iloc[1]), + "position_after_fill": int(short_results["positions"].iloc[1][0]["amount"]), + "transactions": _transactions(short_results), + }, + } + + +def _volume_share_partial(bundle: str, frame: pd.DataFrame) -> list[dict[str, Any]]: + def configure(_context: Any) -> None: + api.set_commission(commission.NoCommission()) + api.set_slippage(slippage.VolumeShareSlippage()) + + results = _run( + bundle, + frame, + configure, + lambda context, _data: api.order(context.asset, 5) if context.bar_number == 0 else None, + ) + return _transactions(results) + + +def _round_trip_records(bundle: str, frame: pd.DataFrame) -> dict[str, Any]: + def handle(context: Any, _data: Any) -> None: + if context.bar_number == 0: + api.order(context.asset, 2) + elif context.bar_number == 2: + api.order_target(context.asset, 0) + + results = _run(bundle, frame, _configure_open, handle) + return { + "transactions": _transactions(results), + "native_output_columns": sorted( + column for column in ("orders", "positions", "transactions") if column in results + ), + "native_trade_column": "trades" in results, + } + + +def _final_bar_order(bundle: str, frame: pd.DataFrame) -> list[dict[str, Any]]: + results = _run( + bundle, + frame, + _configure_open, + lambda context, _data: api.order(context.asset, 1) + if context.bar_number == len(frame) - 1 + else None, + ) + return _transactions(results) + + +def _missing_bar(frame: pd.DataFrame) -> dict[str, Any]: + missing_frame = frame.copy() + missing_frame.loc[frame.index[2], ["open", "high", "low", "close"]] = float("nan") + missing_frame.loc[frame.index[2], "volume"] = 0.0 + bundle = _setup_bundle(missing_frame, "ml4t_native_zipline_311_missing") + + def handle(context: Any, data: Any) -> None: + api.record( + observed_close=data.current(context.asset, "close"), + observed_price=data.current(context.asset, "price"), + observed_stale=data.is_stale(context.asset), + observed_volume=data.current(context.asset, "volume"), + ) + if context.bar_number == 1: + api.order(context.asset, 1) + + results = _run(bundle, frame, _configure_open, handle) + observations = [] + for date, row in results.iterrows(): + observations.append( + { + "close": None if pd.isna(row["observed_close"]) else float(row["observed_close"]), + "date": pd.Timestamp(str(date)).date().isoformat(), + "price": None if pd.isna(row["observed_price"]) else float(row["observed_price"]), + "stale": bool(row["observed_stale"]), + "volume": float(row["observed_volume"]), + } + ) + return {"observations": observations, "transactions": _transactions(results)} + + +def _expected_missing_bar(frame: pd.DataFrame) -> dict[str, Any]: + observations = [] + closes = [100.0, 120.0, None, 140.0, 150.0, 160.0, 170.0, 180.0] + prices = [100.0, 120.0, 120.0, 140.0, 150.0, 160.0, 170.0, 180.0] + for index, date in enumerate(frame.index): + observations.append( + { + "close": closes[index], + "date": date.date().isoformat(), + "price": prices[index], + "stale": index == 2, + "volume": 0.0 if index == 2 else 100.0, + } + ) + return { + "observations": observations, + "transactions": [ + { + "amount": 1, + "date": frame.index[3].date().isoformat(), + "price": 130.0, + "transaction_commission": 0.0, + } + ], + } + + +def _equal(actual: Any, expected: Any) -> bool: + if isinstance(actual, float) and isinstance(expected, (float, int)): + return math.isclose(actual, float(expected), rel_tol=0.0, abs_tol=1e-10) + if isinstance(actual, list) and isinstance(expected, list) and len(actual) == len(expected): + return all(_equal(left, right) for left, right in zip(actual, expected, strict=True)) + if isinstance(actual, dict) and isinstance(expected, dict) and actual.keys() == expected.keys(): + return all(_equal(actual[key], expected[key]) for key in actual) + return bool(actual == expected) + + +def run() -> dict[str, Any]: + actual_version = importlib.metadata.version("zipline-reloaded") + if actual_version != VERSION: + raise RuntimeError(f"zipline-reloaded version differs: {actual_version} != {VERSION}") + + frame = _frame() + bundle = _setup_bundle(frame, "ml4t_native_zipline_311") + measurements = [ + ( + "defaults", + _default_models(), + { + "commission_class": "PerShare", + "commission_per_share": 0.001, + "commission_minimum": 0, + "slippage_class": "FixedBasisPointsSlippage", + "slippage_basis_points": 5.0, + "slippage_volume_limit": 0.1, + "volume_share_price_impact": 0.1, + "volume_share_volume_limit": 0.025, + }, + ), + ( + "default_next_bar_close_fill", + _default_fill(bundle, frame), + { + "cash_after_fill": 879.9390000000001, + "transactions": [ + { + "amount": 1, + "date": frame.index[1].date().isoformat(), + "price": 120.06, + "transaction_commission": 0.0, + } + ], + }, + ), + ( + "configured_next_bar_open_fill", + _open_fill(bundle, frame), + [ + { + "amount": 1, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + } + ], + ), + ( + "explicit_minimum_commission", + _explicit_minimum_commission(bundle, frame), + { + "cash_after_fill": 889.0, + "transactions": [ + { + "amount": 1, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + } + ], + }, + ), + ( + "integer_target_percent", + _target_percent(bundle, frame), + { + "orders": [ + { + "amount": 5, + "date": frame.index[0].date().isoformat(), + "filled": 0, + "status": 0, + }, + { + "amount": 5, + "date": frame.index[1].date().isoformat(), + "filled": 5, + "status": 1, + }, + ], + "transactions": [ + { + "amount": 5, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + } + ], + }, + ), + ( + "target_percent_snapshot", + _target_percent_snapshot(bundle, frame), + { + "submitted_amounts": [5, 5], + "transactions": [ + { + "amount": 5, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + }, + { + "amount": 5, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + }, + ], + }, + ), + ( + "submission_sequence", + _submission_sequence(bundle, frame), + [ + { + "amount": 1, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + }, + { + "amount": -1, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + }, + ], + ), + ( + "cash_and_short_proceeds", + _cash_and_short(bundle, frame), + { + "long": { + "cash_after_fill": -1_200.0, + "position_after_fill": 20, + "transactions": [ + { + "amount": 20, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + } + ], + }, + "short": { + "cash_after_fill": 1_110.0, + "position_after_fill": -1, + "transactions": [ + { + "amount": -1, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + } + ], + }, + }, + ), + ( + "volume_share_partial_fills", + _volume_share_partial(bundle, frame), + [ + { + "amount": 2, + "date": frame.index[1].date().isoformat(), + "price": 120.0048, + "transaction_commission": 0.0, + }, + { + "amount": 2, + "date": frame.index[2].date().isoformat(), + "price": 130.0052, + "transaction_commission": 0.0, + }, + { + "amount": 1, + "date": frame.index[3].date().isoformat(), + "price": 140.0014, + "transaction_commission": 0.0, + }, + ], + ), + ( + "transaction_records_not_native_trades", + _round_trip_records(bundle, frame), + { + "transactions": [ + { + "amount": 2, + "date": frame.index[1].date().isoformat(), + "price": 110.0, + "transaction_commission": 0.0, + }, + { + "amount": -2, + "date": frame.index[3].date().isoformat(), + "price": 130.0, + "transaction_commission": 0.0, + }, + ], + "native_output_columns": ["orders", "positions", "transactions"], + "native_trade_column": False, + }, + ), + ("final_bar_market_order", _final_bar_order(bundle, frame), []), + ( + "session_calendar", + [date.date().isoformat() for date in frame.index], + [ + "2024-01-02", + "2024-01-03", + "2024-01-04", + "2024-01-05", + "2024-01-08", + "2024-01-09", + "2024-01-10", + "2024-01-11", + ], + ), + ("missing_bar", _missing_bar(frame), _expected_missing_bar(frame)), + ] + checks = [ + {"id": check_id, "actual": actual, "expected": expected, "passed": _equal(actual, expected)} + for check_id, actual, expected in measurements + ] + return { + "schema_version": 1, + "framework": "zipline", + "package": "zipline-reloaded", + "version": actual_version, + "source_commit": COMMIT, + "artifact": ARTIFACT, + "artifact_sha256": ARTIFACT_SHA256, + "oracle_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), + "comparison_protocol": { + "commission": "NoCommission", + "execution": "next-session custom OpenPriceSlippage", + "risk_rules": "adapter-emulated from daily OHLC; not Zipline native trade records", + "slippage": "no volume cap unless a scenario explicitly configures slippage", + }, + "source_locations": { + "algorithm_target_percent": _source_location( + algorithm_module.TradingAlgorithm.order_target_percent + ), + "commission": _source_location(commission.PerShare.__init__), + "default_blotter": _source_location(blotter_module.SimulationBlotter.__init__), + "fixed_basis_points": _source_location(slippage.FixedBasisPointsSlippage.process_order), + "volume_share": _source_location(slippage.VolumeShareSlippage.process_order), + }, + "checks": checks, + "passed": all(check["passed"] for check in checks), + } + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + warnings.filterwarnings( + "ignore", + message="DataFrameGroupBy.apply operated on the grouping columns.*", + category=FutureWarning, + ) + warnings.filterwarnings( + "ignore", + message="Ignoring 4 values because they are out of bounds for uint32.*", + category=UserWarning, + ) + try: + evidence = run() + except (ImportError, OSError, RuntimeError, TypeError, ValueError) as error: + print(f"Zipline native behavior run failed: {error}", file=sys.stderr) + return 2 + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8") + failed = [check["id"] for check in evidence["checks"] if not check["passed"]] + if failed: + print(f"Zipline native behavior differs: {failed}", file=sys.stderr) + return 1 + print(f"Zipline native behavior passed: {len(evidence['checks'])} checks") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 1e353fa7..fa3b63a0 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -18,4 +18,5 @@ validation/common/provenance.py validation/common/types.py validation/native/vectorbt_behavior.py validation/native/backtrader_behavior.py +validation/native/zipline_behavior.py validation/scenarios/definitions.py From 4325305f550f04ac271969e6d1a094f9fd24925b Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 00:44:39 -0400 Subject: [PATCH 07/44] fix(validation): establish current LEAN behavior --- .github/workflows/private-comparisons.yml | 21 +- README.md | 2 +- docs/index.md | 4 +- docs/user-guide/accounts.md | 3 +- docs/user-guide/profiles.md | 39 +- .../backtest/_validation/case_study_lean.py | 29 +- src/ml4t/backtest/_validation/lean_runner.py | 27 +- src/ml4t/backtest/accounting/policy.py | 8 +- src/ml4t/backtest/config.py | 2 +- src/ml4t/backtest/profiles.py | 13 +- .../accounting/test_margin_account_policy.py | 24 +- tests/benchmark/test_case_study_lean.py | 40 +- tests/compatibility/snapshots/v0.1.json | 13 +- .../test_lean_case_study_evidence.py | 86 + tests/contracts/test_lean_native_evidence.py | 75 + tests/contracts/test_lean_orchestration.py | 72 + tests/contracts/test_profile_parity_basics.py | 13 +- tests/contracts/test_release_workflow.py | 4 + .../contracts/test_static_analysis_policy.py | 1 + tests/test_config_wiring.py | 4 +- validation/METHODOLOGY.md | 80 +- validation/README.md | 15 +- validation/benchmark_suite.py | 18 +- validation/lean/README.md | 197 +- validation/lean/case_study_evidence.json | 247 + .../market-hours/market-hours-database.json | 457 + .../symbol-properties-database.csv | 2 + validation/lean/support/lean.json | 6 + .../chapter16_etfs/ml4t_order_events.csv.xz | Bin 181828 -> 182272 bytes .../ml4t_order_events.csv | 7400 ++++++++--------- .../ml4t_order_events.csv.part01.xz | Bin 300628 -> 300712 bytes .../ml4t_order_events.csv.part02.xz | Bin 282220 -> 281664 bytes validation/native/evidence/lean-18001.json | 2276 +++++ validation/native/lean_behavior.py | 517 ++ validation/native/lean_project/config.json | 6 + validation/native/lean_project/main.py | 136 + validation/release_checks.txt | 2 + validation/run_lean_case_studies.py | 316 + 38 files changed, 8221 insertions(+), 3934 deletions(-) create mode 100644 tests/contracts/test_lean_case_study_evidence.py create mode 100644 tests/contracts/test_lean_native_evidence.py create mode 100644 tests/contracts/test_lean_orchestration.py create mode 100644 validation/lean/case_study_evidence.json create mode 100644 validation/lean/support/data/market-hours/market-hours-database.json create mode 100644 validation/lean/support/data/symbol-properties/symbol-properties-database.csv create mode 100644 validation/lean/support/lean.json create mode 100644 validation/native/evidence/lean-18001.json create mode 100644 validation/native/lean_behavior.py create mode 100644 validation/native/lean_project/config.json create mode 100644 validation/native/lean_project/main.py create mode 100644 validation/run_lean_case_studies.py diff --git a/.github/workflows/private-comparisons.yml b/.github/workflows/private-comparisons.yml index 4ff7ceff..544f14b9 100644 --- a/.github/workflows/private-comparisons.yml +++ b/.github/workflows/private-comparisons.yml @@ -70,7 +70,7 @@ jobs: retention-days: 90 lean: - name: LEAN Engine Identity + name: LEAN Native Behavior runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -89,10 +89,27 @@ jobs: --framework lean --evidence-output lean-environment.json + - name: Measure native LEAN behavior + run: >- + .venv-lean/bin/python + validation/native/lean_behavior.py + --lean-command .venv-lean/bin/lean + --output lean-native.json + + - name: Run the LEAN Chapter 16 comparisons + run: >- + .venv-lean/bin/python + validation/run_lean_case_studies.py + --lean-command .venv-lean/bin/lean + --output lean-case-studies.json + - name: Retain LEAN provenance uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: lean-comparison-${{ github.sha }} - path: lean-environment.json + path: | + lean-environment.json + lean-native.json + lean-case-studies.json if-no-files-found: error retention-days: 90 diff --git a/README.md b/README.md index 094501b8..426ce09e 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ config = BacktestConfig.from_preset("backtrader") # Match the documented Zipline comparison protocol (next-bar open, no default costs) config = BacktestConfig.from_preset("zipline") -# Match QuantConnect LEAN behavior (same-bar close fills, integer shares) +# Match the frozen LEAN daily US-equity protocol (next-session open, integer shares) config = BacktestConfig.from_preset("lean") # Conservative production settings (higher costs, cash buffer) diff --git a/docs/index.md b/docs/index.md index 73fbf3c6..1a58b096 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,8 +21,8 @@ how cash is reserved, and how results change when you match another framework's - :material-check-all:{ .lg .middle } __Validated Against 4 Frameworks__ --- - Compare fills and terminal values against VectorBT, Backtrader, Zipline, - and LEAN on the same benchmark scenarios. + Compare retained scenario evidence for VectorBT, Backtrader, and Zipline, + plus native and Chapter 16 evidence for LEAN. [:octicons-arrow-right-24: Profiles](user-guide/profiles.md) - :material-book-open-variant:{ .lg .middle } __Chapters 16-19__ diff --git a/docs/user-guide/accounts.md b/docs/user-guide/accounts.md index e5293348..0410660b 100644 --- a/docs/user-guide/accounts.md +++ b/docs/user-guide/accounts.md @@ -187,7 +187,8 @@ config = BacktestConfig.from_preset("realistic") Each preset configures the measured behavior used by its comparison protocol. The native defaults, explicit overrides, and adapter-emulated behavior are listed in the -[validation methodology](../../validation/METHODOLOGY.md). Strict aliases are also available for +[validation methodology](https://github.com/ml4t/backtest/blob/main/validation/METHODOLOGY.md). +Strict aliases are also available for the retained comparison commands. ## Insufficient Funds diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index 9da5e7bd..e3c325e6 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -15,7 +15,7 @@ exactly and which remain release-blocking. | `backtrader` | Match Backtrader's default behavior | | `vectorbt` | Match VectorBT's default behavior (including fractional shares) | | `zipline` | Match the documented Zipline comparison protocol | -| `lean` | Match QuantConnect LEAN's default behavior | +| `lean` | Match the frozen LEAN daily US-equity comparison protocol | | `realistic` | Conservative settings for production | ### Broker Presets @@ -30,6 +30,11 @@ The broker preset also supports a modular alias: |-------|-------------| | `ibkr:us:stocks:fixed` | `ibkr_us_stocks_fixed` | +The `lean` profile is scoped to daily US equities submitted from `OnData` with +`DefaultBrokerageModel`, a margin account, and 2x security leverage. LEAN delegates fees, +slippage, margin, and fills to selected brokerage and security models, so this profile is not a +claim about every LEAN asset class, resolution, or brokerage model. + ### Strict Profiles Strict variants are the names used by retained comparison commands: @@ -83,24 +88,27 @@ Profiles define behavioral defaults. Quote-aware feeds layer on top of them: you | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Execution mode | next_bar | next_bar | same_bar | next_bar | same_bar | next_bar | -| Execution price | open | open | close | open | close | open | +| Execution mode | next_bar | next_bar | same_bar | next_bar | next_bar | next_bar | +| Execution price | open | open | close | open | open | open | ### Stops | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Fill mode | stop_price | stop_price | stop_price | next_bar_open | stop_price | next_bar_open | -| Level basis | fill_price | signal_price | fill_price | fill_price | fill_price | fill_price | -| Trail HWM | close | close | bar_extreme | bar_extreme | close | close | -| Trail timing | lagged | lagged | intrabar | intrabar | lagged | lagged | +| Fill mode | stop_price | stop_price | stop_price | next_bar_open | stop_price* | next_bar_open | +| Level basis | fill_price | signal_price | fill_price | fill_price | fill_price* | fill_price | +| Trail HWM | close | close | bar_extreme | bar_extreme | close* | close | +| Trail timing | lagged | lagged | intrabar | intrabar | lagged* | lagged | + +`*` The LEAN stop settings are ML4T profile fallbacks. The current native LEAN oracle does not +claim stop-order parity. ### Account | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| | Short selling | No | Yes | Yes | Yes | Yes | No | -| Leverage | No | No | No | Cash validation disabled | No | No | +| Leverage | No | No | No | Cash validation disabled | Yes, 2x | No | | Share type | integer | integer | fractional | integer | integer | integer | ### Costs @@ -108,28 +116,35 @@ Profiles define behavioral defaults. Quote-aware feeds layer on top of them: you | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| | Commission | none | none | none | none | $0.005/share | 0.2% | -| Slippage | none | none | none | none | 0.1% | 0.2% | +| Slippage | none | none | none | none | none | 0.2% | | Stop slippage | 0 | 0 | 0 | 0 | 0 | 0.1% | | Cash buffer | 0% | 0% | 0% | 0% | 0% | 2% | +| Target-weight multiplier | 100% | 100% | 100% | 100% | 99.75% | 100% | ### Order Processing | Setting | default | backtrader | vectorbt | zipline | lean | realistic | |---------|---------|-----------|----------|---------|------|-----------| -| Fill ordering | exit_first | fifo | exit_first | fifo | exit_first | exit_first | +| Fill ordering | exit_first | fifo | exit_first | fifo | sequential | exit_first | | Reject insuff. | yes | yes | no | no | yes | yes | | Partial fills | no | no | yes | no | no | no | | Rebalance mode | incremental | snapshot | hybrid | snapshot | snapshot | incremental | ## Parity Validation -Framework profiles can be validated at two levels: +Framework profiles are validated on the workloads each retained artifact declares: -1. **Scenario-level** (16 scenarios per framework): Exact trade-by-trade matching on synthetic data covering entries, exits, stops, trailing stops, brackets, and multi-asset strategies. +1. **Scenario-level**: Exact trade-by-trade matching on the required synthetic matrix for + VectorBT, Backtrader, and Zipline. 2. **Large-scale**: Trade-by-trade comparison on a retained real-data workload. A claim is omitted when no passing artifact is retained for that framework. +LEAN has separate native-behavior and Chapter 16 case-study evidence. The frozen engine produced +47,652 fills across three case studies; ML4T matched every canonical fill and each terminal value +at the declared $0.0001 quantum. See `validation/native/evidence/lean-18001.json` and +`validation/lean/case_study_evidence.json`. + diff --git a/src/ml4t/backtest/_validation/case_study_lean.py b/src/ml4t/backtest/_validation/case_study_lean.py index 2f6782ad..885e45c2 100644 --- a/src/ml4t/backtest/_validation/case_study_lean.py +++ b/src/ml4t/backtest/_validation/case_study_lean.py @@ -28,6 +28,7 @@ import math import re import zipfile +from decimal import ROUND_HALF_EVEN, Decimal from pathlib import Path import pandas as pd @@ -39,10 +40,25 @@ from ..strategy import Strategy _NUMBER = r"[-+]?(?:\d[\d_]*(?:\.\d[\d_]*)?|\.\d[\d_]*)(?:[eE][-+]?\d[\d_]*)?" +_MONEY_QUANTUM = Decimal("0.0001") +RETAINED_ORDER_EVENT_ARTIFACTS = { + "chapter16_etfs": ("ml4t_order_events.csv.xz",), + "chapter16_sp500_equity_option_analytics": ("ml4t_order_events.csv",), + "chapter16_us_equities_panel": ( + "ml4t_order_events.csv.part01.xz", + "ml4t_order_events.csv.part02.xz", + ), +} def _csv_path(base_dir: Path, name: str) -> Path: - for suffix in ("", ".xz", ".gz"): + if name == "ml4t_order_events.csv": + retained = RETAINED_ORDER_EVENT_ARTIFACTS.get(base_dir.name) + if retained and len(retained) == 1: + candidate = base_dir / retained[0] + if candidate.is_file(): + return candidate + for suffix in (".xz", ".gz", ""): path = base_dir / f"{name}{suffix}" if path.exists(): return path @@ -249,7 +265,7 @@ def lean_side(workspace_dir: Path) -> dict: final_value = float(equity["equity"].iloc[-1]) events = _read_csv_fixture(workspace_dir, "ml4t_order_events.csv", low_memory=False) - filled = events[events["status"].astype(str) == "Filled"].copy() + filled = events[events["status"].astype(str).str.lower() == "filled"].copy() filled["asset"] = filled["symbol"].astype(str).map(symbol_map).fillna(filled["symbol"]) filled = filled.rename(columns={"fill_quantity": "quantity", "fill_price": "price"}) filled["side"] = filled["direction"].astype(str).str.lower() @@ -267,11 +283,20 @@ def compare(lean: dict, ml4t: dict) -> dict: len(ls) == len(ms) and not (lean["fills"][cols].reset_index(drop=True) != ml4t["fills"][cols]).any().any() ) + lean_value = Decimal(str(lean["final_value"])).quantize( + _MONEY_QUANTUM, rounding=ROUND_HALF_EVEN + ) + ml4t_value = Decimal(str(ml4t["final_value"])).quantize( + _MONEY_QUANTUM, rounding=ROUND_HALF_EVEN + ) return { "lean_final_value": lean["final_value"], "ml4t_final_value": ml4t["final_value"], "final_value_gap_usd": ml4t["final_value"] - lean["final_value"], "final_value_gap_pct": ml4t["final_value"] / lean["final_value"] - 1.0, + "canonical_final_value_gap_usd": float(ml4t_value - lean_value), + "canonical_final_value_match": ml4t_value == lean_value, + "final_value_quantum_usd": float(_MONEY_QUANTUM), "lean_fills": len(lean["fills"]), "ml4t_fills": len(ml4t["fills"]), "fill_gap": len(ml4t["fills"]) - len(lean["fills"]), diff --git a/src/ml4t/backtest/_validation/lean_runner.py b/src/ml4t/backtest/_validation/lean_runner.py index 49bc861a..3afb17cc 100644 --- a/src/ml4t/backtest/_validation/lean_runner.py +++ b/src/ml4t/backtest/_validation/lean_runner.py @@ -184,15 +184,25 @@ def load_lean_artifacts( def resolve_lean_command() -> list[str]: - """Resolve the local LEAN CLI command.""" + """Resolve a preinstalled LEAN CLI command without installing an unpinned version.""" + configured = os.getenv("ML4T_LEAN_COMMAND") + if configured: + return [configured] + + locked_binary = ( + Path.cwd() / ".venv-lean" / ("Scripts/lean.exe" if os.name == "nt" else "bin/lean") + ) + if locked_binary.is_file(): + return [str(locked_binary)] + lean_binary = shutil.which("lean") if lean_binary is not None: return [lean_binary] - uvx_binary = shutil.which("uvx") - if uvx_binary is None: - raise FileNotFoundError("Neither 'lean' nor 'uvx' executable found.") - return [uvx_binary, "--python", "3.12", "--with", "setuptools<81", "lean"] + raise FileNotFoundError( + "LEAN CLI not found; build the frozen environment with " + "validation/build_framework_env.py --framework lean" + ) def make_lean_env() -> dict[str, str]: @@ -308,10 +318,13 @@ def run_lean_backtest( project_dir: Path, lean_config: Path, output_dir: Path, + image: str, timeout: int = 1800, env: dict[str, str] | None = None, ) -> float: - """Run a LEAN backtest and return the runtime in seconds.""" + """Run a LEAN backtest with an immutable engine image and return its runtime.""" + if "@sha256:" not in image: + raise ValueError(f"LEAN image must use an immutable digest: {image}") if output_dir.exists(): shutil.rmtree(output_dir) @@ -320,6 +333,8 @@ def run_lean_backtest( str(project_dir), "--lean-config", str(lean_config), + "--image", + image, "--no-update", "--output", str(output_dir), diff --git a/src/ml4t/backtest/accounting/policy.py b/src/ml4t/backtest/accounting/policy.py index 964bbb67..2c35a524 100644 --- a/src/ml4t/backtest/accounting/policy.py +++ b/src/ml4t/backtest/accounting/policy.py @@ -335,14 +335,14 @@ def __init__( raise ValueError( f"Short maintenance margin must be in (0.0, 1.0], got {short_maintenance_margin}" ) - if long_maintenance_margin >= initial_margin: + if long_maintenance_margin > initial_margin: raise ValueError( - f"Long maintenance margin ({long_maintenance_margin}) must be < " + f"Long maintenance margin ({long_maintenance_margin}) must be <= " f"initial margin ({initial_margin})" ) - if short_maintenance_margin >= initial_margin: + if short_maintenance_margin > initial_margin: raise ValueError( - f"Short maintenance margin ({short_maintenance_margin}) must be < " + f"Short maintenance margin ({short_maintenance_margin}) must be <= " f"initial margin ({initial_margin})" ) diff --git a/src/ml4t/backtest/config.py b/src/ml4t/backtest/config.py index 8e5f9736..6b1b239a 100644 --- a/src/ml4t/backtest/config.py +++ b/src/ml4t/backtest/config.py @@ -1221,7 +1221,7 @@ def from_preset(cls, preset: str) -> BacktestConfig: - "backtrader": Match Backtrader's default behavior - "vectorbt": Match VectorBT's default behavior - "zipline": Match Zipline's default behavior - - "lean": Match QuantConnect LEAN's default behavior + - "lean": Match the frozen LEAN daily US-equity comparison protocol - "realistic": Conservative settings for realistic simulation - "ibkr_us_stocks_fixed": Interactive Brokers US stocks fixed pricing """ diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index 91347aa5..43f90256 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -294,8 +294,8 @@ "allow_short_selling": True, "allow_leverage": True, "initial_margin": 0.5, - "long_maintenance_margin": 0.25, - "short_maintenance_margin": 0.30, + "long_maintenance_margin": 0.5, + "short_maintenance_margin": 0.5, "short_cash_policy": "credit", }, "execution": { @@ -318,8 +318,8 @@ "minimum": 1.0, }, "slippage": { - "model": "percentage", - "rate": 0.001, + "model": "none", + "rate": 0.0, }, "cash": { "initial": 100000.0, @@ -328,11 +328,12 @@ "orders": { "reject_on_insufficient_cash": True, "partial_fills_allowed": False, - "fill_ordering": "exit_first", + "fill_ordering": "sequential", "entry_order_priority": "submission", + "buying_power_reservation": False, "next_bar_queue_shadow_validation": True, "rebalance_mode": "snapshot", - "rebalance_headroom_pct": 1.0, + "rebalance_headroom_pct": 0.9975, "missing_price_policy": "use_last", "late_asset_policy": "allow", "late_asset_min_bars": 1, diff --git a/tests/accounting/test_margin_account_policy.py b/tests/accounting/test_margin_account_policy.py index 3e0bca5e..e3eeb7cf 100644 --- a/tests/accounting/test_margin_account_policy.py +++ b/tests/accounting/test_margin_account_policy.py @@ -66,8 +66,8 @@ def test_invalid_maintenance_margin_too_high(self): ) def test_invalid_maintenance_greater_than_initial(self): - """Test that long_maintenance_margin must be < initial_margin.""" - with pytest.raises(ValueError, match="maintenance margin.*must be <"): + """Test that long_maintenance_margin must be <= initial_margin.""" + with pytest.raises(ValueError, match="maintenance margin.*must be <="): UnifiedAccountPolicy( allow_short_selling=True, allow_leverage=True, @@ -75,15 +75,17 @@ def test_invalid_maintenance_greater_than_initial(self): long_maintenance_margin=0.5, ) - def test_invalid_maintenance_equal_to_initial(self): - """Test that long_maintenance_margin cannot equal initial_margin.""" - with pytest.raises(ValueError, match="maintenance margin.*must be <"): - UnifiedAccountPolicy( - allow_short_selling=True, - allow_leverage=True, - initial_margin=0.5, - long_maintenance_margin=0.5, - ) + def test_maintenance_can_equal_initial(self): + """Support models that use the same initial and maintenance requirement.""" + policy = UnifiedAccountPolicy( + allow_short_selling=True, + allow_leverage=True, + initial_margin=0.5, + long_maintenance_margin=0.5, + short_maintenance_margin=0.5, + ) + assert policy.long_maintenance_margin == 0.5 + assert policy.short_maintenance_margin == 0.5 class TestMarginAccountPolicyBuyingPower: diff --git a/tests/benchmark/test_case_study_lean.py b/tests/benchmark/test_case_study_lean.py index 59ce6c96..8c1a77c6 100644 --- a/tests/benchmark/test_case_study_lean.py +++ b/tests/benchmark/test_case_study_lean.py @@ -8,11 +8,17 @@ from __future__ import annotations +import lzma from pathlib import Path import pytest -from ml4t.backtest._validation.case_study_lean import compare, lean_side, run_ml4t_lean +from ml4t.backtest._validation.case_study_lean import ( + _read_csv_fixture, + compare, + lean_side, + run_ml4t_lean, +) WORKSPACE = Path(__file__).resolve().parents[2] / "validation" / "lean" / "workspace" DATA_DAILY = WORKSPACE / "data" / "equity" / "usa" / "daily" @@ -32,6 +38,36 @@ def _has_reference_artifacts(workspace_dir: Path) -> bool: ) +def test_retained_compressed_surface_precedes_ignored_runtime_file(tmp_path: Path) -> None: + (tmp_path / "surface.csv").write_text("value\n1\n", encoding="utf-8") + (tmp_path / "surface.csv.xz").write_bytes(lzma.compress(b"value\n2\n")) + + assert _read_csv_fixture(tmp_path, "surface.csv")["value"].tolist() == [2] + + +def test_lean_side_accepts_current_uppercase_order_status(tmp_path: Path) -> None: + (tmp_path / "ml4t_symbol_map.json").write_text('{"AAAA": "AAPL"}', encoding="utf-8") + (tmp_path / "ml4t_daily_equity.csv").write_text( + "timestamp,equity\n2024-01-03,10010\n", + encoding="utf-8", + ) + (tmp_path / "ml4t_order_events.csv").write_text( + "timestamp,symbol,status,direction,fill_quantity,fill_price\n" + "2024-01-03,AAAA,FILLED,BUY,1,110\n", + encoding="utf-8", + ) + + result = lean_side(tmp_path) + + assert result["n_trades"] == 1 + row = result["fills"].iloc[0] + assert str(row["timestamp"].date()) == "2024-01-03" + assert row["asset"] == "AAPL" + assert row["side"] == "buy" + assert row["quantity"] == 1.0 + assert row["price"] == 110.0 + + # The generic equity-decomposition invariant (initial + closed_pnl + open_pnl == # final_value) does not model 2x margin, but parity here is asserted directly # against LEAN's terminal value (external ground truth), which matches exactly. @@ -52,6 +88,8 @@ def test_case_study_lean_parity(project: str) -> None: f"(lean={result['lean_fills']} ml4t={result['ml4t_fills']})" ) assert result["fill_gap"] == 0 + assert result["canonical_final_value_match"] + assert result["canonical_final_value_gap_usd"] == 0.0 assert abs(result["final_value_gap_usd"]) < 1e-4, ( f"{project}: terminal value gap ${result['final_value_gap_usd']:.6f}" ) diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index edd50261..36a603c4 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -1430,9 +1430,9 @@ "allow_leverage": true, "allow_short_selling": true, "initial_margin": 0.5, - "long_maintenance_margin": 0.25, + "long_maintenance_margin": 0.5, "short_cash_policy": "credit", - "short_maintenance_margin": 0.3 + "short_maintenance_margin": 0.5 }, "cash": { "buffer_pct": 0.0, @@ -1449,14 +1449,15 @@ "execution_price": "open" }, "orders": { + "buying_power_reservation": false, "entry_order_priority": "submission", - "fill_ordering": "exit_first", + "fill_ordering": "sequential", "late_asset_min_bars": 1, "late_asset_policy": "allow", "missing_price_policy": "use_last", "next_bar_queue_shadow_validation": true, "partial_fills_allowed": false, - "rebalance_headroom_pct": 1.0, + "rebalance_headroom_pct": 0.9975, "rebalance_mode": "snapshot", "reject_on_insufficient_cash": true }, @@ -1464,8 +1465,8 @@ "share_type": "integer" }, "slippage": { - "model": "percentage", - "rate": 0.001 + "model": "none", + "rate": 0.0 }, "stops": { "stop_fill_mode": "stop_price", diff --git a/tests/contracts/test_lean_case_study_evidence.py b/tests/contracts/test_lean_case_study_evidence.py new file mode 100644 index 00000000..2e6dacd7 --- /dev/null +++ b/tests/contracts/test_lean_case_study_evidence.py @@ -0,0 +1,86 @@ +"""Contracts for retained fresh LEAN case-study evidence.""" + +from __future__ import annotations + +import gzip +import hashlib +import json +import lzma +from pathlib import Path + +_ROOT = Path(__file__).parents[2] +_WORKSPACE = _ROOT / "validation/lean/workspace" +_DATA = _WORKSPACE / "data/equity/usa/daily" +_SUPPORT = _ROOT / "validation/lean/support" +_EVIDENCE = _ROOT / "validation/lean/case_study_evidence.json" +_CASES = { + "chapter16_etfs", + "chapter16_sp500_equity_option_analytics", + "chapter16_us_equities_panel", +} + + +def _digest(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def _read_compressed(path: Path) -> bytes: + payload = path.read_bytes() + if path.suffix == ".xz": + return lzma.decompress(payload) + if path.suffix == ".gz": + return gzip.decompress(payload) + return payload + + +def _reconstruct_order_events(paths: list[Path]) -> bytes: + parts = [_read_compressed(path) for path in paths] + if len(parts) == 1: + return parts[0] + header = parts[0].splitlines(keepends=True)[0] + body = [parts[0], *(b"".join(part.splitlines(keepends=True)[1:]) for part in parts[1:])] + assert parts[0].startswith(header) + return b"".join(body) + + +def test_retained_lean_case_study_evidence_is_fresh_and_complete() -> None: + payload = json.loads(_EVIDENCE.read_text(encoding="utf-8")) + + assert payload["schema_version"] == 1 + assert payload["passed"] is True + assert payload["promoted"] is True + assert payload["framework"]["version"] == "18001" + assert payload["framework"]["artifact"].startswith("quantconnect/lean@sha256:") + assert payload["cli_observed"] == "lean 1.0.228" + assert {case["case"] for case in payload["cases"]} == _CASES + + for relative, digest in payload["producer_files"].items(): + assert _digest(_ROOT / relative) == digest + for relative, digest in payload["support_files"].items(): + assert _digest(_SUPPORT / relative) == digest + + for case in payload["cases"]: + assert case["passed"] is True + assert case["comparison"]["fill_gap"] == 0 + assert case["comparison"]["sorted_fill_multiset_match"] is True + assert case["comparison"]["canonical_final_value_match"] is True + assert case["comparison"]["canonical_final_value_gap_usd"] == 0.0 + assert case["lean_fill_surface_sha256"] == case["ml4t_fill_surface_sha256"] + + project = _WORKSPACE / case["case"] + for relative, digest in case["inputs"].items(): + path = ( + _DATA / Path(relative).name if relative.startswith("data/") else project / relative + ) + assert _digest(path) == digest + + retained = [_ROOT / relative for relative in case["retained_artifacts"]] + for path in retained: + assert _digest(path) == case["retained_artifacts"][path.relative_to(_ROOT).as_posix()] + order_paths = [path for path in retained if "order_events" in path.name] + equity_path = next(path for path in retained if path.name == "ml4t_daily_equity.csv") + assert ( + hashlib.sha256(_reconstruct_order_events(order_paths)).hexdigest() + == case["raw_order_events_sha256"] + ) + assert _digest(equity_path) == case["raw_daily_equity_sha256"] diff --git a/tests/contracts/test_lean_native_evidence.py b/tests/contracts/test_lean_native_evidence.py new file mode 100644 index 00000000..4391909f --- /dev/null +++ b/tests/contracts/test_lean_native_evidence.py @@ -0,0 +1,75 @@ +"""Contracts for retained framework-native LEAN evidence.""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path + +_ROOT = Path(__file__).parents[2] +_ORACLE = _ROOT / "validation/native/lean_behavior.py" +_PROJECT = _ROOT / "validation/native/lean_project" +_SUPPORT = _ROOT / "validation/lean/support" +_EVIDENCE = _ROOT / "validation/native/evidence/lean-18001.json" + +EXPECTED_CHECKS = { + "buying_power_allowed", + "buying_power_rejected", + "buying_power_sequence", + "default_full_fill", + "default_models", + "explicit_costs", + "fill_forward", + "final_bar_order", + "liquidation", + "submission_sequence", + "target_sizing", + "terminal_holding", + "timing", +} + + +def test_retained_lean_native_evidence_is_complete_and_current() -> None: + payload = json.loads(_EVIDENCE.read_text(encoding="utf-8")) + + assert payload["schema_version"] == 1 + assert payload["framework"] == "lean" + assert payload["engine"]["engine_version"] == "18001" + assert payload["engine"]["source_commit"] == ("278fcb3d1b815b63ccadba68d7ae54422e34b792") + assert payload["engine"]["image"] == ( + "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70" + ) + assert payload["engine"]["platform_artifact"] == ( + "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307" + ) + assert payload["cli"] == { + "immutable_id": ("sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c"), + "package": "lean", + "version": "1.0.228", + } + assert payload["models"] == { + "account_type": "Margin", + "brokerage": "DefaultBrokerageModel", + "security": "Equity USA, daily, adjusted normalization, leverage 2", + } + assert payload["oracle_sha256"] == hashlib.sha256(_ORACLE.read_bytes()).hexdigest() + expected_files = { + path.relative_to(_PROJECT).as_posix(): hashlib.sha256(path.read_bytes()).hexdigest() + for path in sorted(_PROJECT.rglob("*")) + if path.is_file() + } + assert payload["oracle_files"] == expected_files + expected_support = { + path.relative_to(_SUPPORT).as_posix(): hashlib.sha256(path.read_bytes()).hexdigest() + for path in sorted(_SUPPORT.rglob("*")) + if path.is_file() + } + assert payload["support_files"] == expected_support + assert payload["passed"] is True + assert {check["id"] for check in payload["checks"]} == EXPECTED_CHECKS + assert all(check["passed"] for check in payload["checks"]) + assert all(check["contract_actual"] == check["expected"] for check in payload["checks"]) + assert all( + payload["engine"]["source_commit"] in source + for source in payload["source_references"].values() + ) diff --git a/tests/contracts/test_lean_orchestration.py b/tests/contracts/test_lean_orchestration.py new file mode 100644 index 00000000..5cf0f333 --- /dev/null +++ b/tests/contracts/test_lean_orchestration.py @@ -0,0 +1,72 @@ +"""Contracts for immutable LEAN engine orchestration.""" + +from __future__ import annotations + +from pathlib import Path +from types import SimpleNamespace + +import pytest + +from ml4t.backtest._validation import lean_runner + + +def test_lean_backtest_requires_an_immutable_image(tmp_path: Path) -> None: + with pytest.raises(ValueError, match="immutable digest"): + lean_runner.run_lean_backtest( + lean_cmd=["lean"], + cwd=tmp_path, + project_dir=tmp_path / "project", + lean_config=tmp_path / "lean.json", + output_dir=tmp_path / "output", + image="quantconnect/lean:latest", + ) + + +def test_lean_command_resolution_does_not_install_an_unpinned_cli( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, +) -> None: + monkeypatch.chdir(tmp_path) + monkeypatch.delenv("ML4T_LEAN_COMMAND", raising=False) + monkeypatch.setattr(lean_runner.shutil, "which", lambda _name: None) + + with pytest.raises(FileNotFoundError, match="frozen environment"): + lean_runner.resolve_lean_command() + + +def test_lean_backtest_passes_the_frozen_image_to_the_cli( + monkeypatch: pytest.MonkeyPatch, + tmp_path: Path, +) -> None: + calls: list[list[str]] = [] + + def fake_run(command: list[str], **kwargs: object) -> SimpleNamespace: + calls.append(command) + return SimpleNamespace(returncode=0, stdout="", stderr="") + + monkeypatch.setattr(lean_runner.subprocess, "run", fake_run) + image = "quantconnect/lean@sha256:" + "a" * 64 + + lean_runner.run_lean_backtest( + lean_cmd=["lean"], + cwd=tmp_path, + project_dir=tmp_path / "project", + lean_config=tmp_path / "lean.json", + output_dir=tmp_path / "output", + image=image, + ) + + assert calls == [ + [ + "lean", + "backtest", + str(tmp_path / "project"), + "--lean-config", + str(tmp_path / "lean.json"), + "--image", + image, + "--no-update", + "--output", + str(tmp_path / "output"), + ] + ] diff --git a/tests/contracts/test_profile_parity_basics.py b/tests/contracts/test_profile_parity_basics.py index 81125c04..2a1b7ccb 100644 --- a/tests/contracts/test_profile_parity_basics.py +++ b/tests/contracts/test_profile_parity_basics.py @@ -128,10 +128,12 @@ def test_profiles_enforce_expected_entry_timing_contract() -> None: vbt = run_backtest(prices=_prices(), strategy=_BuyOnce(), config="vectorbt") bt = run_backtest(prices=_prices(), strategy=_BuyOnce(), config="backtrader") zl = run_backtest(prices=_prices(), strategy=_BuyOnce(), config="zipline") + lean = run_backtest(prices=_prices(), strategy=_BuyOnce(), config="lean") assert vbt.trades[0].entry_price == 101.0 # same-bar close assert bt.trades[0].entry_price == 110.0 # next-bar open with zero default slippage assert zl.trades[0].entry_price == 110.0 # configured next-bar open with zero slippage + assert lean.trades[0].entry_price == 110.0 # DefaultBrokerageModel has null slippage def test_vectorbt_profile_drops_signal_order_with_missing_close() -> None: @@ -198,16 +200,23 @@ def test_profile_registry_has_lean_profile() -> None: """LEAN profile must be a core profile, not just a strict variant.""" cfg = BacktestConfig.from_preset("lean") assert cfg.preset_name == "lean" - assert cfg.fill_ordering.value == "exit_first" + assert cfg.execution_mode.value == "next_bar" + assert cfg.execution_price.value == "open" + assert cfg.fill_ordering.value == "sequential" assert cfg.commission_per_share == 0.005 assert cfg.commission_minimum == 1.0 + assert cfg.slippage_type.value == "none" + assert cfg.initial_margin == 0.5 + assert cfg.long_maintenance_margin == 0.5 + assert cfg.short_maintenance_margin == 0.5 + assert cfg.rebalance_headroom_pct == 0.9975 def test_lean_profile_is_independent_of_backtrader() -> None: """LEAN profile must remain distinct from Backtrader on execution semantics.""" lean = BacktestConfig.from_preset("lean") bt = BacktestConfig.from_preset("backtrader") - assert lean.fill_ordering.value == "exit_first" + assert lean.fill_ordering.value == "sequential" assert bt.fill_ordering.value == "fifo" assert lean.commission_per_share == 0.005 assert bt.commission_rate == 0.0 diff --git a/tests/contracts/test_release_workflow.py b/tests/contracts/test_release_workflow.py index 3a162bef..f1316344 100644 --- a/tests/contracts/test_release_workflow.py +++ b/tests/contracts/test_release_workflow.py @@ -206,4 +206,8 @@ def test_private_comparison_workflow_pins_and_retains_evidence() -> None: assert "--framework vectorbt_pro" in pro_commands lean_commands = "\n".join(step.get("run", "") for step in jobs["lean"]["steps"]) assert "--framework lean" in lean_commands + assert "validation/native/lean_behavior.py" in lean_commands + assert "validation/run_lean_case_studies.py" in lean_commands + assert "lean-native.json" in str(jobs["lean"]) + assert "lean-case-studies.json" in str(jobs["lean"]) assert "run_all_correctness.py" not in lean_commands diff --git a/tests/contracts/test_static_analysis_policy.py b/tests/contracts/test_static_analysis_policy.py index 17cda8e8..72914528 100644 --- a/tests/contracts/test_static_analysis_policy.py +++ b/tests/contracts/test_static_analysis_policy.py @@ -93,6 +93,7 @@ def test_ci_checks_every_release_validation_script() -> None: "validation/lean/workspace/chapter16_etfs/main.py", "validation/lean/workspace/chapter16_sp500_equity_option_analytics/main.py", "validation/lean/workspace/chapter16_us_equities_panel/main.py", + "validation/native/lean_project/main.py", # Legacy manual orchestrators require optional framework environments. "validation/benchmark_suite.py", "validation/run_all_benchmarks.py", diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index 76cf07ff..ea2fd126 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -900,7 +900,9 @@ def test_realistic_preset_values(self): def test_lean_preset_values(self): config = BacktestConfig.from_preset("lean") assert config.share_type == ShareType.INTEGER - assert config.fill_ordering == FillOrdering.EXIT_FIRST + assert config.fill_ordering == FillOrdering.SEQUENTIAL + assert config.rebalance_headroom_pct == 0.9975 + assert config.slippage_type == SlippageType.NONE assert config.next_bar_queue_shadow_validation is True def test_ibkr_us_stocks_fixed_preset_values(self): diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index 03afe0aa..eafbabf3 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -38,7 +38,7 @@ replicate that framework's behavior: | `vectorbt` / `vectorbt_strict` | VectorBT Pro/OSS | 0% trade gap, 0% value gap | | `backtrader` / `backtrader_strict` | Backtrader | 0% trade gap, 0% value gap | | `zipline` / `zipline_strict` | Zipline Reloaded | 0% trade gap, 0% value gap | -| `lean` | QuantConnect LEAN | 0% fill gap, near-0% value gap | +| `lean` | Frozen LEAN daily US-equity protocol | 0 fill gap, 0 canonical value gap | | `default` | ml4t's own opinion | Best-practice defaults | | `realistic` | Conservative simulation | Adds costs, integer shares | @@ -134,8 +134,8 @@ Update the behavioral difference matrix, profile diffs, and parity results. ## Anti-Patterns **DO NOT** accept gaps as "structural" or "expected": -- "LEAN fills at bar close, ml4t at next-bar open -- this is a structural difference" is WRONG -- CORRECT: "We need to add `execution_price=close` to the lean profile to close this gap" +- "The engines use different order timing, so the gap is expected" is wrong. +- Identify the native event sequence, configure the corresponding profile, or narrow the claim. **DO NOT** say "this is good enough for production": - 95% parity is not the goal -- 100% parity is the goal @@ -217,28 +217,37 @@ trade records in `provenance.comparison_protocol`. `final_bar_market_order`. `ZL-V` refers to `volume_share_partial_fills`. `ZL-X` refers to `transaction_records_not_native_trades`. `ZL-M` refers to `session_calendar` and `missing_bar`. +`LN-T` refers to LEAN native `timing` and `final_bar_order`. `LN-M` refers to `default_models`, +`buying_power_allowed`, and `buying_power_rejected`. `LN-O` refers to `submission_sequence` and +`buying_power_sequence`. `LN-S` refers to `target_sizing`. `LN-C` refers to `explicit_costs`. +`LN-D` refers to `fill_forward`. `LN-F` refers to `default_full_fill`. `LN-X` refers to +`terminal_holding` and `liquidation`. These checks use LEAN engine 18001 at commit +`278fcb3d1b815b63ccadba68d7ae54422e34b792`, CLI 1.0.228, `DefaultBrokerageModel`, a margin +account, daily adjusted US equities, and 2x security leverage. + ### Execution Timing | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar (BT-T) | next_bar (ZL-P) | **same_bar** | -| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open (BT-T) | next_bar_open (ZL-P) | **same_bar** | -| `execution_price` | open | **close** | VBT-S | open (BT-T) | open (ZL-P) | **close** | +| `execution_mode` | next_bar | **same_bar** | VBT-S | next_bar (BT-T) | next_bar (ZL-P) | next_bar (LN-T) | +| `fill_timing` | next_bar_open | **same_bar** | VBT-S | next_bar_open (BT-T) | next_bar_open (ZL-P) | next session (LN-T) | +| `execution_price` | open | **close** | VBT-S | open (BT-T) | open (ZL-P) | open (LN-T) | -VectorBT and LEAN both use same-bar execution with close fills. VectorBT is vectorized, while LEAN -processes market orders immediately at bar close in its event-driven loop. Backtrader uses the -next bar's open. Zipline's native daily default uses the next session's close; the suite explicitly -replaces that model to fill at the next session's open. +LEAN emits a daily US-equity bar to `OnData` at the market close. A market order submitted from +that callback is therefore submitted while the market is closed, converted to market-on-open, and +filled at the next session's open. A final-bar order remains submitted and unfilled. VectorBT uses +same-bar close execution. Backtrader and the configured Zipline protocol use the next session's +open. ### Stop/Risk Configuration | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price (BT-R) | next_bar_open (adapter) | stop_price | -| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price (BT-R)** | fill_price (adapter) | fill_price | -| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close (BT-R) | bar_extreme (adapter) | close | -| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | signal_price (BT-R) | fill_price (adapter) | fill_price | -| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged (BT-R) | intrabar (adapter) | lagged | +| `stop_fill_mode` | stop_price | stop_price | VBT-R | stop_price (BT-R) | next_bar_open (adapter) | profile fallback; not claimed | +| `stop_level_basis` | fill_price | fill_price | VBT-R | **signal_price (BT-R)** | fill_price (adapter) | profile fallback; not claimed | +| `trail_hwm_source` | close | **bar_extreme** | VBT-R | close (BT-R) | bar_extreme (adapter) | profile fallback; not claimed | +| `initial_hwm_source` | fill_price | **bar_high** | VBT-R | signal_price (BT-R) | fill_price (adapter) | profile fallback; not claimed | +| `trail_stop_timing` | lagged | **intrabar** | VBT-R | lagged (BT-R) | intrabar (adapter) | profile fallback; not claimed | Backtrader calculates stop levels from **signal bar close** (the price when the strategy decided to trade), not the actual fill price. This matters when next-bar open differs significantly from @@ -251,36 +260,43 @@ previous close. | `allow_short_selling` | false | **true** | VBT-C | **true (BT-C)** | true (ZL-C) | true | | `allow_leverage` | false | false | VBT-C | false by default (BT-C) | cash validation disabled (ZL-C) | true | | `short_cash_policy` | credit | credit | VBT-C | credit (BT-C) | credit (ZL-C) | credit | -| `initial_margin` | 0.5 | -- | VBT-C | -- (BT-C) | -- | varies | -| `long_maint_margin` | 0.25 | -- | VBT-C | -- (BT-C) | -- | varies | -| `short_maint_margin` | 0.30 | -- | VBT-C | -- (BT-C) | -- | varies | +| `initial_margin` | 0.5 | -- | VBT-C | -- (BT-C) | -- | 0.5 (LN-M) | +| `long_maint_margin` | 0.25 | -- | VBT-C | -- (BT-C) | -- | 0.5 (LN-M) | +| `short_maint_margin` | 0.30 | -- | VBT-C | -- (BT-C) | -- | 0.5 (LN-M) | + +These LEAN margin values belong to `SecurityMarginModel` at 2x leverage. Other security and +brokerage models can select different requirements. ### Order Handling | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo (BT-O)** | fifo (ZL-O) | **exit_first** | +| `fill_ordering` | exit_first | exit_first | VBT-C, VBT-O | **fifo (BT-O)** | fifo (ZL-O) | sequential (LN-O) | | `entry_order_priority` | submission | submission | VBT-C | submission (BT-O) | submission (ZL-O) | submission | -| `immediate_fill` | false | **true** | VBT-S, VBT-O | false (BT-T) | false (ZL-P, ZL-O) | **true** | +| `immediate_fill` | false | **true** | VBT-S, VBT-O | false (BT-T) | false (ZL-P, ZL-O) | false (LN-T) | | `rebalance_mode` | incremental | **hybrid** | VBT-O | **snapshot (BT-O)** | snapshot (ZL-S) | snapshot | -| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | 1.0 (BT-S) | 1.0 (ZL-S) | 0.998 | +| `rebalance_headroom_pct` | 1.0 | 1.0 | VBT-O | 1.0 (BT-S) | 1.0 (ZL-S) | 0.9975 (LN-S) | | `reject_on_insufficient_cash` | true | **false** | VBT-C | true (BT-C, BT-O) | false (ZL-C) | true | -| `partial_fills_allowed` | false | **true** | VBT-C | false (BT-C) | false in protocol (ZL-P) | false | -| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last (BT-D)** | last price for sizing; stale bar defers fill (ZL-M) | use_last | +| `partial_fills_allowed` | false | **true** | VBT-C | false (BT-C) | false in protocol (ZL-P) | false in default fill model (LN-F) | +| `missing_price_policy` | skip | skip order; forward-fill valuation | VBT-O | **use_last (BT-D)** | last price for sizing; stale bar defers fill (ZL-M) | fill-forward data; defer to next real open (LN-D) | | `late_asset_policy` | allow after 1 bar | allow after 1 bar | VBT-O | allow after 1 bar (BT-D) | allow (ZL-M) | allow | ### Position Sizing & Costs | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| -| `share_type` | integer | fractional | VBT-O | integer (BT-S) | integer (ZL-S) | integer | -| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | adapter checks position | adapter checks position | check position | -| `commission_model` | none | none | VBT-F | none (BT-C) | none (ZL-P) | per_share | +| `share_type` | integer | fractional | VBT-O | integer (BT-S) | integer (ZL-S) | integer (LN-S) | +| repeated entry | check position | ignore unless accumulation is enabled | VBT-O | adapter checks position | adapter checks position | adapter submits target delta | +| `commission_model` | none | none | VBT-F | none (BT-C) | none (ZL-P) | `InteractiveBrokersFeeModel` (LN-M) | | `commission_rate` | 0% | 0% | VBT-F | 0% (BT-C) | -- | -- | -| `commission_per_share` | -- | -- | VBT-F | -- | -- (ZL-P) | varies | -| `commission_minimum` | $0 | -- | VBT-F | -- | -- (ZL-P) | varies | -| `slippage_model` | none | none | VBT-F | none (BT-C) | custom open, zero cost (ZL-P) | volume_based | -| `slippage_rate` | 0% | 0% | VBT-F | 0% (BT-C) | 0% (ZL-P) | varies | +| `commission_per_share` | -- | -- | VBT-F | -- | -- (ZL-P) | $0.005 for US equities (LN-M) | +| `commission_minimum` | $0 | -- | VBT-F | -- | -- (ZL-P) | $1 for US equities (LN-M) | +| `slippage_model` | none | none | VBT-F | none (BT-C) | custom open, zero cost (ZL-P) | `NullSlippageModel` (LN-M) | +| `slippage_rate` | 0% | 0% | VBT-F | 0% (BT-C) | 0% (ZL-P) | 0% (LN-M) | + +The fee and slippage entries name the models selected by `DefaultBrokerageModel` for a US equity. +They are not universal LEAN defaults. `LN-C` separately verifies explicit constant fee and +percentage slippage overrides. ### Comparison profiles @@ -289,7 +305,9 @@ the prior locked-short-proceeds, rejection, or FIFO overrides. `backtrader` now framework defaults for costs, leverage, target headroom, missing bars, and late feeds. `backtrader_strict` adds submission-time cash checks to reproduce Backtrader's enabled `checksubmit` path. `zipline_strict` resolves to the same settings as `zipline`; both represent the -explicit comparison protocol described above. The native Zipline defaults remain separate. +explicit comparison protocol described above. The native Zipline defaults remain separate. The +`lean` profile represents only the named daily US-equity protocol above. Its stop settings are not +part of the retained LEAN equivalence claim. --- diff --git a/validation/README.md b/validation/README.md index 7bbea361..f0372988 100644 --- a/validation/README.md +++ b/validation/README.md @@ -97,15 +97,24 @@ python validation/build_framework_env.py --all-public # Licensed VectorBT Pro requires authorized SSH access to the frozen source commit python validation/build_framework_env.py --framework vectorbt_pro -# Verify the locked LEAN data-preparation CLI and immutable engine image separately +# Verify the locked LEAN CLI and immutable engine image python validation/build_framework_env.py --framework lean + +# Reproduce the native behavior and Chapter 16 comparison evidence +.venv-lean/bin/python validation/native/lean_behavior.py \ + --lean-command .venv-lean/bin/lean \ + --output /tmp/lean-native.json +.venv-lean/bin/python validation/run_lean_case_studies.py \ + --lean-command .venv-lean/bin/lean \ + --output /tmp/lean-case-studies.json ``` The target versions, artifact hashes, source commits, interpreter paths, and expected matrix counts are defined in `framework_targets.toml`. Each lock is under `validation/environments/`. CI builds those locks and executes all 16 declared pairs for each public framework; an omitted pair fails. -The release workflow separately requires licensed VectorBT Pro execution and LEAN image -verification. Repository workflows never store licensed credentials. +The release workflow separately requires licensed VectorBT Pro execution and fresh LEAN native +and Chapter 16 execution against the frozen image. Repository workflows never store licensed +credentials. ## File Organization diff --git a/validation/benchmark_suite.py b/validation/benchmark_suite.py index ac85924b..44ef1bb1 100644 --- a/validation/benchmark_suite.py +++ b/validation/benchmark_suite.py @@ -105,6 +105,7 @@ from ml4t.backtest._validation.zipline_runner import ( # noqa: E402 run_zipline_target_shares as shared_run_zipline_target_shares, ) +from validation.common.framework_registry import load_framework_manifest # noqa: E402 _BENCHMARK_LOG_FILE = os.getenv("ML4T_BENCHMARK_LOG_FILE") DEFAULT_REAL_DATA_PATH = Path( @@ -2052,6 +2053,17 @@ def benchmark_lean( memory_mb=0, error=f"LEAN config not found: {lean_config}", ) + lean_target = load_framework_manifest().targets["lean"] + if lean_target.artifact is None: + return BenchmarkResult( + framework="LEAN CLI", + scenario=config.name, + runtime_sec=0, + num_trades=0, + final_value=0, + memory_mb=0, + error="Frozen LEAN target is missing an engine image", + ) try: lean_cmd = resolve_lean_command() @@ -2288,7 +2300,10 @@ def on_order_event(self, order_event: OrderEvent): env = make_lean_env() try: - check_lean_cli(lean_cmd, PROJECT_ROOT, env) + observed_cli = check_lean_cli(lean_cmd, PROJECT_ROOT, env) + expected_cli = f"lean {lean_target.cli_version}" + if observed_cli != expected_cli: + raise RuntimeError(f"LEAN CLI differs: {observed_cli} != {expected_cli}") except RuntimeError as exc: return BenchmarkResult( framework="LEAN CLI", @@ -2340,6 +2355,7 @@ def on_order_event(self, order_event: OrderEvent): project_dir=project_dir, lean_config=lean_config, output_dir=output_dir, + image=lean_target.artifact, timeout=1800, env=env, ) diff --git a/validation/lean/README.md b/validation/lean/README.md index a065f947..6138c5a7 100644 --- a/validation/lean/README.md +++ b/validation/lean/README.md @@ -1,178 +1,93 @@ # LEAN Validation Workflow -## Status +The retained LEAN comparison uses a frozen engine, CLI, data protocol, and account model: -LEAN is part of the validation/parity workflow, but not through the old static -`scenario_01_long_only/` project in this directory. +- LEAN engine 18001 at source commit `278fcb3d1b815b63ccadba68d7ae54422e34b792` +- image `quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70` +- LEAN CLI 1.0.228 from the locked environment +- daily adjusted US equities, `DefaultBrokerageModel`, margin account, and 2x security leverage -What actually runs today is the LEAN adapter in -[`validation/benchmark_suite.py`](../benchmark_suite.py), which: +This is a scoped comparison protocol. It is not a claim about every LEAN asset class, +resolution, brokerage model, or order type. -- supports the benchmark/parity workflow, not the old scenario matrix -- supports daily-data scenarios only -- generates a temporary LEAN project and LEAN-format data on the fly -- runs LEAN through the CLI in Docker +## Build the Locked Environment -The old `scenario_01_long_only/` folder is legacy scaffolding, not the current -source of truth. - -## What Made It Work - -These are the pieces that mattered in practice: - -1. We used the Dockerized LEAN CLI path, not a direct `.NET` launcher workflow. -2. We did not require a permanently installed `lean` binary. - The adapter falls back to: - - ```bash - uvx --python 3.12 --with "setuptools<81" lean - ``` - -3. We required a machine-local LEAN workspace config at: - - ```text - validation/lean/workspace/lean.json - ``` - -4. We let `benchmark_suite.py` generate the LEAN project, algorithm, target - file, and LEAN-format equity data for each run. -5. Docker had to be running before invoking the benchmark. - -## One-Time Bootstrap - -From the repository root: +Docker must be running. From the repository root: ```bash -mkdir -p validation/lean/workspace -cd validation/lean/workspace -uvx --python 3.12 --with "setuptools<81" lean init +uv run python validation/build_framework_env.py --framework lean ``` -If `lean` is already installed on `PATH`, this also works: +This creates `.venv-lean`, verifies the exact CLI distribution, and verifies the immutable engine +image. The runners do not install a CLI dynamically and do not accept a mutable image tag. + +## Native Behavior Evidence + +Run the native oracle before changing the `lean` profile: ```bash -lean init +.venv-lean/bin/python validation/native/lean_behavior.py \ + --lean-command .venv-lean/bin/lean \ + --output /tmp/lean-native.json ``` -The important outcome is that `validation/lean/workspace/lean.json` exists and -is valid on the local machine. That file is not committed in the repo. +The oracle checks the event and model behavior used by the profile, including next-session market +fills, final-bar orders, model selection, margin, target sizing, submission order, buying power, +explicit costs, fill-forward data, full fills, and terminal holdings. The retained result is +`validation/native/evidence/lean-18001.json`. -## Runtime Prerequisites +The `lean` profile's stop settings are ML4T fallbacks. Stop-order equivalence is not part of this +native evidence. -- Docker daemon available -- either `lean` on `PATH` or `uvx` on `PATH` -- Python 3.12 available for the `uvx` fallback path -- initialized LEAN workspace config at - `validation/lean/workspace/lean.json` +## Chapter 16 Case Studies -The adapter itself also sets: +The current large comparison reruns three retained Chapter 16 projects against the frozen image: -```text -UV_CACHE_DIR=/tmp/uv-cache -UV_TOOL_DIR=/tmp/uv-tools +```bash +.venv-lean/bin/python validation/run_lean_case_studies.py \ + --lean-command .venv-lean/bin/lean \ + --output /tmp/lean-case-studies.json ``` -to keep the transient LEAN CLI tool environment out of the repo. +Add `--promote` only when intentionally replacing the tracked LEAN outputs and retained evidence. +Promotion is atomic and occurs only after all projects pass. -## Exact Command We Run +The three projects compare 47,652 canonical fills. They currently have zero fill-surface gap and +zero terminal-value gap at a `$0.0001` quantum. The machine-readable result is +`validation/lean/case_study_evidence.json`. -Use the benchmark suite, not the legacy `run_all_correctness.py` LEAN path. +These projects specify their own percentage fee and zero-slippage settings. They do not test the +fee and slippage models selected by `DefaultBrokerageModel`; the native oracle tests that model +selection separately. -Typical invocation: +## Benchmark Adapter -```bash -python validation/benchmark_suite.py \ - --framework lean \ - --scenario daily_baseline \ - --data-source real \ - --real-data-path /path/to/us_equities.parquet -``` - -To compare the ml4t side using the LEAN-style profile: +The daily-data adapter remains available through the benchmark suite: ```bash -python validation/benchmark_suite.py \ - --framework ml4t-lean-strict \ +uv run python validation/benchmark_suite.py \ + --framework lean \ --scenario daily_baseline \ --data-source real \ --real-data-path /path/to/us_equities.parquet ``` -Notes: - -- `--framework lean` invokes the LEAN adapter. -- `--framework ml4t-lean-strict` runs `ml4t-backtest` with the LEAN-strict - parity profile. -- LEAN currently returns an error for non-daily scenarios. - -## What The Adapter Generates - -For each run, `benchmark_suite.py` writes a generated LEAN project under: - -```text -validation/lean/workspace/ml4t_benchmark/ -``` - -Key generated files: - -- `main.py`: generated QCAlgorithm using canonical target shares -- `config.json`: minimal LEAN project config -- `symbols.csv`: generated synthetic tickers for the selected assets -- `targets.csv`: daily target share instructions - -It also exports LEAN-format daily equity data under: - -```text -validation/lean/workspace/data/equity/usa/ -``` - -including: - -- `daily/*.zip` -- `map_files/*.csv` -- `factor_files/*.csv` - -To avoid re-exporting identical daily data every run, it maintains: - -```text -validation/lean/workspace/data/equity/usa/ml4t_manifest.json -``` - -and uses a signature-based cache check. - -## The Exact LEAN Invocation - -Once the generated project and data are in place, the adapter runs: - -```bash -lean backtest validation/lean/workspace/ml4t_benchmark \ - --lean-config validation/lean/workspace/lean.json \ - --no-update \ - --output -``` - -If `lean` is not installed, the code uses the `uvx` form instead. - -Results are read back from the generated LEAN summary JSON in the output -directory. - -## Source Of Truth In Code +To run the ML4T side with the corresponding profile, use `--framework ml4t-lean-strict`. -The working implementation lives here: +The adapter requires an exact CLI version and passes the frozen image digest to every LEAN run. +It supports daily scenarios only. -- [`validation/benchmark_suite.py`](../benchmark_suite.py): LEAN adapter, - project generation, data export, CLI invocation, result parsing +## Reproducibility Boundary -These files are legacy and should not be treated as the primary workflow: +The native and Chapter 16 runners construct temporary LEAN roots from tracked inputs: -- [`validation/lean/scenario_01_long_only/main.py`](scenario_01_long_only/main.py) -- [`validation/run_all_correctness.py`](../run_all_correctness.py) +- `validation/lean/support/lean.json` +- `validation/lean/support/data/market-hours/market-hours-database.json` +- `validation/lean/support/data/symbol-properties/symbol-properties-database.csv` +- the tracked project files and daily equity archives under `validation/lean/workspace/` -## Practical Caveats +Map and factor files are generated from the first date in each tracked daily archive. No ignored +machine-local `lean.json`, map file, factor file, or data directory is required. -- LEAN is currently benchmark/parity coverage, not full scenario-matrix coverage. -- The adapter currently supports daily data only. -- The local `lean.json` is a manual prerequisite and is intentionally not - committed. -- Docker startup and LEAN container initialization make LEAN slower and more - operationally fragile than the Python-native backtest validation paths. +The old `scenario_01_long_only/` project and `validation/run_all_correctness.py` LEAN path are +legacy scaffolding. They are not evidence for the current claim. diff --git a/validation/lean/case_study_evidence.json b/validation/lean/case_study_evidence.json new file mode 100644 index 00000000..3e540feb --- /dev/null +++ b/validation/lean/case_study_evidence.json @@ -0,0 +1,247 @@ +{ + "cases": [ + { + "case": "chapter16_etfs", + "comparison": { + "canonical_final_value_gap_usd": 0.0, + "canonical_final_value_match": true, + "fill_gap": 0, + "final_value_gap_pct": 2.6645352591003757e-15, + "final_value_gap_usd": 3.026798367500305e-09, + "final_value_quantum_usd": 0.0001, + "lean_fills": 10701, + "lean_final_value": 1119459.5398322002, + "ml4t_fills": 10701, + "ml4t_final_value": 1119459.5398322032, + "raw_row_order_match": true, + "sorted_fill_multiset_match": true + }, + "inputs": { + "asset_symbols.csv": "68abb75433e647269313fa6d33e55a3a74abac11c70494f00c2910d3c8958ee4", + "config.json": "b382e874bcd5525f9344894b27ecb7c1c8db958692f4e195dab0f05a3ecabb6b", + "data/ceortq.zip": "28a81c7020b95b04c8f84a4802be5641c03d78d490d196bd86aa8851cf09fccc", + "data/ckrwrx.zip": "a51b845f86b5cab73db807d2123f2507c46b4ac98e41b6f0b810c8375d924e6c", + "data/cppque.zip": "8c26c54869b7fd0e5ffe963cc740b7949cbd909f6940d7d9552cd09b2f2fa1d3", + "data/dbfife.zip": "5aca82159784dfbc03b4ffbe4657f0361ef6f191e2dbe02c0c990b28cdd360bf", + "data/drqobq.zip": "29e28d6fe521df8caa9affbe0d539e4a15f421be76ca1ffe66ebc09fe4d82e6a", + "data/fwgfct.zip": "2c5478f846453bd79f6d6a1518bb5771c17f44b0339f40d6944ad943472da8eb", + "data/ggahvm.zip": "2de63b9419ae5819188b2bc801083b78c32f04342d18499fd71a7ef86d5da39b", + "data/gqkzsg.zip": "df8186db54fb766262d292f871a3b511cfc1f07a919cba845f86bea904051c67", + "data/hkomxv.zip": "b6afa9a86aff2b94e49e76720d89831b0c1f10dcea0719bff90675e33eccf4b9", + "data/kvablp.zip": "8122048b41d40e6b9fce03883785ec966025ae776f220da190b9f59d6deb3bc8", + "data/mfrjsj.zip": "47a246c7c7032731c11a1e7c795e1788f88f28214bc97b342160e02adc6967b0", + "data/ncpvze.zip": "1ccad2076299bfd52a7648bfa05ddcfd17da411f98ef5111715b0b7e3303bef1", + "data/qmdsey.zip": "77cd2de22a82d5f666f72a2dc6e01d4a0eb607824cec00649cb679e727e1be6d", + "data/rgllcn.zip": "9a381b9aa4119987a1f4bb2a01de2f26334ee20e00b4f5b096cefe0337c0c481", + "data/rprqtm.zip": "74bf330a8bd29543d3dae701e7397a1e07179552482b3398a3094ef109ae39e7", + "data/smkmqa.zip": "57a87eea6eeee320d6952ad3311866d7114b6f1c04135ba018d21dae877be9e7", + "data/twedry.zip": "25dc45d45082f64ed13690b491ea5ac9f9e811899ca6474f71cc64ca55d83614", + "data/vnolvc.zip": "a30aa50a439e4d232bbbf83e174c1febc5951546a4873a4da9d20b13b7dc73a2", + "data/vnvkjb.zip": "fd196fdb0974e608bedd2ab913d8b798a11cb2113c435ab2e10cda18bddab554", + "data/yegorj.zip": "5297e3b94c5b12a21e78e03dc2fcda36d27a2efb0f8dcc3bf917594ed9483b93", + "data/zamnkq.zip": "69c3056ec9999d31ebaf0abdde8c63a7a49b397b9d32f9488c813fae6d9ca34d", + "data/zldnew.zip": "27336195a6a309f339d55af3fbba74cdc2967cf8d945779435b5477742e1bd9b", + "main.py": "c7bd891e409c8b252298c16ff2f3a1808d817442c3364d12e7770471852516a9", + "ml4t_symbol_map.json": "eb1579dbadd1a9cf8dc4c72c39356fb4f54f93ba6a4438ae0a321cb3794ccdfa", + "rebalance_dates.csv": "15e71e52f0ad4ab4d65dd16cfa606ce2221172662b8febaf3c905a2b8960b035", + "weights.csv": "f0b27b70335e5d412f7b98dae2772a778517d72783b74668930161b5e32ce1b1" + }, + "lean_fill_surface_sha256": "91e3c3aebb628f310a143efc4eb60c99f00dd04d48b4047aad7d69d4955c8784", + "ml4t_fill_surface_sha256": "91e3c3aebb628f310a143efc4eb60c99f00dd04d48b4047aad7d69d4955c8784", + "passed": true, + "raw_daily_equity_sha256": "20bc4a28ad04fdc458bd8f5031fbf976623caddd819da70f2e51ddb45dea6609", + "raw_order_events_sha256": "831edf7f9e00ca6816c8f5dc2e8077006616de6be352e4f99d37ca6b3a8e01f6", + "retained_artifacts": { + "validation/lean/workspace/chapter16_etfs/ml4t_daily_equity.csv": "20bc4a28ad04fdc458bd8f5031fbf976623caddd819da70f2e51ddb45dea6609", + "validation/lean/workspace/chapter16_etfs/ml4t_order_events.csv.xz": "63535bec501d36e4f1eae501917e0000e636c03a19d637b05cdda1428bc80421" + }, + "runtime_seconds": 12.904603295959532, + "summary_sha256": "12152c20f2efe5d81c33f096b191ffb65a1d5adb9049ae4a6add5556324ef45b" + }, + { + "case": "chapter16_sp500_equity_option_analytics", + "comparison": { + "canonical_final_value_gap_usd": 0.0, + "canonical_final_value_match": true, + "fill_gap": 0, + "final_value_gap_pct": -1.2212453270876722e-15, + "final_value_gap_usd": -1.1641532182693481e-09, + "final_value_quantum_usd": 0.0001, + "lean_fills": 1848, + "lean_final_value": 991275.917466, + "ml4t_fills": 1848, + "ml4t_final_value": 991275.9174659988, + "raw_row_order_match": true, + "sorted_fill_multiset_match": true + }, + "inputs": { + "asset_symbols.csv": "0b20eef4524f62569d2453d4769fa3ce475814e3616363e8d8b17e2a70ff9776", + "config.json": "5c63ae1d9a84d532c989611cdf062c54cb4e2c75ed83c8d84a8b17f3ba384672", + "data/baqkfr.zip": "d1c19ce72744fb14e8aa38ec01952467a714d82ca33130190de2c4f0d92d2af7", + "data/bgdrai.zip": "349b87e67ceafa0fe450101504a156afe5485de057aea7c594aae4069f5951e1", + "data/bpfuqm.zip": "959a863ece15e6bfc4725daca1a0940959af415c2e64106ff2e672b7be5383fd", + "data/bpspgv.zip": "5cc03bf8fbddf7bdc5b71093150e6c4f9dc4d4a347c3d50d2c9c5339b7f04410", + "data/cemoje.zip": "5e0c299d9cb96851eb7a424da8d5cb9abb91fe4c9922bb94b844221955227065", + "data/comnhq.zip": "bdd2c4fb63c4ecf571915fd3ab41508460cd0dc821a6c849c456ae6e91c25ab8", + "data/ffndvm.zip": "7ba7c34010fd01b4c44bfdd13debd08da1137610e637423d71f4e30b0af5cf82", + "data/gtkilw.zip": "fe1ba34617ebd0ef3949d7f394878f044125247ff55aae1e4004010db6c16154", + "data/hcducb.zip": "da885133cb2d89f5b8690b0bb0f8130dec8f36c32c6ed655c86c45e22e082571", + "data/heclon.zip": "ae415f62032014807625e1d1fbe25779d97b3db3a248ac1dbeee6ac76302ecdf", + "data/isijlh.zip": "f93f51c43699fcd429382db7d149aaba952cc149c304af4a0dd9f20774438ed7", + "data/lmribf.zip": "9559bad65dec0c97b1c35200c408596751c2354e41292fa39c7a82dc64956327", + "data/luzlyg.zip": "8818dd5afc8c48075da87068c48f0acde6838322ae256098234917e77b06fdda", + "data/mcczid.zip": "e4a6dcdb209338c08561c9a05b95b00447697fd4aa368d5d52a0c995d4492a52", + "data/mvvhyr.zip": "42b8265ce80824ae646be146181e4f1716833b2edda6f6b0569e663e7fd6f62c", + "data/ochcau.zip": "935b7f55557dc9833e63046e31d78ee071f4b4a0dcc5779386b5789add440193", + "data/rlsrxx.zip": "7d9548b8802794c904e1f2c1d2d37cc231443e6e9ac159f7f937a36b729b5ac7", + "data/ruknmv.zip": "7fa45c4cd7c93c0f225036fa2771939c4130193606bc7283d6c5b98f75e88480", + "data/smdife.zip": "f90d0c3a8319632a877f0bc1a5accd83dd70fe56627668fb4283c445746b999a", + "data/xuehvz.zip": "0486caca85f091edecb4474542226b959d804b559c1ac92d1d5ec9b40b6901b7", + "data/yivygh.zip": "050dcc503c396d23b6fa0673c2c691aa884843da899a828ec6c0a2d096020840", + "data/zijvro.zip": "6b9abe8ea0deb0f110b0eb3a2d7007d4ed246ccbf128e83046f949ede482cc20", + "data/zixtlg.zip": "03e2ff8a56edba5716bf5dd4df73fb5d00671d262cfc7d4ee87cf336c11b9467", + "main.py": "82112c9e0799e16a93fa4a89586583d8849e296375e91c98d98439f4c58a21d0", + "ml4t_symbol_map.json": "295d83b752cf9cdad8efdb3787457d2c1514666fa54c25d68c584baaba70fbf1", + "rebalance_dates.csv": "e69f6c549a7b150dcdbc39ee17e903bacd74f556cb368c3bb5c9179e6de4c6da", + "weights.csv": "196320aa550d779511953e06fb35baed4f81058c8b7a22e06c363db92848d3b7" + }, + "lean_fill_surface_sha256": "62d52560896287b687edf68a50955d8c01d840706114a2f3731b87c6c632a179", + "ml4t_fill_surface_sha256": "62d52560896287b687edf68a50955d8c01d840706114a2f3731b87c6c632a179", + "passed": true, + "raw_daily_equity_sha256": "83a98f50053b12dd4baa37484b0b268cb8ec83ebdf633ee2e6ee790db0bb73ad", + "raw_order_events_sha256": "334cd463affb3d23f074882fe1d8131861ec67ca5203fbdfb86cae4d8da64917", + "retained_artifacts": { + "validation/lean/workspace/chapter16_sp500_equity_option_analytics/ml4t_daily_equity.csv": "83a98f50053b12dd4baa37484b0b268cb8ec83ebdf633ee2e6ee790db0bb73ad", + "validation/lean/workspace/chapter16_sp500_equity_option_analytics/ml4t_order_events.csv": "334cd463affb3d23f074882fe1d8131861ec67ca5203fbdfb86cae4d8da64917" + }, + "runtime_seconds": 8.380864966893569, + "summary_sha256": "4d70220734079022632eb155f18ac74456da89be2fb1c75b40a1263475006b00" + }, + { + "case": "chapter16_us_equities_panel", + "comparison": { + "canonical_final_value_gap_usd": 0.0, + "canonical_final_value_match": true, + "fill_gap": 0, + "final_value_gap_pct": -8.43769498715119e-14, + "final_value_gap_usd": -1.0360963642597198e-07, + "final_value_quantum_usd": 0.0001, + "lean_fills": 35103, + "lean_final_value": 1228617.37595028, + "ml4t_fills": 35103, + "ml4t_final_value": 1228617.3759501765, + "raw_row_order_match": true, + "sorted_fill_multiset_match": true + }, + "inputs": { + "asset_symbols.csv": "c5051af42cea5c1172862df293024dfda0da65d01de079e840cef0ad9c4f06b4", + "config.json": "79a5de1c10975416e133ddf3ebc2cc5c2f762aa145e22b2271afd05df7e18720", + "data/ajwqri.zip": "a287bb14bf6ca783e0fbe092eb2360ea112b11ef18f6f581ffeb35f2a06e1f08", + "data/avyokw.zip": "1c9c0e922d538e59e4acebd81b5ac0c8c52590af06f0184922d8f6b19b288b9c", + "data/bvzyrj.zip": "847ee9566458164638c25c8eaf5c16379746f6f9420127668c27a6c19595d0d9", + "data/bzrjyr.zip": "b7c63ca2b9a251dbd0265a4fc1da9d6eade5803cedeee6641989065fd9d89411", + "data/cdfrzv.zip": "9dc9d3917e5e0979088fb12170f39caccf8848fba710661b111819af4b391dc0", + "data/ewvgue.zip": "5941f84cb63109637735eab752f43472e28d854c555c74a358d382ea46bba673", + "data/fdyrvm.zip": "ece3d1d9e3047f42e7ef4fd1edf16debccad98536631f568510ef2e7b34b6623", + "data/fgbaha.zip": "20bbdeb119bb46704d8fef4d4e40019eb2c4269a5bbc5a3ae2b42c71618df918", + "data/fvetze.zip": "12720b16ff31ee2ebdcf9e9a2ba9df63bec7b7b4db121c5e7a3086cb1eb74ab4", + "data/fxfqop.zip": "99c4f3694ac27a75cf62e8b188acdef2ce00afed37a0fe12d0704a1a443bb404", + "data/gjytie.zip": "a14ee055a7ee75a7931432b0111ec7721be0fdb4c5ecce1119992bf296b5f369", + "data/gwfxni.zip": "2065ee54212c8cb540ea52266432c9682e79d05380235e1b45fb6fbe0f6e4e15", + "data/hdsvdl.zip": "7ce202abb605219433d2dfd3af63f11f68667a79d3dd9abdfdae6592a53f6388", + "data/hjduow.zip": "216c916a6197d44568c9a8fd0b09b5aa71055b5fc7ddd4b068faef8f515f50eb", + "data/hosdps.zip": "8e6ca04e89f815f8ff1599b6a91ef3020c6d1a3a393ced5bbe30b3f7e0bec292", + "data/ijnvkp.zip": "da5db7a6db83f05c54fab3bcf3a0d02fe441b271693d02a8efd3cd0b5c6de95b", + "data/iwtavf.zip": "e039b52804c512c581ee4513b40e1f255975a7d55ab4cd2edc05a2b5f1b2b1f3", + "data/iyzxjs.zip": "351dc107b1c7c49dd95c3624bc6808ed86e513e63c5e7e83033b1e34d954965c", + "data/jvhgai.zip": "4c9363037237b09818a1737fc059b6855637dff594ff2b00ee04c2a53a2cca48", + "data/kfccwm.zip": "52cfbc970da501123a81048c29cc546e3f90b40cba6f94e9ce7d68cef77e7198", + "data/knjdbi.zip": "8a1aa3b0f1588712378996319bb9e11bd1c312639cd4d4686406bcad0c93c941", + "data/ktaoxh.zip": "bc6bc9238854771a936039c76fc3890c2980f608a6618118267aaf1d94813912", + "data/kxtlhn.zip": "c6f6619e2e61a8a1ecdc9e9835afe3339d14ec9953f2b999dbccbb9ffa72af89", + "data/lqynwp.zip": "0e0b0c2c6de136b3f240e958b56e156bc8347b07b40a43703e23fc579e3c7b33", + "data/nvhirh.zip": "cb9252d188880233e5afddaa991e6c3894fbbf0edcf5bfb0faa3a59d9b17a006", + "data/oyajiu.zip": "ad5b48623e2fd684ec021d753e4d923022c00ab5c5247dfc07dbdc7b1a4284a1", + "data/pdcsck.zip": "5d60e80fd48e68d2207cd062dd1802552819ef778a28d1307bee311f53054ea9", + "data/pwjoac.zip": "f44f73fbe4ee34ab6a549380d2430e2543d7bb03035c000d3c699e2780748cef", + "data/qdtiok.zip": "bb7231707ca795d0499322e1bd139a98b516b247865661135943c90ebd333033", + "data/qdvwro.zip": "da36a97da5f7c3f58cd7d05cfda7aa5e6265e220768d84ffe6204f35b94cc6b7", + "data/rfchex.zip": "81c82c63f413c6a4d49371614ecfacf2d570df24273ad7004021bc070eba90ab", + "data/rfhmcl.zip": "56893d208bef071b555d30739723ea216eecdf9d9c6d00298ffb01eb9ab3b324", + "data/sfdtij.zip": "d52fa5d5e4c5a9712ef71ecaa578c5d2d1233a019530d3da39d78d43db06fb8d", + "data/sndkzi.zip": "21f8c20d50339dca284f34fc11e641b5c80d2f2965edcb9659ab240349fce562", + "data/swngho.zip": "9c251dfb697203ed58ee8ad212e61f22426edc04bb7c26bee03ddb0ad5147a9b", + "data/tqkcdn.zip": "51e2f99b38d48871cc85ac68e0ec0a02ebff987068b2155da5c876ed9a5d0e99", + "data/ttwclm.zip": "2a9cc672895eda57fb0dd78adc57ffaa612228b24594f5501cd151d0d06adbc2", + "data/tyqzlf.zip": "072e42dc4b9852bb50946c081aa3013d6cba13d4abfed2328d797a69d55aab35", + "data/vimvup.zip": "70a880cf04f9b8b5dbaf4714742221fa6a972eca6eb79e0c562c8da06636ec47", + "data/vvhgby.zip": "b7d424cde9979aaab6809f7f1496469fc474104b94d6c63e4f72e018f869c0fd", + "data/waobbl.zip": "fffaf6f4737c33ecd60b2ecc16766c9c61c0de2b4bf16049f4c644ae33c141c9", + "data/wlkvcm.zip": "830f53b7220a63ae6e1a394eae101d8023042a781da0697e4006d0897bf534ce", + "data/wrvjrt.zip": "bfc0f6b9a7178568fc311f5c4581110ccb8444149722915309d03b626d8d0628", + "data/wuyjsb.zip": "13d850073294d8771c61d18a1b6d29dfe2a602eeb16b13d64030d5b1cc2ce157", + "data/xcypxp.zip": "fa767598261065ffa2b92067d181087846cad87c42c862b6d33f387afb2273a1", + "data/xkptdk.zip": "848296f0620e22d389645e881a37691e745c6b6a46788c9b65509be7a2592273", + "data/xtbwlz.zip": "0759f7d2732e2c8d7cc87a6e788630a58872b5abfaf4252a0b2692e78f0d6be6", + "data/ykodii.zip": "29b6b9c478d0c0f37c2d2c97f09323c42a4bd167bbe4f1a3f54ec2e9c83421a9", + "data/ysuvmc.zip": "d94c13a8dac72c836bb982f283c33fe50ffe3837458b5cceb67073e6b78278f4", + "data/zpelyh.zip": "b021e82245543fdee5685d7cc113649e38632a5941734eefbefc90fbb9d0eb6f", + "main.py": "7575b8022386e9e8afba003dc904e930cd15073f4afaa8182398289f01e9f606", + "ml4t_symbol_map.json": "a3978887ed599be48a338c1a10abfad1963e9a81d83d6df8ca8a09e5264accd5", + "rebalance_dates.csv": "78703d3259509b48f14963347c89d5d60f188541fbe65484239abaac684145e1", + "weights.csv": "ce371041742da6bbaf9ec3f8eb25e7e701b84b0ef78752d051a7da797453b561", + "weights.csv.gz": "9d227ef2f19f43a3548eebb3ec72abf47d6ce434b28b1aba9fe5a332195b25d1", + "weights.csv.xz": "9f0f81378af72d4c00b4eac63bdc9a6a7b35ec1ebc8f60190355ce5d1177428c" + }, + "lean_fill_surface_sha256": "8b0f47c093382c1f45fb49c11234cbf972b2ee680aa9ebca70e5c73bad67ad73", + "ml4t_fill_surface_sha256": "8b0f47c093382c1f45fb49c11234cbf972b2ee680aa9ebca70e5c73bad67ad73", + "passed": true, + "raw_daily_equity_sha256": "ee22ecbf90cd8c358f6d63c9e25523e3869300140e059f202d555c1d0288370c", + "raw_order_events_sha256": "9e13e96b0899ca113375b3529f102f1b2a825aea301277f01225a5a31a5f3cac", + "retained_artifacts": { + "validation/lean/workspace/chapter16_us_equities_panel/ml4t_daily_equity.csv": "ee22ecbf90cd8c358f6d63c9e25523e3869300140e059f202d555c1d0288370c", + "validation/lean/workspace/chapter16_us_equities_panel/ml4t_order_events.csv.part01.xz": "9aea6ff30791dc06cd9b917e6f0c639d1b6f17883012b9c5190d7be6a899d980", + "validation/lean/workspace/chapter16_us_equities_panel/ml4t_order_events.csv.part02.xz": "915bef2036b7d49535eb81a458a1af891f8f15c249bb413831771ea52e982a26" + }, + "runtime_seconds": 21.599902898073196, + "summary_sha256": "f928254197da712f32d74f3c9c4325ebe50da2da7cb21e8f38dad7adbb9a13cd" + } + ], + "cli_observed": "lean 1.0.228", + "comparison_protocol": { + "account": "DefaultBrokerageModel Margin; per-project leverage 2", + "costs": "Ml4tPercentFeeModel at project rate; ConstantSlippageModel(0)", + "fills": "timestamp, asset, side, quantity, price rounded to 4 decimals", + "terminal_value_quantum": "0.0001 USD" + }, + "framework": { + "access": "public", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "passed": true, + "producer_files": { + "src/ml4t/backtest/_validation/case_study_lean.py": "62247f66db5ae118e7089ab4dfeca5a7251b1f3f4238b9aceeb55384df447cfd", + "src/ml4t/backtest/_validation/lean_runner.py": "30efdb8018cc949c991dee856a7007d0dfdc635397a208f98a6dd094af20fce1", + "src/ml4t/backtest/profiles.py": "ee37ca6157367ceda4e4f3619c217d753c5d8a577a906ef7f63e515e3c78fa5c", + "validation/run_lean_case_studies.py": "5bf91f8d98f8bfd9a88eb72071c392ff23ad4583184b28165e7511d9e0d1901e" + }, + "promoted": true, + "schema_version": 1, + "support_files": { + "data/market-hours/market-hours-database.json": "935079bc33409373f37163eddb539f09e81a1efbd0e617cbc8fdb487c76dab2b", + "data/symbol-properties/symbol-properties-database.csv": "56b6dc80202bca88f212c78c4d4670c2e070e6f1e7386f7436232aafe5000e93", + "lean.json": "fa15d6d81f560fd1665b004c338b026458fa834a7645e015d16d861dd73540f4" + } +} diff --git a/validation/lean/support/data/market-hours/market-hours-database.json b/validation/lean/support/data/market-hours/market-hours-database.json new file mode 100644 index 00000000..0d3ab37e --- /dev/null +++ b/validation/lean/support/data/market-hours/market-hours-database.json @@ -0,0 +1,457 @@ +{ + "entries": { + "Equity-usa-[*]": { + "dataTimeZone": "America/New_York", + "exchangeTimeZone": "America/New_York", + "sunday": [], + "monday": [ + { + "start": "04:00:00", + "end": "09:30:00", + "state": "premarket" + }, + { + "start": "09:30:00", + "end": "16:00:00", + "state": "market" + }, + { + "start": "16:00:00", + "end": "20:00:00", + "state": "postmarket" + } + ], + "tuesday": [ + { + "start": "04:00:00", + "end": "09:30:00", + "state": "premarket" + }, + { + "start": "09:30:00", + "end": "16:00:00", + "state": "market" + }, + { + "start": "16:00:00", + "end": "20:00:00", + "state": "postmarket" + } + ], + "wednesday": [ + { + "start": "04:00:00", + "end": "09:30:00", + "state": "premarket" + }, + { + "start": "09:30:00", + "end": "16:00:00", + "state": "market" + }, + { + "start": "16:00:00", + "end": "20:00:00", + "state": "postmarket" + } + ], + "thursday": [ + { + "start": "04:00:00", + "end": "09:30:00", + "state": "premarket" + }, + { + "start": "09:30:00", + "end": "16:00:00", + "state": "market" + }, + { + "start": "16:00:00", + "end": "20:00:00", + "state": "postmarket" + } + ], + "friday": [ + { + "start": "04:00:00", + "end": "09:30:00", + "state": "premarket" + }, + { + "start": "09:30:00", + "end": "16:00:00", + "state": "market" + }, + { + "start": "16:00:00", + "end": "20:00:00", + "state": "postmarket" + } + ], + "saturday": [], + "holidays": [ + "1/1/1998", + "1/1/1999", + "1/1/2001", + "1/1/2002", + "1/1/2003", + "1/1/2004", + "1/2/2006", + "1/1/2007", + "1/1/2008", + "1/1/2009", + "1/1/2010", + "1/1/2011", + "1/2/2012", + "1/1/2013", + "1/1/2014", + "1/1/2015", + "1/1/2016", + "1/2/2017", + "1/1/2018", + "1/1/2019", + "1/1/2020", + "1/1/2021", + "1/1/2022", + "1/1/2024", + "1/2/2023", + "1/1/2025", + "1/1/2026", + "1/1/2027", + "1/2/2007", + "1/9/2025", + "1/19/1998", + "1/18/1999", + "1/17/2000", + "1/15/2001", + "1/21/2002", + "1/20/2003", + "1/19/2004", + "1/17/2005", + "1/16/2006", + "1/15/2007", + "1/21/2008", + "1/19/2009", + "1/18/2010", + "1/17/2011", + "1/16/2012", + "1/21/2013", + "1/20/2014", + "1/19/2015", + "1/18/2016", + "1/16/2017", + "1/15/2018", + "1/21/2019", + "1/20/2020", + "1/18/2021", + "1/17/2022", + "1/16/2023", + "1/15/2024", + "1/20/2025", + "1/19/2026", + "1/18/2027", + "1/17/2028", + "2/16/1998", + "2/15/1999", + "2/21/2000", + "2/19/2001", + "2/18/2002", + "2/17/2003", + "2/16/2004", + "2/21/2005", + "2/20/2006", + "2/19/2007", + "2/18/2008", + "2/16/2009", + "2/15/2010", + "2/21/2011", + "2/20/2012", + "2/18/2013", + "2/17/2014", + "2/16/2015", + "2/15/2016", + "2/20/2017", + "2/19/2018", + "2/18/2019", + "2/17/2020", + "2/15/2021", + "2/21/2022", + "2/20/2023", + "2/19/2024", + "2/17/2025", + "2/16/2026", + "2/15/2027", + "2/21/2028", + "4/10/1998", + "4/2/1999", + "4/21/2000", + "4/13/2001", + "3/29/2002", + "4/18/2003", + "4/9/2004", + "3/25/2005", + "4/14/2006", + "4/6/2007", + "3/21/2008", + "4/10/2009", + "4/2/2010", + "4/22/2011", + "4/6/2012", + "3/29/2013", + "4/18/2014", + "4/3/2015", + "3/25/2016", + "4/14/2017", + "3/30/2018", + "4/19/2019", + "4/10/2020", + "4/2/2021", + "4/15/2022", + "4/7/2023", + "3/29/2024", + "4/18/2025", + "4/3/2026", + "3/26/2027", + "4/14/2028", + "5/25/1998", + "5/31/1999", + "5/29/2000", + "5/28/2001", + "5/27/2002", + "5/26/2003", + "5/31/2004", + "5/30/2005", + "5/29/2006", + "5/28/2007", + "5/26/2008", + "5/25/2009", + "5/31/2010", + "5/30/2011", + "5/28/2012", + "5/27/2013", + "5/26/2014", + "5/25/2015", + "5/30/2016", + "5/29/2017", + "5/28/2018", + "5/27/2019", + "5/25/2020", + "5/31/2021", + "5/30/2022", + "5/29/2023", + "5/27/2024", + "5/26/2025", + "5/25/2026", + "5/31/2027", + "5/29/2028", + "6/11/2004", + "6/20/2022", + "6/19/2023", + "6/19/2024", + "6/19/2025", + "6/19/2026", + "6/18/2027", + "6/19/2028", + "7/3/1998", + "7/5/1999", + "7/4/2000", + "7/4/2001", + "7/4/2002", + "7/4/2003", + "7/5/2004", + "7/4/2005", + "7/4/2006", + "7/4/2007", + "7/4/2008", + "7/3/2009", + "7/5/2010", + "7/4/2011", + "7/4/2012", + "7/4/2013", + "7/4/2014", + "7/3/2015", + "7/4/2016", + "7/4/2017", + "7/4/2018", + "7/4/2019", + "7/3/2020", + "7/5/2021", + "7/4/2022", + "7/4/2023", + "7/4/2024", + "7/4/2025", + "7/3/2026", + "7/5/2027", + "7/4/2028", + "9/7/1998", + "9/6/1999", + "9/4/2000", + "9/3/2001", + "9/2/2002", + "9/1/2003", + "9/6/2004", + "9/5/2005", + "9/4/2006", + "9/3/2007", + "9/1/2008", + "9/7/2009", + "9/6/2010", + "9/5/2011", + "9/3/2012", + "9/2/2013", + "9/1/2014", + "9/7/2015", + "9/5/2016", + "9/4/2017", + "9/3/2018", + "9/2/2019", + "9/7/2020", + "9/6/2021", + "9/5/2022", + "9/4/2023", + "9/2/2024", + "9/1/2025", + "9/7/2026", + "9/6/2027", + "9/4/2028", + "9/11/2001", + "9/12/2001", + "9/13/2001", + "9/14/2001", + "10/29/2012", + "10/30/2012", + "11/26/1998", + "11/25/1999", + "11/23/2000", + "11/22/2001", + "11/28/2002", + "11/27/2003", + "11/25/2004", + "11/24/2005", + "11/23/2006", + "11/22/2007", + "11/27/2008", + "11/26/2009", + "11/25/2010", + "11/24/2011", + "11/22/2012", + "11/28/2013", + "11/27/2014", + "11/26/2015", + "11/24/2016", + "11/23/2017", + "11/22/2018", + "11/28/2019", + "11/26/2020", + "11/25/2021", + "11/24/2022", + "11/23/2023", + "11/28/2024", + "11/27/2025", + "11/26/2026", + "11/25/2027", + "11/23/2028", + "12/05/2018", + "12/25/1998", + "12/24/1999", + "12/25/2000", + "12/25/2001", + "12/25/2002", + "12/25/2003", + "12/24/2004", + "12/26/2005", + "12/25/2006", + "12/25/2007", + "12/25/2008", + "12/25/2009", + "12/24/2010", + "12/26/2011", + "12/25/2012", + "12/25/2013", + "12/25/2014", + "12/25/2015", + "12/26/2016", + "12/25/2017", + "12/25/2018", + "12/25/2019", + "12/25/2020", + "12/24/2021", + "12/26/2022", + "12/25/2023", + "12/25/2024", + "12/25/2025", + "12/25/2026", + "12/24/2027", + "12/25/2028" + ], + "earlyCloses": { + "7/3/2000": "13:00:00", + "7/3/2001": "13:00:00", + "7/5/2002": "13:00:00", + "7/3/2003": "13:00:00", + "7/3/2006": "13:00:00", + "7/3/2007": "13:00:00", + "7/3/2008": "13:00:00", + "7/3/2012": "13:00:00", + "7/3/2013": "13:00:00", + "7/3/2014": "13:00:00", + "7/3/2017": "13:00:00", + "7/3/2018": "13:00:00", + "7/3/2019": "13:00:00", + "7/3/2023": "13:00:00", + "7/3/2024": "13:00:00", + "7/3/2025": "13:00:00", + "7/3/2028": "13:00:00", + "11/26/1999": "13:00:00", + "11/24/2000": "13:00:00", + "11/23/2001": "13:00:00", + "11/29/2002": "13:00:00", + "11/28/2003": "13:00:00", + "11/26/2004": "13:00:00", + "11/25/2005": "13:00:00", + "11/24/2006": "13:00:00", + "11/23/2007": "13:00:00", + "11/28/2008": "13:00:00", + "11/27/2009": "13:00:00", + "11/26/2010": "13:00:00", + "11/25/2011": "13:00:00", + "11/23/2012": "13:00:00", + "11/29/2013": "13:00:00", + "11/28/2014": "13:00:00", + "11/27/2015": "13:00:00", + "11/25/2016": "13:00:00", + "11/24/2017": "13:00:00", + "11/23/2018": "13:00:00", + "11/29/2019": "13:00:00", + "11/27/2020": "13:00:00", + "11/26/2021": "13:00:00", + "11/25/2022": "13:00:00", + "11/24/2023": "13:00:00", + "11/29/2024": "13:00:00", + "11/28/2025": "13:00:00", + "11/27/2026": "13:00:00", + "11/26/2027": "13:00:00", + "11/24/2028": "13:00:00", + "12/24/2001": "13:00:00", + "12/24/2002": "13:00:00", + "12/24/2003": "13:00:00", + "12/26/2003": "13:00:00", + "12/24/2007": "13:00:00", + "12/24/2008": "13:00:00", + "12/24/2009": "13:00:00", + "12/24/2012": "13:00:00", + "12/24/2013": "13:00:00", + "12/24/2014": "13:00:00", + "12/24/2015": "13:00:00", + "12/24/2017": "13:00:00", + "12/24/2018": "13:00:00", + "12/24/2019": "13:00:00", + "12/24/2020": "13:00:00", + "12/24/2024": "13:00:00", + "12/24/2025": "13:00:00", + "12/24/2026": "13:00:00" + } + } + } +} diff --git a/validation/lean/support/data/symbol-properties/symbol-properties-database.csv b/validation/lean/support/data/symbol-properties/symbol-properties-database.csv new file mode 100644 index 00000000..4a71a8a2 --- /dev/null +++ b/validation/lean/support/data/symbol-properties/symbol-properties-database.csv @@ -0,0 +1,2 @@ +market,symbol,type,description,quote_currency,contract_multiplier,minimum_price_variation,lot_size,market_ticker,minimum_order_size,price_magnifier,strike_multiplier +usa,[*],equity,,USD,1,0.01,1 diff --git a/validation/lean/support/lean.json b/validation/lean/support/lean.json new file mode 100644 index 00000000..a3569a2b --- /dev/null +++ b/validation/lean/support/lean.json @@ -0,0 +1,6 @@ +{ + "data-folder": "data", + "organization-id": "local", + "job-organization-id": "local", + "id": "Local" +} diff --git a/validation/lean/workspace/chapter16_etfs/ml4t_order_events.csv.xz b/validation/lean/workspace/chapter16_etfs/ml4t_order_events.csv.xz index b4996e7364332bcc290a0f9c1255ea88fe582ac2..b84db06e1d089358634cecf03cc74b16703d68aa 100644 GIT binary patch literal 182272 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 z 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

^y$b)Y-1U1c(lG8hBWJW|*`b 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ⓈK1{i+w=aKE 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

CHER)C8R6#RcK*p;eMY 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 xw>wAWUtv^7N&4g-dI#uzvXNu^ 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

wHyoezTTX`F~vH7Iw+a~o2QV4 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 literal 300628 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 z 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

A_o@b23N4 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 MFarPp000D8S~g$qbpQYW diff --git a/validation/lean/workspace/chapter16_us_equities_panel/ml4t_order_events.csv.part02.xz b/validation/lean/workspace/chapter16_us_equities_panel/ml4t_order_events.csv.part02.xz index 05eaf81f2e88f0b9070c6c367d2554876c82f737..45834cb44ee591f25868365919c3c32a7ccaa045 100644 GIT binary patch literal 281664 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%0AX`q;x6Lxfm-KTg! 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
  • 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 X0RR91T4*GV6c;-%0{{R300dcD8T!IL literal 282220 zcmV(pK=8l)H+ooF000E$*0e?f03iV!0000G&sfapHr4O`T>v^7N&4g-dI#uzvXNu^ zTHl>2E(EfUJ1<<@^YYi3e#45JyML7p`%M0+)-|F)fs{vOwb0mzI8`aJ(heR$7@+(^ z=WMXXc2M!U1%`jwzPSQ+&Ew$Jz=~ShOOZn>wM^S+1|WDqAi{pBRb*ai$TK_F>26H25NsJUxQs?d4=TAu{LG zGqadZ*FPw-8O{t_J{unQu4H(R!=XC!3+1$gH#GeJC^el<$6`$D3f^^Ft3G6C*!oSX z&TrHaDZ#H?n?Yaosx>YCq|^!Es3YQnNaKkXxh5m2YHhq0Q8G7GmQnskl^T|YBo zLxdd`8kcZHq5vdr;$V!|zen1k5+*yKglztnFV?dS?14zP_Z1VmDgGm|QFp}> z4FbX1<4a=7!SBs@e9@LfffLZeUjAF4dIT{%HFwxK>!@Iag>uc%D?}R${`0>l20aZm zveL8~rf25}7Cr6By9$@|dw2<_q!1BA(tK>?19 zn(b@C50aq9GkabG3BP(|W>9wlfV+3~SDD@Vp*c1>O9OqAviI=#km9~qNe3x*!gEc+ zC$#JRSL#3g!{F6tOajlT#dZ<82v3CG^#aO7KAD9T5@Kb2u?xoXKDv6UG(qMjA!m|c z@U|3gU+Zj^8`D|xnx=ve+3N1*bfMp5Vmm&O^%VPOxe~A--kpvu%GKn!P#(S z2|n`6n&H~*-NxyuozVkWT)h}9JUKYU&^T21^i6!8!>kte8A_#0!Q7I-IVykMQz0x( z!gY%yn;b$i&JMB@@545!gd=E3aCu`q{{tP5%BSkr+C+D$Ol3$|=H~kgw^f9uXX~`7 zn5gB%w*xsz?ELTm&RjOw=sc;G2ic@L(RJI^+S|4{MPXJe5=9*M{K0~>Z4>szrkyiG zhr-Xyf(B^#)3oU^1||Xpra^AFxg_D9r;whA&utT4Ww$#U=m|yYD%iHi-G{C>!^Oi_ zJKNFs-<`t*;KVyjwz}7vD#Ks2;eV&xLGpXSg1Y<=ulmK#5THXRVlz9TL z-Sxhu&qaUBlI!_IWtLG>dUAJR}>vEpYC~lLwi$`QOwawltM3d6!ca> z)2YQ-n@RAT(OAv5R5)}ciRqpdV>5cxG9y+pIEVT;IQn|3BR$7i7YAaQ(M6lK;F0=4 zA-;SznZKU;&eMgn7wirR1ayuK>1fvBW)^PqYyR_aVK-#gk2Xv`?>D-nB+?|~&?X^4 zOjrv4VBLK>GkoYo!8rT$P@j)}!2a9;0zaZ!CzST%|B+7fiP-Tz0ih?y<6tf_PNnE~ z2b;c}YZE%+5b=6%;<=!I4d7p;>{(a`?znSKH{16-eoi+V{Td2~9(m zdk_Ejm3U^teAU#@#_PQtUJ2U7O_J8_b$-N~@$<&!xTdq9nL6Hgz^t2s8Iw65V&qI+m#ir*~@+^?r%4ti!;XaAgpx)`3MmrUDtW+|ntG~=&*Rr2o4mz` zinCIb$2j-2kBug}((#f$2Lx`Ze!>Ll$R8md*NNHOSu>@6as5Hsr1HL8$-|+({Smzq zC`vq91z6T_ZM8~>%mS*VE z<2Xh6^nK#3n`D7S=4U?@gGp>;sth0g#Hx`Lc}j;N>XK{vzIEKwXEqz*B6fp~;GaiK z_$~9Yp>mV*?!#(x(r97qNTZo{JmWBvZ;ests7nW*0AhT}r7+6Ek!+sa)M<`UaP>$y z+2mtKWE*av0$3fBdqAx5p#Pz6efD>z8j2v)iaRABu)&RsC!vYP*Dko*#$ob&HWcLX z2pVd~A5TRAW8%w1@LRwIabnAUxj9;Z{}yF%6Z$5lfNokU{BsW_!o33s)V)=C-($Gp zHLKFtzP2Z7ZDMh}(2svoSi@G$BH1v}YN70<;`Xd$h#3*t0+wjQxhj!3Y%!(nlRxeE z!W25!JzTebK?yB#cBUAmI@ZjK#+y;%G)Hb_jowq9MX3UM$Z-Q&uBWU5YTq^8=GgN1 zWBsiVB3Ad0*w#>9`Tp0>=7WEPh~;N|U|H#+D7DL7Qr|;~1zhd9QE?Bku@U7{J`Y>{ z6%Y6&0E|zW{3LYrpx*!d6NN5CBiMskbLr7((Hnr~J@MpWlAW3GtRRdAAKZRgn{hM| zF>XOxO+5Fm=}tJf^duUMuV5^v0x8r~cc@%L8{t5#TPa6ay7VY0rUcr}UeV)*i9eTY zetuN-B2vfKzASzrB7uT$$)4f+=>nxHD{q9H%4ZB;FdD@f28N-*$|rkksHz7A?OX$Q zYm66eaq)lMO`W!z+mf`~dht;nNHmtty&A)^ou~He1Bv5d^OT?gG$@HOq9$kMB*`)` zizCf2Ao0|c04u?zcY8lzI%S4yXI#xw_@ef2p+x4rjG-j?W!J-acr}DpR`&j8H(mii6bc zml?vco5Q~j%;pFcoa4)uMfBKjF`>F-#FhK5`E8!oJKy_B1LQovbNVZF0Ka7Kk}1MS zBBt#TVYlp3&sUiVt3fs?PSx|asEE*(q?WiArwBi#c+fR`pKmFxu0t?f4L4!I?%WZ8 zyaPn&*r)PTl%-bZRM<;Yf zeUuiyNV^pe2C4JwV5`N5#pf6erEa`ue9%@HR_0&hn^-tyycQkd?ht79p8#%7(eT2} zMmLUS&xj2ue_(k?EmSkdY0_nc+fq40jOBsQ%j8r#e<$XnHzVH(B=pZo5W;@$+5(z&%LUlFuYe z$&vL;nPjFJAG&?VJsII0{SXgVlBtB5Lvh4+kVD?GE$FV648W%<6o~^k(8yx*%owR# z$bvpiJG7>JqoyDr2k=05LIK|>*=SoGkrZ@YVBp5u}fns z&Mi#WZB7FL`EDjU&bRa|z!JUyu?ycCB9W2F#!q$b^shQ1Au{<28bfwSL+S7+PwXvG zDKA2E?!tvzo5~KwkJ62r`ORDFy%~l!yN9XdXj19xCw`mytWS%_3qRxsZnt90_<}o$ z^VwbL(^_1EUO!!xc4bdV4*JI!5a@gPwYE8yDDlyO{N;&U-SE!DR33@$=JL}f ziC^c}1ZR&;dRF*C=G4PE9_Xe^<*LPigE@R0KuW#fl(UG$=~hE_crJB3@!*F%(rb*x zI7dX0>cy}eJ(c>zH;P>(e`%854_t)b(zeoYZ8%@3Ly^@_HvjreN>1^GAB)e@?lJp)<<+6+2M`jZIt=TsGj&h>2!Vi9O`2lfEs4w~L>U~MR%bz@dV`p{ev5WNQBo>9Sde}#pKT}aGTaK4vZjm|T7Kk2GVV3WZq<_5t*uB&OdBazAq#IN1R zPxdA5gu1t%JB)omY?*+XzL-wX9VFlJBMZ~#FtHh{LrONUA-njsm>mBsQm=;59DFJvUjEJ_#x9oxFckF&xcPE zQ-a+G6dDsrH9usko3h_Cj7x6CxPsPsa%iWQ4+0#}@(~{u!Q7FUIiW-JdukJj&h2yy zzu0C+39txE@fufT#6{yxEhgF#O2JaX1ux(*y|GsC87)~uY50~3cEboxH!#ahv@8uU zh3nLxVsDG_HRwSRBf6i#W6ve5OHm`pvlm(h93CSNk*BX16G9>jwzc>BO-r7Yir_hX zCfGxCB_tkpW{*(a(6Bi?&@|j6$-M>lzd0f9*cehn2w+v@B}SCsEPW>NCt=y^e^sch zgBtFtJfEq`vYHZTadC!uaCZFlr#~agbqG0xC@l5uvuSb-Y3zBST2y#RxkOqEON7=6 zb1VVITP-&u7?23#jbgLe=^L(psx`A}DW**eC-j1(+tmYW784WX3`B^zFCGeY-%I%` zivXBYQww5d??;V0FJ<0c-Pa5h74wzAge-mKSa!EaIY!Oa)GDpNCqS00(Jkd4nH^q< zOAABKQX24Hjh~&VNZHxABlcnBa95JU_yZd)td`n_kkw7A-v*(a^4LD`N@5}nONoCg zv3B5HiC_Fy7abcfV`rPiG?mKKz!m80x=|TlFO__*it)AIQlEP-Ve@JVK6YgCIbxMq zTMl-z37CT3CXCmj7GDH_s9As)k2h#&7?2zF0BlcxQeVcf@I0Y(91tyCz%)jvi4B)9 zT{V%!G(D`nVkFPIAiOH8bLU4hxx($DdL&ZYXW1Qb8}OF-K#!tpKkpx8eII<+Keqxa z@`M0LQIq*R!mx|E9nhywIOKy)8s?dvXN036HspJ z91gmQjUh-|ya&v;ST$FpK#=ZEZTl9AEIG8ng+1@Hc>m)RU6T*Sh@lFO(22NVNU-L{ z$9p<8YQ=q#^3zQyGG|s6yD^rTskEa4xpDX96++G`99-AT#J<3?Z>=S2vYYYrCs(e| zqsymp!5Fd=>TEe&fu_KYs*JHb1&G~KD832>)KUvV@zLh^IZw=AK#58#xpqSeRSn~) zGYkx|{IJamXQ~&T+i)s5#0TTwY88FU?b$Hh{>c#=&ehfiE}WN zB~~N3u?ZwxNZ7eMXe1q;MLDXJihHJ}g+YfXom#vcSu5+V-%slcCZ4waj zI2{2RmNSCJ=%)hTZLadZrH&5Shkh4(mU&Fpr5I2UFUsOAs}}K9=CxARrEMH3-lx~K z37$=m^1t9d81R>u?4H+pxWkE=l*Dbyv{_g6fg!V49c2A)5I@czEXS^6U0=Djl-KSy ziC~3&tpCfPy~?C2Sks{;r^TUeS(NE1{s70BgGTt#90V?RRyqd7*qo zZ;~=^t=nX039{fxhBxV1bHNa4tly6{ME8lg=?vYxZGnebPO!H1u*nf+pGpl=C(B34 z&A%P&)r-a!KY*+(&oBG05bfPKdiPg~Q!>()rEtfIN=pYC zj|Co@Bh^VLt*WHum%Cq8WK+XMDTe@em@cLx(1s!cqh+tNSV$Ym4OZ~|Y2Jlq)1c3( z!W&QreWBf?I1So93TG&3TYgn9TzbziPE=d7TI`LuL;jTy=LpFW-6^P&z79b;4SVJSk)E=ZoEsg4@w-#TT^={Hi>y zVCcYXSNGa8w*RInve9D{(}&=Np!=Cq6?LhIYDiqEh}4h*|pA#YN}bre%AmX6$9d zG35@^N9;8f5l%}&JrSmiiU^a9Ot!F%LS4fzq!GozyO}{Pr)oyzADJ!r(zYsi&+MiT#N981&*R=o+>51I_ zGlr_-S^U-Ic#H%)5kNVgtEsQV1^Abt6K=_F0xZ*+B{66X)u$6*ZU(>rJL^~zX$2C6 zEXe-G6K@bU2Tysm_M9!rc}R|%B_A z$b(zZz94gBF0Q2<1ip5q`=uX;%&uA!38HFx2fre#<`+Bl(9#P0jse=__U`k?N>EQX zc_f(ZUGLjnT2GNcCz}0lcVH)>`a>em%9sg9z_DzEYL~NOpVk>%VBk7xUhS*(fRj8i zdThE*iQF8!n*~mkhAW={37;mvY~_wEfG0~2oyU5~;gY#ALkn&tXxfMD&bKabzZk0d z5|Io2P3c2g%wqJSe~oH9u*#m_aqnAa?!rSIQ+MzInB5Rgl`YqLZS8&A8C-1B{edB* z&PPNv<)w`6zg zDF6KR7r>TQ)rsRh@#LWkbT*(di&PwoA9|$(in)kc_q7h5#~pzD--Ez_Tl+#45^XEr zD~d04gC>EOu_gV&Z3ibnXhw4?#s}9Bk$!PJz-4SsOya2KHY~HtyL-1V){gCSaIooT zB^wxi6IXC)21ZEpanpj4ig`C0|3BLd5VZU*;(yOLiM(}26LuVd;A3(m-`XSR$(A1w zQ*Fbf!e*I3p1KOda_KCHA6qLC&gUP-vnI30yCyJMb!%>v7slMe7`Rqot;4`WG>^Sd z>VD5X!y76nYa1F{IRhPc@!oOLyX+iWi;muPU}Vrc#nL0SXDCdinW;M3o-GSDN8I{3 zEU{BVh`pfn*{C%&hjux^|Df6FMu%OnX+zU+7?y7Ut=6g$z>6GWS=h-^ROQDc?c zsE*{~6~^R<{;Eg$_zbf!93{KIoa92>X*!-ksB(|YIJboSKk_u%6TrQRogt|h`QBS7 zc1H(IK5g6G>a9G#az#ulT6D*b?mA9hksz^M9kTb>e3trv3bvgFf#UYO5%paGA~Ux$Nn z{?*-o5^YG*u{IyfN@7Uep`&s53TUQgcyf*M-377=l9A+ycJ0Q>s@0^2+e&PSB^Y4bgl<8jI$}aIdDGLScgJVk!t<1OkEpt^sw^fdFNi@I%ID1s;>1O* zsSJA-RF>~5mCsUu4kGR{5n(%{f$(Qp^%{>fX5C)d9A3rzZqOrraC56Y zH4m40YHO-Wj))ae2ucYcOLp1rLdKAD*+cTf5czZXk1>}?E*R9!_#tTS(>5V)d5taP z-gvG2UWNw0tMe7t2RWVT$Hj*3@DHxS@3m+f<)^2X?OHeekyu8b@jE=W9m=I^1$C0= zXNs~q=f%E#(fTOec@ra`O`vyvO{&j2p_dzYg8pN##Ewc^4vnwe2~uXN8jegU zk@=BqqF9>{-3GzBzS=|N<19nS^l`8wfY|vwHMS|dOgQ`ploK0)dVe)4%r}uQX%i|Y-;f-t)162T z3O3tsqwJe#fTFmbch&?H`A?ScHEOGy?6hlRRXleD>-0N7mBL6_<6UPme8fT3!qRr6 z27V9x`cW4=_Zask5)tJlXoO1-V9Rbl)=7^y_1Oh71IJmOrgfDYtB*K3i5Z;3_pZPA z8~Q<^8VBn;yeWLcIis$Z<{v$Dmk^KVkD?8NLwaW_WlOT= zqf_tJaMoMhaA^sd6RFw?H(-)w4E_hu#(l9_zIQZ#_e+bVg`E{fi>>>`vo?D!MD!@^KF!mT8{491X*-a~`_Ypp zGA`0!sYj&?9JeICT<7(r{0g}FFK|cq%Prslkj0A?THaUTv?G42(wOMfHD9B#9bL?? z8snn_H}E-Eo_P*y2b3rZhpuy-k;Dm2F;mPeg*)OuECpsfmDhV-C@$F~R79fBHHPj5 z9*Kh7&&>!cl}2K&sORzSHMyO4=aYi?MVc@HW94{#w>;%9Cxh)PNxFICeL`_7*S@*r zRzN3K;lWn3>Za2NriNd6{OY@tiVh>$prpJ?{+GCf)nq*q!d0;jDdVa5hUaEV`RIb9 z?BR<0x`~CL?}g`La6JocJg{jJ-zBohVN@7}gaV$%3*<2(7ZWm=B=Irq# znH{*Uz0&k2@@FIoIBM{I!MID%F*=u(SQSkqJFRYo=>b2{A0|G)c`Sj8rs0G;vuZMp z#@06}x_QpQ$}gVLLUFyMb}=6)|^Kr0Nhci8MwN`~1NpsYPx|zWQ z*_?KS0QZ}nKBF7Wj}1s!nY}9|mUVd4QuHs#uc!<+Ig70V)4OQ7j_VQvKMEo~Hn6h! z@kcn8xkx~5_yhNJM%J^1ejy#&KrnEPS&tzYr`g)JDt5l=RN$#D=!1F&z1KP50Dnr% z4=T(v(W`lRKL*TD>vx2U4#A>hEUg!}SFO{;wE??Po>qJDc(!iat5}00y&8@T%ENtS zh@Ga^q6hGUYZ@3?`sEueL7AuKWmrZ* z3;d=h<~~c1CVqbw8OFjQPrGReF54qCnzL6T-EBG8yUq$1tay_-X?4W3Q_Q&_vjeN% zI}X~!y{YYd-cPtQ1o5A(#mR!f4Wc#J_mSuENCj%48tn1c#t3UZ^7LKtm}?NG;6(37 z^#?>hx?V)y%HFC`{TBeFPwhwLuR&v03lYDLINOQTqUI5SbEjvvfxx{=LRV-L=w3eh z?PJ&|X`Ak1+ccX0Sl3M8Lcu)JXG?FlyK@dy<(RoXF0T8s8fr*DIc$1#J{6jNFJ&qfB)e zAkFZDIzAC4zBcF}xr;B!tVY(zg`k{EI6dr9c^o&9Ahj^(^L9gTbmPG7{|2JjMMSXBW z!*&1n04Y!siL+)}>81r(Pt0;F@hI>aJ-FP~KWtL(oYm5c@;PkrEK$A;#XpWT%Xeuv(%LMpyp8>xGpt#vi{ z?UyeEvi>1E&#wB_%M<>Yb&{2MZZb*JoLUl41j>8uchrm>3+mBpDa4GVI(vpS8^~jD z&=@y0lVG2*+a^=**5|q0#@2|W(C^w3s~7kB(2@1d$U!qyAjI!t0mjc?qK89`xCmtx z6+$?=#-C)lBxuTv6DRwtfQtL?23W$nw zYuP;!28__`A!B-1ftXU9kV(fE3m8C|(8`jpA>(ZpStOMj=Y)&Or1~1pDP&v&HBiy? z$ve*-nD7|yGNoyOxJ$hph7Ny{=0a6@<9|WJdswNF3xVf&a-dDbmX{(KUlw-GGZTvY z9paA2Ml<7R2=yCexl4K)aalTn(H@??8=L$CEiGpdwlBv)5G)AmeUy&xgd?o!QD;dD z#FOjKyI#l6n8*AqW9s5?_0-GtPs+=82RH>JP8XP{X>(AzZY?ttaG3!oIszjbiL@_q zwODDRk7|hK-*+LXJp7iu@6mdJOW5478KFR}mV3!I8kMe7iTiwMQI|Uwd_EQ>Fko)h z)#(6>dQ)on-N4{Zl2gcapd*;HHAAD-WCLm@9aa3*P+w`s?$GOB2H*ISP-`IS?}RrkIT>(B1Iv5}vB4PC&g(Ij*6! z!oYg7G{@n%=JPX*<-_|=?HxpFIcY4&yKPm*U{2QdG1rGij6aOv2AGA2nx)<`(Yj#v zFK+TU+>^I-pn`$2ZG3OOrvTMFXn}*1yv1vIr$TSke-;g7QJ=O~=$j?v`eT^{yEa8c zhsVtN-YjK|Su#Nee^VhKAZ+N{5WZAtFfgE&PVS=@4jWqdn3v-6{Kh!$VJM%ZdeQy#7 zORYGhCIb1Q#B0!PMy*@{_RX6qd4l?{W#0B!`~;roV2d(Mz+FR(rdkB_q*XQ6=4do0 zQ~KxY|K<2Zr_*CXQVZnk@?j%AW^Mh9xqc4My4Tr0qh^9trJt+%TpJ75c2Z}n|G_Wc z1SXi+HaW$Api&>kEe?O_@X8;?v!QJ~I?_}uIHTbRslG8OD;$-+uq zK~^sDSoO@)*FAZeUy{42)6=f(bMr`CL(hsS^T?4Vm_O0s#lxkQ8~7l>xFf{M-0;#W z&L2Fm?Wtfp%t@LDP3E*O-7lHb$)S)Lhf-3oqB)6R3yBk0A}s-UF&pkE>>%ztOH%%Y zKV@<0_uYg`vN7prnU&IsGa^08?PsWlE5UxmapY6@??oi6qm5I*;b^~(8+l1g7{cgHR$ zC9W$O5nw$QkQ0Jw_nMU;-5bf^n1@)mAS1wgN<$>we0 z)%>dptBds1GMI|S2M|X5$=|@a$*e|+$9${<0EUA49o;PVObKLVdHCuqr8_5Mt*mnr z#Kl566In~wRj+k+xc}}MC(~~w@V14whYs!3Qn$=H;fMcpd_8N7@0JHs9-P1-T{W3J zaRU29ZK0OO7#e?Vkxlm_lf{X5_}onE!V=9aG<)nu_uup^Qs!^4afs3B>*r9=85Lf5 zMY!p5_}wI8xvPiBd^f%H^%(KQ^EqyRnx<18l>rDcJ7vdvhSFUaK7Y6WFa!H2P;4bY zWAD|Oet3UbRzI0;mKJnDWw5LJ|HV&>5lq{bsd7r~7qYg5>_J88t<5rv!!|dF1`Xa? z;$D|NhW3h|T&2zuNXCCK$ezr*GfzU;?E#(c99bN(LkD*z`T|4VRZ+tl*vRiV+9xo( zto2NYn83neU8TJmu0vC4Q&_uxwpUf z>c$4oOng?fPfMs z+610l7-V_W=6N?7E;q5-#${5J+V*)XYwk^Hkp|AbS%|JJ*fFe*@V}h;&kwsYnX)8A z4xKFuuMwPBX^LFYodKqBp6QvvKw+@W&$V~pH20-=TAC>ZFlpiFkn0=gMbqbYaVX~r z+%Z8oNBZ$o+==I1*wG-LEp?c(&V@|oAn8?gQGcfxUB}4}2W6ycMYD3neD^a}E|0)> zwn?ZVG$UIv2cEeQEh!b$Qv6z~4c?WyEo}FJNXb?Sk=K%Fy&4|XWuEB!PsH(fw~0Zp zcY9sQP32)^ClpzSSG0(ms$?W<&adjPjD=3JLW?97P@geBx;an~JQBHPs~}_%{b6o& zM77XD(lo^C^-tF3o>fo^xOMe*vTHjWQEbZm=U|Iw=|rV61iJCi6ud)Q0u0F!VPTsq z*i!nim8(phjXd3M*0|pn#ciMZe~&6PQMBT1KHblhQuN@6I`)j7h%AyGfs5$H(URgM zws)bt%6uqTdHJ3O-z7Hs5TaHl5nN4w+97rIFnZg3bL}S8vN{2tx7wD8vqx>S?;%MY zJXf{P*h8%)WL|<&aO?PiFxdQR{;&A|-maRy#_pj_G%44kz>L>9GpvYsSAKCQ+x(d) z>)0@tKYoW~x9hQ4n3fKBPV&@Qax+)#DpVSek=5Ln_TO8Nu(ydSyBl~r)zD>}>tW7U zVB>u1sa-zGHnc$7C~1Vt1`_8f-ZG7m{QI5hsu_9=%&ZS?jt_ZtgC_p+{%42uZN^ps z_b&c0#8@r3-jP605{@jw?}35^bu%2~L5|buM!*`I$-l3AorM6&N)Ce{AJY=*<;yGE zuxAA9!Cj%0cdU^qFfFC%N)v5#1XZZFIwj=Z0?p(Bk{>vorWFrtO%oDA3HtX-Tm|dn z+MF4cHTe7o(X%I4Ae;6>3%1hQt#;Ap4#%B88|PNr?nx1umc%_X9T*!o|LnVB&;#*K z{7*-c(!O%;>fe$|})@^(d*s^wi98&|3pBzYF;*wVZ0QPMj(g%H0$g|QMFPp(i8)VoM0 z^5Ab2q?%>0h@N6o%XZhDpimL1R)`VnKevR~$GfK^L`H4^Wk9&a_|LJ&D~C}uPm zDLF)R#{I?}Q1yH)t~PRyLsv1VhXMw+evS4*HYzRVF7o&#UhcJEv)d)yao`H*+AKvm zAHL}Ab^gvR%mblnX5Y04K+t}IIOPq^CsBaMUP%G%0cPs+#}wwtLAH)Oe;K#@r-)rh z`K~#Z;!51Z^I=%iIHo0A!*nP?`Nk*F8-|xDB;w3 z6O!q93Z%`U5d+pZmdm+_!=&sHG|82AtKeuR) zQoq|_VnF_I_GRAT32UZ+Mk_YXlJ^L5&wv7foDHf_D0m;I!jxJG0QKxC0|o#z;E0Dp z3r8$is_Q$koA}g;038ixNMKm5e!R?Hc?a2aV=H7RR!?r4A;79;3B|k?YL*)p6iZU6 za@2fP8~$$(a5@^fO)kWG407SY>QT-$@~n{J*r}W#EN#zEOm{gK+=7)*)mH71ifCc1 z0cYar=+9S%ZRdP%J#wW|vZ2%}OpGeJoFTrg74>deahISqgZ%Zcj2WsmelD1TrDp}a zlYVk|$+ZRA_3Gz|KU7qv(%u&ylZfArVmQrb-vX-hcgeu(SZ zZ1zd*t$yt`t4#xr!0bgb0&*aV>8p5tx)D=&Av(aBd4-@zaRRO6Wrvfv0XaAO6$l!F zI)8*uB8(OKv9I@5Agv9WVn7^H_Rdh)QMcYzi7!YArsLN_kY`Of;_$x03^fAsOuoQI z>)_J764m12QHHj`94LcJ&a?$NMAaTSTlxJ4B!w=C(=ULxnQ(;eyq4H{@&r5Do5*5A zn$^3r_$U|NvI4p9XK3o)bAQ7b9r|f-m-q)h;v|knVeNlpVi^)|1BUJ;BxBz;&zgn- z8FP?OT=GHVHH90=9V0QXcJ7B)VQ{(CS?%+{bd0FvBXt2a7<2pGjB?s@(^Ex z+FTN0i2lC662LA=4mzDPzX+JP?Wm5F<*&V|d+__vhxHT%ew%X^%3dVJ5QCCDGESH~ zdgD%{5~Y*3tyJQb;6m-|doB)#UEixm4 zbg5EDG8=D zGoPG+P$dI@;IC?rnGSAe!D*50U3i6%XnAtF%7&pXx zD7#p~I=Nw70nI1#O!c=nz*(u`(GvNY9lc;9lxBgUP7YLH$aI{jk zk>Oc(fi%tQlIjq>LJhQ$C$4(r$ICtgoqI(-c?5l>dFlWq4JGf2Rk7#O1$yNYkd zp|&ehefu|ic4D;NdU;zAQDvda7@t0#ueZa6IooV!mSFKTF5cPSr^?cxnIYpfu^=Of zrnzhOVM2mnc79rVZxRRk%ORo|cptSQu%Eb@o|TzyWT-j;d`i6(SFTx+wAU+n z&NtT|!7gu!)Z-}keWu%Ww9apZ%u7nl(E$xsJqE=c88PgMM1yRJs1{7y;tfNqmt;B~ zFS`j-QAHrY{iD;l7Q zV|J!R1u@f(Sa#v+IjxvN%3}N1c^l@#AMpg65v=}IxYBWQhtG)YQZ;y;YeE`=;ra-n zHN6%Z?KL~U$OI=AfEDkUBuN&qAVr8T)04yx3&F_s%G0uH-&S-Ux8z4&^u|BU`NR|? zOqSQJtWC(Hh<;6Ci=v$e5f});8cBi+1_8m?-l+xPeQkggQX_3!m-H|C&-vi8c)WPF z_k*X{?Rwr2cxt(td1xoTcDwN|DJ17l)yR{O>eu|M-XPOZ_jxo74ezxmEje5#ddR;+ zc=^hM)XFO7l+*}LI39}@TRY9@2!V@?^xs6kaBdoR&HB^;F}h5C5Cw*+ofQ~(C^PsK z-TS!BA0R{korEZXA=3A|1D+V^7`A3FqCkr_LSHhn7WXS-zprZKihY(P8bSKBJlWdU zfC)G^M>22W%m`q@7*eys3+sr4HE&QyV?yG)5_U4$!SoLY4orm_LaS%>i~hmw3(Tn{ ztFlL6dsE7Xwd0VgeM>=9^qPPt@)F_@{22yTvB?ru@GznKu*C0)%lCCQL4ARrPQp(_u$X*MqNMW6FCB%hm6AnQ|QNu)4Lu%Z|k%e zTc_@)U-pga27bFiqgyZ5fhrdYQWvE)2?&P_!8ci%q^DI_5Y!;h41(Tn@;+u)V64n>76i8Ky9e`tkP^Iy<;Y@l z;cR;;KL}Ho#9%&;PB_Vs-T=1^Sv%P$_wn-0T(_{q-*G|{bGlF`DmGE6O2;^d)5MVY zdTe@WXOd)t_B~7lsFqfXu3{c935Wv%0sRibKuNuQDrbOL_gxeEdhi9{sGJl*N+3^2 zpb!sh5j#BI@oJ6hn-N1a=#aZOhs3+gGtK*(Xe<`(dY*XZ@;jA9D|1l_DF6p}0e|F0n3%eI7A?yWjFwXd44Efh@aHGC7Ns|PHTE6+>l?nLB;V~6-O5>87)0BPTMM)skejc29y!@f-Jl$h3?%Fm4yOTAs1ACTdi z{N*N_jf}W;w%~_`JB-qoofK6-+24S)54WBB`oRb>UAG>JvG={=>oAA7c zKn;jnzhtcDQ%stVUr&jEQl`e6z=96I?3AY>>ZvP;o-@94DiHULOE~{dJcO~nF|jVB zz=r@|0xfjQQZ3P1_9IXrW>n9b8Gh zG~utta{+q#4*G~lHM>zrC#m3E*Kl~B8Viqdf06uMRi$vTxl-)>Nuk5)^l{l1 z@sLqUF$Ll*FAzqCO~>L=&N-Hhb~u(k(RpFn)-u{sNR`5{BJ!WhDrLePbtoa!)NNRe z!d@jS46|@>?CTFutzw>#ukTHdc~62}u8 zpMy3wyf;a1inMxl%jPMNm2cXU`b@?NFaL+u-(zyWn|{KoJf!)KL*4(9@(uw%LbrF` z<*~^F!8u1;R&>j*Y;X0F7Be^fP2vZ^8OQ)TK*Ybr$JT`!830}!rQ(^WnGmy7o9w>Q zcvElbg$+6zD~<&6ib5-n(`GcvT;wOsATfnTG%$5t%Es_Vq-Rt3UD~ybcS|hKs8NhT z@2MaLiJVk_`$;Ow&;1^&qt2*szY=D_CGkm>*>oPX-6Yb6{}MqIZ;*3^lB7hF!Jc68 z`Z9#M86l(k9bh#ZmlPDFUH}xG7{2@Eyj_~7gzuRMHu{0?s|KG;p2)9%-RiQu_M4L+ zmMy--6vqBKEc5sI_&_{_Z5z?fc`)^i!`Ql*HNQzSYNMGNY68E}O)T&pd;{`~>Nh5g zcVSgB0iO!US~7K*3h3=sj#^MR+r- zip}3@Y;{3zoN+`}Y;PVhuteOYkF}xnKKf$otR^5(;EQaO;nY+OeOL~q%0$<|e&03d zcn-EOdj|F?K3U94-pc_ zRZyOxwyI!nES)Pelvow~eF&*H&F=d0Rb8GE+%bmG5YC;84!-8UOxaRrhMVHu6zM^dumXVA6*o-(TCw3JXL#_kWOy%-#MWINU-`Z- zlLrc-2`$cP%}}+aQafFTNt(*1s0PlD-7#}xB_kIdL^^oHsk`B(`qX@2zxoS)fe9Be z^V2^TQQ*Q5ZB=TLZ)CP6k{qW~?b1AMz~AwtQe{iE5Ny_$N_zpIFIFD<498YO^JWs`Ac(Hj>6goxGWa}hoakUS%1vJPWfXZ{U8g+WbMS)Fj~`R8+5gC(aBwq9my#HB z6d_xh30fS56BW)`?&w%zWyH5Fhg3r4G_Xxn;wMWTg*dnHUC4iVn6!meq=5%aaiz<% zwZQm>fEZ9<27GQBB^MMSeF}{t9}qs^BD!P9Ul(^9;{Y)@mDmt5+=6ev=3^C&H7${L zmJKt2`wU+bMAGM_i;P}v>V38fx6S0I@}3zT?V+5_Kkfv&b0G19P;Ofla>}Ci8ockW zFVl@YPWA5wRH}r4K12TXxAVU6=n|%+>&6}82%iHTF*IFg$xS+&ZmnY9e71ah0NH-t zd60j7X1(yfykF)TlKwX!9zr3E@!g_EI4Jl^JJOIeL|H^#L!t7Dy^lPPPJ4Kvl(le4 z^Mk18fof*M0(HxLa>~1@T#7p9US(w`wDk1~UTO7ss2^z866NW40kXhcXgwQBS)l8g zv1P9-fuK7*tWoW!o*ResYk;vkACeQ*twP3`j1XTr06yU`4QdJSjIzA zk-6sxPr63>N?&|>b|7d8^(_^5VXPMyn#&+cn|KD-pDw3<%5+;CnY$izw@NS9@(g+L z*9jDP0{w&7?y#Q6Qb;UhphQ~8H7ITgY0rEm!MD5~`RL;tj%T4y#_`?3>HuVv%YMZh z3P_ul`4zOJg#N}j$NDx7wY_R45CV9I1Npv@rG_)M?0sCPKN0HSf}4OA+q2B)IZ!;Y zmrZpBhD1O$s|s76Q>$p~oH5gmnW0Y1A;A&Ih0!TKvo#@Ehfv!4(?!F=W9GL|agR!Y zf9b9Ny;3lg^Gw-%BrniLDP2?{8l=aD=;g(K)Tx!pU{-N|+kg7mXGR^We{_M{qvQ{+Sp+DP7ZmVa-! zpgeaGhGJqydM|_%)}y61${j#72M?kQJ->O1dQx9qCE!--H1Cq*u7;c7v+rvTc!zvk zYq7XOcErK@jvxsgamXD0^xjJ5db4=6ehwHF9;i;4j zYz~}tE6d=aIe5i&mzFiK-s$RiuRoX(N5Tj>dFb4rs%6zWM*#NPer9Q3(^MNzP70>yMqXg0F?Aq+ico`&*Us&`eG z3mm<&#A|fm=@$!S<}WW7>}Y<+do3zLr(+4eWY$&fM-lOKvp4THwLOwSSE1-Q2; zq|CQ)kCq^d;i|nlIAdozyN^C$!wlYOyR3Fs_7!k^gXL>(C{Q7u&K%&mNWjFfSM^MG6vS*NO zz~Hs}bKPf~^t1Q;6U9P>3!SX60dJFSF<)-43CO8^gzvLS${biO766M<20g6daTHz# z_xzvd>W|S0yHn7>DU|hL3TmL3mv&#lGpKRFH%(X!h|?XuAd%;6WV9*|@Y@-f||^`-COaKIdJr{%0HJ4HPsfL)VVo9w?s}& z(bv}$2vYOy5rOU$%$UuaRE?&{9hXEY_L8Z3d91I&4T>m(Y zN6&S%6b47&nLJ)AKaWBy`{VwzU(H?C7yFYZ7xgeHFc@0y2<`Y`$w=IE=Ma|g(xn?j<|0#G& zGgSctP_{mY_jPR)Jv=_p!qvZOvkg0J1TMNW8ij(xaUc=Ao68gIv+SeEuAPZeR+#vc zOhJN##}dxkg$RKtTZXdJV1iK(_5*gOy=WQWM+4s zXeO0N)aBPXB}j7Hs<00{#>sYg^dgp-=mId+*`Uocd@*j_Wd3Ta4%%y%=15SYF}o}p zO+V*P-T>Alrm@{qRFgaZgGP`7{zZhY@|$V&PAEorZQpbwSoM7c2w8lT_XgZ&M_ei1 zQ{5#z{n^TH;Anv6I@?@3RWyc@~n~qSdNWQn@z~{Y{-EMT)~~c#3hAa zK~y+8=u^nwuiY@=a}S+_vUcKUuH0;~PaK~rhO=WVJUL>__8qaBS3|LQK(b3<8{mR( z+v<|1bDb^cPQKqS^7Ya~GF5$`u~?tztUsTrP`w?)ZPOXbxvl^3D$nMub=UggChB`lv7uWn7z z5%}2hi~2tDbc*+{_s;QuZ&ZBLwPMWIHE;(b586yQY;6e!bx?6+))I{P|4BjjA;&A6 z3o3`qh0QD>t0>3^UPYi?ap%22+1+CJJeGXv+PMG#m(^4-FvDQtnkl%%^Rxh+zctCE zCgz+r(|VkU{wc<((@1KE?;?|;Y-ywXSF?t;eF{mFJ4%mW^Gj$@7JJ>bK{j?rsSS)v zkg>#O9Cwkru{YbHk``RLOIT`MCkfHb6T^RomqvNJ3PwIgoif|f zjXNcs4VMCcF~nibA8FVZf=lmg#96RKrlO5w8~OK~*@Nb5#t(2Vn5<>^G2~Difcp5g z=3-f~>u81q7X$5|uz~PD9vx`4ZoYg2F}agJ!n1>FtAjeo%=a~yLlJ(nww?Y>w68Tz zGce;{N%EewN2CK7d@rJNQab>y-c}nfATEc7w{OvnuQv)=hXd27gsLx$CXjsg9QBA?-?nXwF z?~}KYg@0znwdH?ekV-@l;1Kq%sK)c}4k0H*6o7}dE^>J&P(%A4jYuX=ZxI{SUhoj@ zr%Esq$oV@VASn_jFO31+=r&@Z$H_E(>E4aHHT?G5jCghoq^^~RH48!3K*SW-9ujWhBl=+Q3KM1=5oBe zBtT964lfwkzlyH>sZFEGSv-5<$F~f zQ1b!$z)iW3lENmLLU&M`2QU&1o#!fFiemPn>;{zlG3nUucWK_4G|SAiL*utt_D<3D ze(m|{vd$yp#Yw_QrT|d2{kGa0WiRY8v7UBTeTPg~?PULqE|8bKG3 zyUh{x-;7{XBTDoypJ?A7RoH4GVqZtA2NXwmTw-2?@#0duo*TZ?7@j2h5CN(mfZMKK z;Ndm8#byOI^MMAeLv{nDc(HDJp=6FFJ#$koy_ACyc-*UYbIdb1Eo>|ZF4~1ateH7k zr9BEQcqqC#%Mzccxabz$Gm!u9`*1IZWA>+E66S>pL=$w6-Py1FG;mIPE+1x7_}7)E zYD4dx^bkb#r>3H2&Y1NM)X=t|f&ELwd0iT5fuO!q#8t zYv$R;vSg#!aS3y+t7^Znc%wYGI(k5BV=Tc(UzHu|nIdk{JLyT%POO`ai zL4qZ6>4Xj~-0gaU5Tws*w;M8`tZxYzNkF*V4XN~}Sn1TS5k9Pa90J{s^`H(Yd6hA! zT=Du=XfG4@Gh;tp3g_Bu6f6f8I_+Bs9_4)k<1&{RFXt-YXf$F`(q0*P(F$O@G%Xqkxp}2o!bJ-egvScn z`+z1%+Sp0s*}-N36%sypiKU^8i~6BiD0Wbohz0LDaau&tb?>?!LvVIG%d^$~=b4t! zciT|2+*|?61mC!zTw$XlP#@0$a46NSND-xljC)=MI5J|kuB1NTBI5S7tb?Z(RP*pX zOzF{G#nak=t5AUC%l4l+Q zK%ssW*^Gceu?PbT7SGnx_OVyeyR6qgi^dv`O$NcM)kH?_7<}iP^IC;$KOGX-*~cXd z)PosntH7XX6N~GzojgvQSa#<&vbo?}>+0Fo7g-EW)RmVl69s6_^Gr}4uK6S|>y{QB zGsX)nC2LLS`jBnX)^bp0){2PjCRX~=djWyXOqEbDHUMucitl~Nk~uV}#nqq&T2018 zsv&d1bBEbWMfe01Ip?|CIXz>J333z6=fN=9C!T?5CF;p7NNEsJ4cGbE7U>5Jx^M%9 z>C@o>7b(F7BpeO{q0Vo5=h)cWj~wul1yxOiU>rc%VMVU26vpIV%zS$Dx}-CeVRG=q z#DddX;y|Lm9AJ9VYUX+TH|AeBi@)%;!n%j~fjS_mHZVRk%x`HL&fbQ(JKl|%a+}q? zE7u>96<_HWQ!GS5SYnbtW(BB^8-q=s{TFPvFM?t7K#6GhTL=Wm=KPs7k+u;HHsgv? z3OXD{i;qb^7=iqLvDn9<=8EN>KIRc@WN18lc=8wHtpoo=`IVqaWb^1V_9)_%5tFc9 z<=@ww`Vve;X7nvNKP_8#JQ`;jb+6zre*jJC~$ga0cepAT_mC2^Xtky z%BPVhaW=bYfb5+QrjV!?S{hnKX3gmiK@DEmsk!;F))2s4KBusEAAGXPw7km3h(!Vt z_`$gX_h1_p;>1UF^stK&Th_Q9!smrda9kf%|GCb-kJB% zfjQ3!pE&78W()^~*>dc>=m?04-o_;TuZyzRODr3is>;8f?AXB-ZR`r9`)e^WN@oOV zehZpH^i0OW7#P2^`PU#&QT`BR2+nU~*tq5(OO}3RY2x$*b%QA9u9%n9v;mp(r@W3wQTep>@!`( zjvv{Z0p*^o0zBhYF#WoKO`YODp+-1j;^yIMcs?-5rTU^Oq_=MEOSsz}mbC0;xv(ue z7%jTS!#NOGCPG2tL9Saw*jd-}U97m18F(Rd$CHG6XJOo*U(bpsg9OtW&GGR~!UJpb z4xX`~InaO?n#!o4iz)h)8@GkbI@Ss+`S!MNesQvG3)ft_XO`syb1Rt7dq92OWcrhW42R!fJ z@Ata0z+*QReRH#(6ng;`s#rZ$-p>3}M=InxfNz()|D%j-nE_&l`Odh23D1MfYuH6G zajpVHo{u&abctF7Ozh?EjC{M#t)-bj?_p^CBd)G9VH*|y zhH^<&?5i!!_E4iyD&;Qs4*=Eksp8ydP|u9Dn%7J;KK%~_Y9ab2UA26WL*V{C^)b{= zaFn~q5u$x@SdFRW)YTrvoeP?6EC>CG%YHM!mc3klu7;@`wePMvno48k-v?WJYN<;w zEErS-{~D=%X%I;2Pq74C54KDwRpnfRlbo%d;QY4sR;7#`_+)}Aso|Z7_~0y*dAh z!5aC=HJh*im@U#&7TpmU`VIhVtzqrYMsEO;^s{G85^9pZC++=yGZAYypo#YFOBH5U zxN_fSX)A5>i$AtZRSdPU`x>W%CE6+rr7oC!cCd;r$cIN0iU$TUAWJuJPNWAsE9}>r z{tPMPe~q(i(efdMPn;4c1as^8z+$3|2Z`D*dl5skPlde+JCb}yG_x91nvs+Qff(+t zWFzD4aKqirlvYKk1P+S393#}}$JhP$x$AkTM`EuyJ9$|tV|}o02@5r_K3$s}7iGwj zQbuCbpha9081p_hdF-d;GvJXLj!pFBx1wobF`}UeEDc zYVH>pss&yg*LcXil~(~W%Fk#PR3qeiUQ|uw{FY)Mx8qT~<)mC#xX5i*=x>}to?Ki*jw zi2VOn=(yYAY%uL7X^?t*@06ZA4gDCRw{*u6-4_hX`Yf+|AJ8sVD+0EzRWe)v>Z6tM4%$lJLe%F7c9YgyTEI#lqZ9exOxg?6b{0f;w)h%4ndT75@w ztITuDT=wV(6Gq2kMk(V z9THj77bslgqB=Isr?aen(+48i^;h?rXF?Oo?yX?WA@Rl5#nN=r2%9V1h13I_*CBDv zDF`c#DNj~@wR>?!6NXRNB1oE<1yoQdNNPDOF^EZUZ>VdAOld8*I)Xd>f2ADgJ!wzs zvr*T`q*j7o@aHWiE$O~gWR+t@g$A;${hv024{ye7WO`pBv@hB7;wjsQzkacm=dQS6 zp;Gn1_Fmj#&IBqJx&3zx)9n|71G1es1r9HCT)fF-|F-=o+=2>2BKQkZP}gt2Jnh%O z#52257&6In@7go(Ki$KvZ)0QUBw7-eJtV}E(Y>hQvK~!uN2iViGCT;G)-li`=N*;$ zs>F^V0S>%6^Hta=BndK@^&zVBT57b|Tc$&RBw83&+JJ`GqvJn|F;R4*b?!?)hxvZ1 zLF!B3uCePMg!>cGyUG8a={MSbZu;&1%ZN$u_N!t||CCVS>VqV|ezVUdHv+xOnIzJ5 zD0SG-uD5xpqYt^ds}qDi<5Ti0Ps~0WkJ_M169Cf`B-C!;z{D=H&uUCK(dn%Lul)k2keYm7o$*4i!gw1VFa9jl*s6#-v3@qO!*B|CnNlq z=#SP|I~j^3>|SwjK8pbiOfLx?S)n~W_=cp=pSwN-ln;jZ zQ)a?`(m)FhB?PI(N?9M1Eo--~H|OXxzmMT|v9uL2MUJiw4k7h6q?2(Mb2u+;*WNqy zwtZVLQY3fJskO9^)p0pY=glc&QKBmBf%PUn1oLn~I z!=%f7jlZ^k&@#WDoq2m+&cy7407A*Bp?$k(QIE|h6v;zLYIcX?mc2nXQgkeMA%r~O zJ$j4UDhf2IgdK=I3z>Xn>Y4X)wjqN{UKY7%MzZqi1XSxaKfa+^*q@#{)-|ojK82QQ zmSJow<_7J=P9&Dn-gT9=Q-)T-IdBhap89uLFgzzE?H;KRP3MR=p)(o;(NLVmz+h+*E$j35iJJQ5DQhX-71+l~iYHmn($=!URj2{E1+l`iRe zh>u5zj(=p~kquSy&-{QQSYH1sZ!A0n$bC`Wtr4wOaYT!Ze5Y(~r$n~DmqujLsvS*YWNvhkRszt5CVMs+gw*O~e-Fzu z5-`-z#B0GB8oHx_{oZ#?oeJ#mVwn{{NS=n@<3AZ$0cR5S&3WgK_ zB>HqZ?7KP(S~lVDP6#3C5vT?d9B^Uv6#1bn#CVZhOKr}tUiTt}@`b2qV*P+dGY>tJ z2%q6|(LB&oKEyukg@IyTunh9CRW0?2DikQ%j~v~Ko@5~sqTBPdu!fuiwbm&Yxo|Ri ziiCs~naQRY;>Dd6AaWj~tV#$i%;5FiZv~m3Va`VEOWkH}R&A^=$AHK}TuQq1NJ#}l zu~sf9DS|kRy06a4{)P&e=eAA<0XoTb=R}ADH-l0}$PlQ_k|-HVE;hJPf`~|QZwj%o zC)>1IUg?XY-B0wM!*C<_d>tqDGFHjbjDN!4zEm*^ErE+lYcjv=y1n(a2VhwudMs|9 zN;=-ozfPYp-oYRPLICEoq(OySi8kuJJe(a2dcWnjeGmdfFv>CW0l22CcNO`sW}O+~#9Pav+AyW^?QzV?0yY&%RESFhVMqg;^Uv^mj6PxU2IT zH$W>hUYYwPvgxYB{pQ(JMDSXLOqyuDmr^S^ps;x07Y^Wmx2bff2b^oKv4oNVHUel> z`3~~)@W1wT6&py~(FYh;a-z)U>y*@InB0AF)2O2)8=>UQ2ff+_q@!2}p=?HqpVqNf zjpFzgu`LgP|7p0_AnE=sph_X1$~~#5HP&EjTE2tSbZGpxV(lXqN8|OsWT@pv_LCXr zwHx-3Kl&UPz?dO{oVVTJN%XkVl@3>46_cD4u$YbN z_X4eTafA1Z$o!#ubqt8p*7BsDdYmqj96aPi^QGAxIsdA1@`Js##J73Ya*FeWvgttyzE_nRuy;5hZotePE~*Wv1Y*xGMEX*IG2B@B98Iu z#lga+(FH`Ry(>VL$OT10APG`>Gly$fFzK9}8TQOztkdbCueA`#DCStV!WRG3llK?r zsh3ft(G*a2dd)NquZn6hKX|PjghVWZ;^WjJzH}@rhPV-G8g>qK;9!m{to;b*hr+-B z@?MH{XiFWzede6-c77>^23iQ;*mLaim(mvyowcr6v|Fd8>h=wl6Ey**?1bLi7%Cj} z=9XYq!=HP9EmpKar0e)e>pu|Rp?!6kda)OtjJJOi+H_PDTEq1c$-QyXLN@uVu%*(c zblFJmpqgK2I`;2~ED%DYv+~MD-SiotezqkF#S2r4{|M^<4jrIw72#1M;{5~>s>J{S zVdG{+C%F^(aF|17SS3yTItiUWy)$OvE-W2`(4ry1FOAtzUer>9mh7L3m&RMau@_oU z`z1mxwHU2Ppj2Ns%*BRf!L1;#v+oy6a+AC4_GB9gj7OwEH3fKFc(|x!0<4|l+5bb1 z(G_xT*<=5!WpLgvK)BHo{>>wZ*R*bO_tX~8R55dxNw4;IS;1jZkCjo!;yk<__B_zH zi3q?RclY-_U-8;-)^Y;Ue=0hHP^}0sDpqvS=F7*1V(Zczom2j|0a2a{yuujkr`^co zh1=o8W^;m3X)hE6Y{YIX z=cHdV2im&NowXqas05369NbgoTc3!c`*H%dMwktcfog8xgDMzdW=*KKBq2ZGeBN+ zRF}h-R6G}NV+(Q5orXv?f{0!sS(8|rU>vASPS93;s^M_OEcGqoR0?x!9Md7I5om<~ zfuigz0N{7DgCkX((LXYKcx#v$UA7RS0i_>A&ST4SB;UYpr(x(lW<0DbEEsdW7>fsY z9fQ+-G8;<&b-H=_rRE&J(x4=K*0KAbJR?U5nb&E|%U6y15flVuSs@ZH6b&pO{gQvR zdQ4V>@+_cCjQ8n1u8Ip{A=4!Ko2?48oa&y1;d8I4KD{12>G5>{j~d1wQw<8|teA8C zu4h)02C~Sa$I=)>RtiZxd!{p3bVxF`qXC=w0#$!;IY%~X+uLC3;) z7z1tKVQuz~pmUc_8j)nYbLh{!u*%`XiZs*Ww^yFY4K48Fq<6joUmO*&6yIU$wmO92 z$PEeV`?LxKxq%`jCWL|9YY|k9MAi~61R!h9achIw{SRfroPuB8k?)I)mfObLTZO{? zn^qscK}k8r&58D5KW;C{c#w30muGkSAQ1shl30sYy-2k-O0Hl&%VcGyK8omgHE0WO z8b1q!5;^OvZ7_2r*VB>z`QF_F)kV=ccdGxX$Sdv8X>koLGuPXkanfMIeADy*myLQI za$h*Qdpi^ywX^5N0+9k)@cV!1R!>qE_UC7klRbDP?(3G6T%!RE=KD3p+S4p1#b7+g z$aVl)i<}^o9`8&IfVl6}303P;e;wr4c4HQR@)p^x`&-H!sLJkmLSQ3v2o?IYgN$Cr z1dn(}$U2yFPS+=|?cJex&wgpRV#w^ilYv-~Nv;{1=$f&E;`$kGkc@eewnehmZC=-45!YrZ+;oTTeKIbgv8^y$MWaOFy7w;OC}v#QOv>82wl|)Tjf( z-<>t1Lh|y@oTFFEmT~|s{k1PbtTSHdC^)7MxgyF1q}pobY^hjSUo&{{z6=%~gH8HG z@M34g$_y__D{_u*zf6f5NmBuh&kF6|PG_pWi9Ttq=`a*zr#TmzW##PHGE8nR$_jr$ zl$wtaZK@cC?PqnmYK@<)U>9!X?B)!>npwxy4gvvly6$QUtwi|X;a^ss{QaFAI%sH* z&VdB6?1uIhlT1I?7(O{fm0{4gRs~Fz*jhRhcDW92{t~_!r1SALi~~qv$YrV4$Y3aQ z5~Il6CF9zrXoBT~f<>cNU;DqRKpC<>KcX-E2Ld6li1gQ0+xaSGv7$x`^P4H`J0$?V z$glrPw>>r^>5a?li4Lu5QswgR*ImT=Yj{u4zp`19Q>dXvbe98=8LOOik$T?c7^05i zz1$GIlI})p;_A{v?%FQ-Cd4$G8g&VDNOoe7b4YV4*QBxnZ$UoOYXt_`Eb8$3ekwlY z^G>LA;3Y}Ud=tlk*GVcfs@BSXuE1VKhnYOq%v!JH@;m;FCtY*;Yj?2x+AJdmrABvs zkZh;MtLX+OSY$@TC}t;LvkTYfXF?`NxfS^Z zS>xr1BJu;M6#AN{)3BN+mCT54LyESJMlxz+(e>V$E| zB6n_}f@ka*%@{C{JT@jS#ltg;3(C{s2fX5H*~}eU@g~rRo5zpp7Y`1^rW-C9WjJgs zbbyR_yM$va*ziros^6v0u0=|-2mD4nc-0o7ns~bif6P_Ruz@nc#%8( zZMFrb=P_ctS10NE$082g0|}h<8!jQ_@gjzDUm1!|LscDnrY8teyvd%k~4&d zja2HsSm_|@!X^qCL+^y>ROSJnlj|J&3scT7BB1p|>;vL!w~83-$Eq(qof!D3*58>n z!Z{J!L%7p$uNQ{(Zdb}!6bq0MhQeN_kz;XXgieong=QRy7)EDQ^jKCmfJIIN>?RQk zV;~EF0-^<<6dc^GqS*)O=n36uc%X^pr8ut-t;#RHN2`Ny4NWEry;e03R*jvqEsQV3 zgWDG|>KsP72Y5ID-+R-O_<#wb%g2NtG?q)*ix|5hxqFXs3te${#uxXsljj;L{f0JL z`t2ImEEGxA3@&gbw+S!!$D#y~jA>2HDQR-L#HnmdHzK7isVu-{C{ZQa`55O@qGL@k z(J>?n6C>_Mh^F>|`TNU^A|sYj`PcL3-CL6(cGTAHuz}OeD)suf9Pr-KG!92gD~n*_ z182w?5p2JN&XCHh_(vZpo6#?YI%I(mx`YZXDAZP~8s3z5Na2Lt6A@MWHw*F27G0evx=BA>#5Tb^A@;nN&jPJ=^~M@v$4Ls0>S^k zFfr1~$BchFsBXbsWFW*SMFe$tTlX9Z!Cj0+!2=r5XoA^gOtJ>wGcq`WEIbh`w(UBD z(4rY6Th#k`ihn?OcQ?;dPu=|HA1OlITdj~;$67!VQ5Zq!KQ@IyvY(1Fr^Ib2dO(TB z{L(rWf0~-2a-;od(^mYhAVk#(paqk8?d5H|$NH-Be0Hx|&LJHI!dZzt#Oo*oGP@R= zR8;RX99#tz{XvbS3h9p z2h)|2{^i6N&nSmw5Lf6u8Xsi*Er>GH$Z{;tV|U~%PB(J$kgg0mQn=(`i7SS)>k9LV zvCDo^VY5n9If7Ei)uY7K>=87IIS?X48PYhB^rPu%MWW%yzRp2vuET%vMDVh(i+#=% zSPon0(zM4k(4Ankx-#}qNO^xz$i99FeYCjS{SIiCe^S?ZlT?5Doov^MIt6tFKfHHr z3B1~F+(xOQQRu@~AGq5#j=hB67wr%w>Id=-s%PHnVB(J+v3cEQwFxw&ur4$ODtGLq z-VY9Pxg{H7LAXk!>?qcY6Qv4fF923e6M)b{u3vVwfV<#cvUjr0^PMSuTpxrr7$lu? zzj7of$545M77vi~RxDfCj(G2YqDKjXB_Dx1vnU7r>`A&)fN)*E3bI;z&^@;NbG${Q zLJ@E4^;P^k%sfId@^*Q+&$7Ji%%c<%Wq1V1aP668_~y8P1o z(Id!snoxgCp#Lx_s@gyY%~aE$Hql+2Dy6v|+f$lI@xq#;5yAWh(}%WUw?TnYt6hWe zmXmQ>f=m_2bu~e+fMGK$6i>3e$!oey1htNa6u@_mZd^c5hrb7jJ;)B!$y}61M!SmT zOqIR8A>IdrP2o@F8ah=rpIWtbXl9D!{`xUR$%d21$ZS()cs*Ar`Ty)EB0!C}_9uei z7RuVrbv{t6ex>-J%M(aDr(L|_45%j!&k!5n_+HA{(vOJ#f&6Z=LLP(gRKBfGFSTvCN^RfZC^u(!Aybb9TqDXr9gcPI>WglRYnFN`S2;)Y)(N^Fhx`PoN_bFw0;AFH_}|6lrYR14nLUiU;0&)B@Zee?t%>P8&5 zxQ#c;4QQo_)b?RSBC(Ch2=P9^iV{RF#~%YKJ@jLVW2dQK*S+hq?!BZ$jKs*6rQ~8q z!V1-%oTk9&QRZ7MmnDNkc1INKh11otutA0fo3U>l(hoUdv0VNYRa)W1)c`$`byuGG ze*Ii#=b2oBm3N*??)T;62^yIWaiWvqnd6&V_2-u~E%I9XjYIAeJ=Dvp!RoCSJ0OnW zwyzZ(c^UFd)yY)uWnFnIRvzuJW0N4ckp={4SYW9|{b20T)e<3Bi-9`41Yl3yoZeZ4 z7neiIznj4Td#8|b>;aeiC8N)l;R0Rsv$tw7c;LHdn zi;W^S*Qq`)5-Kd(gfcj)@D)gWq#9DVW^o%Z%xVn^i2HHs%_Fe$AN`>Rqo7S6VuAY^ z=q7_WHj|<ft$iY`4uGMhxKqQ}j#)!1;7(|5T4KxCMql#0 zEB51Qt+enz^IoZy9FzO80e{2owX=OYacd$^adp%(nxKUrgr^5BG>}r~yGN%ez2-@C zV3M2J)c2|pu2X7g7GB5o2OmwayWwWqINDZuo0GjxS&)0Sh?3JyKoNk<*=M1)X>ZP+ zM`uccL}q3C3neMisb`Kcaa|`*EGAxfl50Y-i;bBx77%wDjD1wyYV^%sALq4^#i2P> zzLe2Wp5WI6Ipm$tlb?zd+G~|vOVo|bENxm4eHo_Hulrf0C~b6PNZoOXejIO@7Cgs$d4kdP%rIw|=r|Fzb+7U+v5J#L@v<3hLzq&s3Ac zE^ONGHE!v-E__*qCrkJagwq%aO=*Cwq@D3RU;DUHh=0a%XJEzY_Ss6pJC0ma2iaD%!7~I z?m=784X4qNm)p^XR_AOq)a}7!dLE-u!LZ*u)|@Y$Ro@B2%tvFLF=4 z=q-*MHHbiYZot7+PF&(z$7xTpZFxHbL@!Y zx8?&`0Dj*^nvBlDbCzjBu17{F&YRLq2PXckB`f`IMzA?~=e31OEO;+Ms#aC6Vce<9 z)P+aDmwD#?0nN_`#zT2PrZQu@u`4`CMO)ePXLzbL#KmBb(AywY-X@P(;w7h1o>t4X zh-OiSS_j7MMQtRE0a?!X51Peh?G{jcjgKcChJp`v-3E?Sie?O<_&&^fY0&yx&am2s z*&$F6vqLrQu%SWJ!%@c1*sX}nn?8;ok9|uIUH3AzgZFk?@HiGhYSVh8Vh3`ej25-+ zl>3n5cB5&!B1VdvpX>*V-vPvIo;`rfL?BFBn2}KI0Dkl&Lxu2)Aaq_AwE?j@h=&S;^|URLd)pAN~qjd)%+pl*z*K5BZGCKDbm*IFY&> z#eH_|LSn$JCxlvSQ>@%WcIe7%H}UL4`Fvt!Gw$!Vu@8a9hRsSOE!q_hLD1f=|FD&1 zB=KSF1yILC(c2cL3R&Vx0ML=uc)gBXdID{Y>>}PUtx#%zv1A zgsAm1sC9nB$-L#;F$DP-LUg%TdwV!e?67=II5#h^UN1;bql3c~LIE~Gz_jmiTAx6_ zXLDB?KZ+M1(9CHd(yBUdcQ9;gh0+q6X&R%^-lEgD7>SHU3;^Ls1rcfB(--5kaG(U0N{`c@&no5c5sMM3nZshYVz!n!mMD~l4haop0w(DoLO zy=5x0bff|<$P0eoF{)@a<9D&p@}a=H(A)DU{_Cp8bz*gCvFpX$#5)K)uNwaCf7Vy6 z|6CX~x~|KNbcWu*07f(Zq2@+5LyN;HSFGE%)9_CFj%U=(%Ku3W&kNO!5@}con{$kG z;gOeBZD62wW`HW7NBt3ZMp}l>pp&@1Z6+-JrsCnp+j~;N0C6&{Qi6_ei}!y+wN9an zA?g2DP~vDQQfY$$qDB{}e8b237W_H@H?v0vU5a2!qS2fVTFm!x7;u7tI`up(S5bp_ z#R*Fr(sOAGRzwvAVzfIvAQ|R1wJ;#YklC?LtOJjI-nI7d&rBju?8K9=eu^xAEXAz#ZD9nWR>Ykma#B+SAeXV5P9FQtgAx`dd{J#cQV_cqXmqLd?-Tp*YXVJ_fx*KQK6w5l2sCdzSkX!iZ1 z51AhOj9~`k{0>twUUgxfU<>iUnjMun8rCE@Vhtklu4-NfGGPz$cS1-HcR`50v!$L1 z`^1yvT!UPZr|i&LM1=bUq9Nh@#V^_c($JAv?wz=S0nqk)jOd<$kWHNruw6s&jS3=jwYQUx(>re6sid)xr+NKjH?okJ4B9wy|Z{WKdhlTQO8jZjHX#1q-$j=XQUFC-mT8@I@85maDGko%oO{`fBL7>c1U!$V4ZCX+M2)AI) z*n*&83hAp)pJnpzMxY&ZnU<^ExgJua0r*E!w!X*gADszk1(VvhuwB##-d9C@{;Ce5^4?H-7_#UcduN#sU*}0ly~0?Tf!d_&>`P( z!oJZgpF|(I2E8O)Cn&NaU9MjtKvdO~E`EKAR_Uz*(JH?Z^hY+t%?2wBb*aYGy5#fIC+V(B27(=RL>VSLN8sn|_&Vl{Q+66Ji zE(wgCXN~x%m@#7pLPW4DJkq4y^G!Cl)IRQg&R*jvHtKGL^&;Bm>wtd^rltf z&sAG@*6NDEE6gC=YEopre$;yG{K0!_u=%mshJ`3lg%&NMndbVc%w<+)aaliF0zECc)!u`O_wL850oq0O4BJz6AMrMZe-S({6QGJ z-K9IEKYmjSvbi#{KzscA+-BJ$@d7B(VCg`Cemve)1G~cpr#H@g@IPXvQe+D!%#hHm zIuBjoM*~Ra2oWlb{OE(;@9<*ru!-yQIWb2~grpeYB4qX84|i-9>Ox$o(Jgi17q3ym z_c`E#nl6MD)5$Qs9q~K|R5Jp}xG>Ep`lGD_0)J;hg(SMY_jN99hJ8Ih>Zr2&)f!}m zZAl_edj+I1p!~jl8ivB&5~xFc$7g5EFr0XYmylzH=N-$m3&?1lb6{aFPeMU1lBEz2 zOOhcDAEh~Anyt$s?Mw~oS3yuuCt~w2DR)M-gsKZSWKLMy(@tdC1a$Yl zZfKE2Q+)}+R29${^V7ZVD}HkZ%|hB2*O3ikQCSJKej&{$!Ht4GtoOdSG2z=kmyZ}W zg1qur-oILq-qZ6xYZg^QV*9FoRf@S2O3Xi3@Ej5uLu}AR14wX^a~klgRG0h_l{sV% z)$64)AAptK?n=geb@a2yg3Q+mjwVSM0$Kex0s)-(cdSFR?;(Lk9yW3146h+!goo&n z2{YA|9;zlp7j$l8n!$6X{@kX59jr4!3F8kyU%VMj+t^Fx6%PU>?{Pme6DjWoyQBA= ze?7vbFXf5s6^pl=ElPaLj^sXP^n5oR8~bNzt69?nPZ9FphO%*rhs{_;;Lm$J zSdi~)F02h0`x$M{(lEx<_5W08RcpCWJ?Bb!GzW&f1uyAX(7cNE)I!6Vb~!dhbtCUg z3VedS5opkMaw%vud~ACn9h}*9hosfR1GHan0 z`L`3p4gEa@a$T$y{J4j=g)>-$zB*p(UVI6UZDnw}dsZ(7@72%FCGeK@)d*E%2~ykk zUrP6Xs}F7gn&NBz13uje*RnO7h33-Q=X}+VhGC-DIxk{*Wn8u_`BMulwligCaXNSi z&Pw-Moe);Nyt4DpiO3ACv*qytpjIbG>4l&7)$7*oe?tw(DcgmfbDyS7Vk<%nT0JR&Qbn3noZ^VUj#Q|TJji!B ziZQImd`g3C`IjAg)yhT`kZlw*Lj0KgPoz|JG3O#&v)t6xfq4$p}j>u0*GDu1=bqK+_^5FDqV#k+R zB3dPj!JE^UZ^H@1m1og4I&Q6WOOo$ad|gISN!=~4!p_`@ z1m0E$(UdmLj4g$h;j6KO6-D7eIIH_ifkV|on-0~5eWYY0NE8`{@cu-JKO6JZLYw5u zxior=qnqNjuI*8>=!Z#Z%_k1Gc)l390qB7LfvMqX0TvPYm# zuP(8wohGVVawG`!$1p4vWl6MZy2G+;AK@VjzXUz)cq*eB#Lebnsid2Z3xIVUNN!3)+#?oZ#7N-YbEw<*V4COja4c*>`g!guggC67lUE>8*p&W$t) zAhjfjo15i=&kX;z^-2teiT1%>_H_YVu+MaTNh?b zZ)mR^R=U>l>Q<3(`5%a19~RN8jaR{|v(45U32~lxa8@u!g*djG*!7-ukSI!M)*s}^ zUGeF~Jw9_@Jdd8#rvT~o1xl5EK)iAnAN$EhnGkA#FvtM3A@)-smpTK_9z&q>#4jBt zjkcAE&v>~&`1A%JeewVJgZz=k-OiRwYfmuk2C8dCW~8O3Mm;Tc-;7v+oJ4j>h|-N7 zT5}mT!3>_U_9ugRG!{OmX_j_E@3bZrQawSua$4 z$BD>XFhsp(mDDJ#Mn-sbG-1RT$l6760wqW$$6D!5 zAN>_b?J15vu66=>VmrgJMjH%NHv_Y8(IUy%Fi$y+ltlFT!`#WDlA)-d`zUV+1irOr zfsEYFPN-WJqfU9hK>alxz5N!@fC#KLB}E5RL$WF@nmgI(=WorTy)7oxs$|Bng58C< zH#bxrzAZlVVC1sHJd#oa;w46_+`uC2E>!4#wub&4c74J{+X?r{$~FvdQH3og-Z2Nz zJZx<$O~hAn*2-)U14LXHreKaSOsWr}Y)pBB8u~k~^UQh$K(q^@M3aa=HVj^%&Uv^E zENrB6Ad^aRdvTBR4bpdROHPNE=)v=+6oRlWkD#^EvX|t}XgL4!%=zxDG)cH0k<_U- z`1-$_Lnn{j6{#g&sr=^hP}J0FdD1e+^g-m-R^g|O>9KYa?1}|K;F|5o(k5PRtnHz} zCABe)Vxjte7?`^iaswHQZMHU6(@FBByBNSUd?VmN)%OiH;xb0fslh>0ncXPa9{qG4 zK(@p&8Q92?t?bE-?!#S&!dI z=khCOvP(+AmPm=?rOG7&1ryRm5_cQp9V1Q@7!hK#TGT?ib`7xa?%MIQ+Kpil?UYYO zmG#?p{`&4wt|#!Kc?a@)Ppe-81N@u=3AH$HjA{q_YU@&Gea_~@x=)5n(|V#7Q{kNJ zDsEKzIlgJIREGvIY_$tRQ)hcgw`VzH03o?|Qdd*@PRg=^b%0#uN1YV+-`hmN7d8Y< zIKq2F_4V`TT^DA*b)Uyzkb=7=Q5d?gOQbk-=@d31lTM85$47OCGNmdiR}eh(JM6sR zH|G$*;CGsikXi`bG7X3H0qrqCdaT(!oVEz|$O`6OBanII>(MnRL@a)L+g{#R&OoR9 zD`}Zq!R@Z2l>zD9x54}F{+a(=159Sh$d~<@s2E+A{p$-oltxoH7`4nd9v^2x9d8Hp z{{SWXC}z_lDpuKLSCu}%-)heeuAH2M(H3!jHjgYsT5bbR;Khr})Bc0evn`E`A=WHUWp@ZRTn}VGw}yu* zGJ3dP`>Y090?KeiQNL0Jm94)4PN&XnU)ht_Y$}G1mAov4vBd@6fxPa8%~QYixRKEN zBY0nb86hCdqP71mTF#aj<4yJT-{`M9-cj1vHo!RO{JsAF>W4xuz+Dlw@ZMOwUw}ZH z;;pkJzCpK+f2=PnW6ZU-Tprff7%a864D;L(t^F1JJa@*28^Mke7^63>3 zE#`I|fvZ5sAb@=iE}yadtqc8=Wj3Qiv7H`>2+}@)$_K&*rWs3n*U@boS!7<7(P5%# zJDd<1w~?mppaJaDe8q`OUb1J2XE~VU+eLFF%wH^2dKg`yHlHss_DWx>rFrN_~{0mS1c$7BEb*o}$eioHm>LKVYdo%^NY@>_*Rk3@R74vaBS6Z8Aq0%NHvu5(F! z)H7oluF*o}?5vgh%WL=Y88p|Mq5rv{!)LXlnSGxd1=UHy)zn-Zs@ z`KM>zNZ4&{FONT8I$%2mAHf+_1&XASvxW->GW>GDoMrb+m=5MLal@2=a+e`vhoWN) z_iYHc+Jk@t2%@%@zZ*=3!XC10{ZCKJRT|vYt z(@QY>6Gj0skYH+yO&oY;pGxs7!Ob@B%q)lP^PS?fcXW)q1~S7lE+V*lO8;*((G zv~1o5y_}bOGisF9neLS#CN9}?nJI^XL7iWXi&o-tule$8LAC)+oSs#k)iL`rX_dfg zB8`*mSs&?6Bn)TS*EnKmn2PLkgL`NgSgdsUXf0szdd44h`M{8prN#5a?0+|v2!hf3 z4k9lFdjPa=vkIgH@cS4wLF?Bm5TkL zBD|OkuUWDX{oIh5W;554NNVes6P)>SL^9mj&Z`K^2t#t*!H0+|W8TRtdb#dxN~_-* zoW;4|zXV1`4x}8R7f!#b?6Bt_|LCcfe?#&NU&%MZ;-eSq8%|iL&ompl6oN$&dGYJq zI!+kUk7Ql{@M-|xR(A+!qmZ8kA)T;LiDkAte#)#fL0eh@QoBN+GQ(0|%P}Lmh~E`# z;$TrIeF^%EAu!Fo)V4y#^0+zE3l~RX97c?rqr^j;(G1)FeRY+nY?rDWba4>}hM^+r zi?&IHS?*d_B6$}!yZiLSo#*7qor-Pwdf;!`Y(`^f9-#UZOdn3CAWDm#X1=aUg%**5 zVHpn4m{9ciLQMYLl)+c(qoZFzdA^43u>{@QW(@=raXC67rFMKwt3w`_SvhOiey?V$ z;ha)l6tk=Fwv4K&*aT~O(BJueJuAIDvmq<+;>wJu;q~|E+qHnS*ZLw^uHjrXaQg;sgRttfh6o#x=dE!EzApo{4MQHabyW6Y)@7v=c>Ci(mHy0FhGP3g(I1 zEkf|9DgyAa`CL#MJznsC0Q5E03DVV|R`?GrY_S$DQ2@KX{(uD{#I@^29XQwty?_#~oz?y43*{|t-zy8MmL2%(|fHU|n5Qgx0BVWREQ z8Pkv&f*^d5G!%5FR|dqI@9<&55@_Fi+bB#>f*MBv2C4=HZ~=~Ke-i}{NX;U3(=Yo3 ze}bSdvez6t52V4#cRPNzvPa{?AiYp9AHbvM$z++~Yx9V1!JUIozrm$;cmAi~w=Qau z>1R#VI$BIPTzO?KbzDPwC(J!_TSA|z$g+vFi3!fJ-Ba-Oggz8W0EkR#HTw&6vt~uk zcm|(vIJ9X9dwq}iDLqM0^s9)|G zG9#taJ>t-90Sy~(^rDt-t|xUo7VKPua2xV3u~i?U%J{>8L6rKL?YuT7hd4%8q-xri zfvabm@`dmAXVP?F?{guRN@GQh`r5u;Mq<-lA*o=8W2Ctdm?W~` z5$Pq84%;4^Rsh~rR@+__7yAhO{>hTmaiJ5KCUME*puCG^KRH00g&fO4nf{4oQiEeD zYm;#0r4=%*lIA@miv?4gNQa*hq3=v;aJKs5zXW$m74A4-y{16t2~+W<6yaInevqhT zbTo}@$*B1+ja|eGB6gh0-+#kRv5Dg_l<#}WS1Fc(zQgo2jl>3G?ZdWPbbU?=+_3>Q z5V^>f8n^%0(rl3d_QZ7c3H$ltI4^dcN~WXT2aa_SwhDNgVZGz$oqB9Tkv+W|sSSMY zrl{=nB{WuKVBbX{uQGdu$5@YKuwNTCwV?O%RP61Dvl`D9(NG1PxKz{LGSg+@)hDSg zV49!VZA;5!7IHx|LEhOC&M<%KL=`XhU< zgtX|V(hDffF3azvxaalS9d{oXyiqC{vgWjNOmbzIj1%9>wS}c0yHkSd5UZuN6aBYN zR}!4QWDa04_b2jT>Q(mn@r^YWLybz0H z$)}Xp;0~CU>xTSMdpUpXEU*!Z$>@TgPyvYm`x;6fLf=b^-KE>n^GJrQ!7RET#%2jX zQE||M)fyhEej((wiP=XCZIHqMBSONl6;NNmq+qS!hHE!^B}q$gc0yeuEdW7GlW=!w z!S_E2rky*$cIO3VdS%qzYH@5LWLsp^q#kJsNff(rvV)cD-blXV?qEn8J=F22$kjOH zQUAwm&6zKEN+*s%_|B0zU1)SW5e((a=QIwWqpe!od^dp`L=(mHkDWTJm;<`(d4Z?~ z66(V3bosEO#?J|5(uJUa46=6fyhY?Zl#KM2Be2J%D&aRy!aa{?heUCA95w>b^h7OG zr<`vxxVNkCisfFWtcB)@ys6Z%=b+A3m{v_rVp*zRl(#XI+)nwMvO(h>qIGBAVZYw* zOUmyES#29-`&EG6r>xrq#SQQSPqQ3FjO!8koQsNUdpP>>=6CHVh?azXvwWF6)zK__ zHyviy07%2mYYhCZr$aOhajGby!!r3Qa$w7&vVD^d2Z1^(-GIyJ3 ziF92AhnD;VC4p1YayVCnF~piMb2W-3>X%nD>T}YR8jCgPgIxTvein^TB}to&>)^Ay z6fZmJMMQBHrT(pOIJlz|;1xMB^aViu7Med8cHMyOzl1dbA6nM1k2Oggu+54dR{Xi2nwa=fpov|#^SHhaZJQJL0?X)h#$J)zl{>Qr2bTW zlQv(*%dp~4B2)QSfy7R&sLl|lZXbom*}BTs=~IK{Mq=mel9ATixq1RXh^iCX_wT1b zLiA?L@pU+tJh4oix6D|&dC!fRsi&X9R&52z*8$;T=mu*#E9;^z6k5<6Z}AgYhE^c_ z&)hM{GSIi%joy0A`X$2BK4)uxlp5657t666SoJNN&dukXGMPi9=Sojt7xC9b$tWhr zNWd!CQGwfq`D9+Pw>X}H$p~oMm-EilkP!ENZgug)8a(Fv@Qb=Lq(m-Tlmc(fn+24~ zLz3Y;ngY8^o#h$zeH_x01~yEy;ql z-K{?5z-B2kb9Zcxy2$_>0Zdb(r}1WM{8bJolCHI>))#BnDSMMg7w^@`dB{bG)M9la zydvr9(nt)g=0xCdp_>;2SS>itnLd>)Asc5__|NONbRjX^ViUR2YV^M%g*?2`6IUTM z63Z>1hI~NG%S(+;e-lZPWg8|z=lb51a~Iwk%&p@;>nDI6$e|?;^Z>$gD;pU!r=3+= zOnShaBBxEWbwcp$I7Bdy0+^3~y|<}ftsnMV>lE5+pj14rGT|sJsde|ZCrJT@P895v zo}CB2{tg_~iEO>d?S8wvze8u}XPA94MVZ%ux5Gv%6bS!IW*Cb%;M4i%QWqSWtkNYY(HwS@~i$#pipvB>`TnQodezYo2h@;gga%g|CZl=9q<^3n*#m z0KTZQW{i8;t+1yDyP7JGkK^C|ptU#swI-16DG@jz?d!=x10g5e5?@H=mzbnvouPNCHV{2V()oc z!wB?LZOK9XC3=~gJ&%*QO{?h+Smc>2Qyk58d>~&i6b_qQ_(1S7K`>^pqyzcyD4p9Q z2h?&Yz6HG5aP(LRA(f^P;PH9hxz85_D@D8;;h!-ous?KqQC%OVBeeHpCgIu~t;B-3 zwfT&pD00Ml6S~CsO{8|h&Cu^&mA$Dss|8K50lIh0vou>-iK$n;Q>Uza=UuYvU7|(O zGh1Y;P09cOVq;VdQ+JS~4$Ob1W$ryibmvCoA&|v%WkZH!TueX`1~USy>uruj^Du}Wi=JY}|A|?#eTBqarJ6a&W&^+;UF$dc3XrbIn^A{vnW9_M$6;c{ zr0Y6QA_Ww%atC5ea8K%7mCi`D~ z3@X5HOPnI3!j}4I}%B@BIi2V&oJan~6Ks&;YBCr6r z+Tws19CO?8l@}RCO?Tw=DEm33D|Iuo->$({`E_QhP4;_X15b@Dzv=tk13L#lP)Xth z)&dn{mqlJ{M^F1M&sKyOSL6{cF|mq>?e@&B2>MLcXt@u}NN;eSw3*|Poy5p@1OaMA zn&ZJo$GFw(oN~P}cxsSEXH@XI%LQYC@-IY%CW!eL|Cot}`Xt=cB#IsdtsiZu0;Be6 zxNb^G!-eaU#QG}wdQE75krf8P`C|`H)p6)d@UmiivvXaf``GvTyQ@h77IO?YyBwhv z*f%>kDP4_>!@j~+Km>X25-0iBTl7-_AYn%bQpK?g`BHLl$R!nAm$hVk0%hgT#i@*9 z*hl37=wjN{V{uD_=W)d^$-lfWE5NWvUg7nM1LjfAPXv9o2i^;k4~yf>ySGO8Q87(* zUIui;d1{0vC8BM`vbusiC2@!zH0imR~9^u6zU4b-~~*I6bShWx)AGiVV;qeVs-&87XXI+* z4uEuo_HZENH_VMR3Gg#ytt$J-e!?Fx9nrp4hD>EkzD*zSU=51O8a*VYota^o3?=M` z{9*9cbI=6E`s`@4s%J$hw#NiV&k&#P@)P`VSV&stFUD`)c>}F*_%FXHJ5wtguCrfE z|Lnf&Q#Phl+S;lYn5_SPaZ^p1(&&}p@>R9LL+2@Z1B8m$GV4tZXRe>Z@6@k|M~3UemnSu91V7oCE=s{uDzLWRpTNJUChV<|jqxjo*o8o~m} z8?C!69s?H;w)T>wanxb0H%MRK<=^`R=}<7AD=)_qP#p2wMWwBg3#X0Zx?VWc7Yy3` zM+0WxI*rl{5ttElL(5FiGITWiU~R5ptT}IZz=_-a-Nl5&#O!@;Akxskh-We>;=Vnxw0Uj75hstl7!A zmu_(t@|j=Q$B{#krSPP>152#MC)0>kYH0z7${<+D60q;A1nsrD()x6svi=#vAvgaK zThuXBp>Vvn^E0G0W~DYL0#3S5rb6e#ZI!ThE$cm~C%OtYzgf|YWa^H5h9G8fOtDKO z{7i>e;H2bg9bQVxwsvN#;{fSo({68LBFSgiS;#Q-sV@vS?BJ0i8O7?*N@a13Zq1ehKRfCyLwrv5=ot`y_#S)8Lm$B z76-W5g?dfO-;@O{8E7~!wI6MFN{GKuMm|Uyrs5~t=p`okYgKG-UM^ZA(+0J|l-6Hc z4c<%uU`0wte!f#8Yww6Y_996D*44nooX{A0ZswC0NEVq;vw9@@#-S5CA}nmi=kK#m zSp~zSLanwu7q2EuINGisw~tN*t#JoR#4L+>6tK57@mU6NAy}CgNH53ts6Qm~+mi&8 z^@iC)M?YME4)%P^8O8AEJ1Q4(ir))HQN7C@hAxyjoM`(%5q!0&$7sUTB9m8`s zgp{gAI%c(FRcZ*F)Ab3_88JOxpIr&tQ4#gHVhnUDU%tRo!LuX-CA_Fs*dvL91y;vydrKj2sC+@M!7)GB&e>)zdL7` z?>gunXa;#{Fdo>tCpmZc$b8v|!UpH@OaU_&5J&af&q9|c`Kbg@D@M6<3?G;qPCIZD zeZ2o?WG8WxrlIK>*(n{~VzwY&r?AH)#80b1-j5tLz?|vf5~80oo_H0vv&V7?0R-SS znrQ2H!&&ls0VoT9f5EzhdMxpqwwykcx^l{%zuz9g5t_13uIR=wmxTj%7)@jC@&vsVhx+n5N9) z9{f3Tt}*D8NUfnJrZw36=4R`VfhaT+8@Q70Iq2BU#f5qurT+zW#GH|rk9P@v6686r zGJ1UE$RG3^H@#Urv|_6n$d+B{V(to_YcMe@r-^#fxxsRZh0Y4hb2x}`J|$my8m|!< z{q>&sjsdhrtcl`7D$%Flc{Hml`1s3|;MEzPg;0`9HI%h^xl9O|)mMcw*K})VQy9s` z+}XuROk1y+1W^PS!9_~N0Dn_GJ3yT&ml4#tmxvjvw1WYFS}DbWui$Xvg87Jc_}ZG9 zS?ULm(+1?|x76F9OBL>u#0=@RGaar)H|lqN7OUGNRumY9QF`O!rhSdRR#as2A-pq-p~+U8mGfd@a4wj zQ^9caE1$=lv}9v=F{0BmG;e)XpAHh`wn`@kQPv#xB;9$ZOIYf@LcWz5#IvByh-%|h za^THjW<}4MPrM&2vy3F1=@@MmDgsGJP1Z9HDJtkFB*V;St)}bzyM;&@`Liv{WOU8N&OQf%fy(AC82!_OO zAMxd1Zf^(H7}Z}q9hhh&^*PpAH!>&|J){pNTXR(%{{>{(^msf@?GT;%`zGyz{P@Lt zSeqVnzYX~2t1gSqwt;Eh9vBBB<#VBKs8|RxI4Zh#s*ia^BvP$eUGS3o_6eycX+5Ei zuIz|=Zh7Qn&K`cRz>+ZM`E8ox5&$&Fi``6XaFd-Xxu02y&>M+Rw0}WKn_!rf+vd z0kz49M5*-+q56IvYF!tEJrgqY@Xklp-?Gsps%KbB(-$QQ z>lU&;66|t52^n}ZvJnXkZ=@tob9$^UF2T-954F#$-JX`>n6N+3{1c^PXH-7a*=9y> zgAe*UbvFnwu9}p;?ihp|(^nW-+05ud{-M+aY4R8rEr6vFquL<47J_bdacFe=8StFV z$df`y3(D>+Noysm}kWd!!MB9q?caLP74re9a<5*~66{8olTMp9$Yt zg3(B~JR@?`qZkmuPd;GFfEyYDU%r}eP z5x(`YgL@Wtg%N;SC4=)``mP6Er@fP2$oG?_>e*OeKon^3DC^FZ5c&h8#eVzy4}1A( z1H-Xs9}4#3YetmZW+OT>73rTRtSBsCjy!tm}$1(e13HuKpI?sRIrkbt7gY`FTG3x6mXy7qO=TX~dkyYlx-LwFiqnlg7Ra z59Do+gA(n~)T!7O>Q(ZueF_gh*;kM%#KWR2%-O=>h@GJGbwS@v%EtahUfZ$VW82%l z2?W9#Sebpp;-BOP!2IV>$ab$5TPp{O^ZrU~Tsg_Ee$UDOeTuYmr|Yah8n)~n8q*M2 zOpoY_vNT)K+?aHdf;YTAtSQVSb;qhzf+CUmRdz*G(m5EX0Pi5>Ftq-x68$Umz@Yny z_@YKq?;>rH5#}MbQ{Vex&Pn+;Z)58LbzyKnhjW-H4Bp>XC_{0iD=KLgCiWF0lsq9p zNB`$AloE@D?!v>-Qt;oa6N2~ zNwWv8;0;R>=5i=Ae~aFF+%Ab_iGQ2NFo|H0BW1Ss7F{GCz__9!^g9Llcc`;W$BS_=1bPgx;#5p@Pr7speI|BTGgi zb*dFkx~&q?Bk>ajkYcj_-2x>^bjhUt13OMRi;%oYFz;oPF+!iUo36Ht>qug|^3akt zblO0r_bV7+jaWCZeSOhBKWQG{7@G>J{Rzn09lY6Z2bLhy66FAw+9H4Fmij~RL<*R& zq&)tg&$kbt=Kp(9;$C#{p|-Ev24QZ|J;Y6pGdmd8B5D!B;x>tXXW(GlRsiP7^iyP2y)PV9xqgyHvEaw?!~&15dj!RZSRnH z*Pr=kaim8}S~xTE6h-8rw1=NB)@7OWa&f%JqS0#OMLyJkj^-Il@EYp}gfPS)x&b=d_62Q5wL?r*78-~apI8Lxs zX{gIej=FQ#DyhjtbP-O?(<|vTahR^TGo>m=kJt!gl#4Eh2*oc&h|js1W1Th(__hsw z9kP2cg_%0IKLw_ovY1+V{>uN)=}g9LR*%J9mhBEQU*obc1Nw5%kCkCHH(SvM5 zbY2SvVfqB>CcpKtZ0XwE$y_b7!J;R9!`a$e3RwJ7CXSShAZbF|Uqf6kUfHO_shu7tc3l z4shZ&@ZbU)HfVbVOoNxma-Tux5KQxWS>V4Xnyi#Lu_~B9%tm6Cv}Ho2vVn#7mO|z= zrZYTih_$jbSCaLI8H_ZyO}q)h_!c$pF&kjyhm#QnRabe>$X44*uEnG4wrW!n!2pB{ zP}Ik`uCpcj?1B>ev8IFjv;o+ZW1}J-wgdCAYb9F_?wX{~w;Y2mMRy`vLO()ss94%xl3OvR51oy^**iIFw1AunI|ZFLt@EZq z#hM500!yo|Ju^Kg!)ZzB!L8q!lGl5dHUDSHX(0PT@kpE8e0C?V2wMrLTuc9Cn zn)_3vRA;6>ea$v1g+rz=z6KInt02Icq{=A5?5#mu_T#$w36pxq1bwmuXcBc#4k`#+ z8aUFX#hA*K>;xo`z^-j%p?_I*1QrTWjFETLL071xSo1(oBe3b7hu!> zsU@_Vg_@gUO+9f-Z}b&7Ypq*+NJ@&{nEvjTmN6^grWzd3dklSzDenkR?%P!A=BqK8 z?qBDL-#p3ljGwng~$ z<*c|Nw|~B>x{6ez^`j|4(Q9Se7I()=QtKf3E1D{G(fktbS=1l%U=i}2`)A7ftWb8T zGRBkj|ATkjOV@O>#24e~Vnr5}b#<_C@tM{y%1mZwLrOqA)J$b+E-n}|#s1~_m$xT7 z2n_McR$=zOs-_f0Mi!rwpx^KdbB~^JJ_67?#&5YPKX8py?vIiN5_%#Y({C+GKxTRC zUo%w8Jue7N24A8%@#k z4}_60or5j$-^tr#nW#;1+TUahR~RuEp<}FkGm6x{o`e`E94Do5&T$d`AnoTXw>B{A z-nw!#w1$Nt7OAf7Z9V+KJvdrE*u0Rwz&gTM7s@-{r=SY z)rDW7d!U5;&O?>9XIL{qG80p6kJD%UNe*ee4|xgHq3cU+vV8}=>(S`IgP*11cVV%$gG0)bTID2Q=ThHwfT=}7sn5hUNZJayDrKnT(FtDXL zAPooG{89};0U@}juZv0NLZt}lZz!TXU3oWhf_1>z!n;R_`qF6T9SdHrhf<<+fJR}@Pou<(=Bm=ip%4H z#mOn_&%+1MptV}2`lPc|p;i8%rxsZvDaa@Fs$ijgJ?7ZC*hA_k)tI4VO%Oc_+JWG6 zLI5x2krziYx83|RzTuQb}ds{HKi&BA!Je|XLWlG#omR%HK@*#IxO4miD~3QIGp z#22-;l~7Dpwq4ZDbJpLTjeVvoc^BMZ)y2$n!009Du4g zxejI+$6$cOjlBPB2WF11t$o5hvqJmvN0zbpJ9q7rItRj!fOyeQE%-&skbY^g=@sOM zNSuGJ`WYlpLwd|gnOJq9ozUx|X>oTYxfr#bzcs^Q3m)SXZ5m?}A0TfuglJV%o|$}Pm_ko^CghQPZ}PWG`UN364YK{2zI$20A$Yp7zQ zu<7qX=qu-78F6ZqZX2+b*Kng0o2)%%1a#uZW0qWyd&{3d?ggt^hx`5B%<)7n*(}~9 z2vPPhV3uVj$9xhRM09|Pq5URgM8k!t?m-9v9;lDR(A=x=fH3WbGSQmDie%^#E7Mt+ zgZquX#yg*t4a>xJ&;u9wJ~pAQ66I&C+Lq`1^au=#w0JS#CVL&7>+c#C073AX#|2RZ zFtqQ=S5gHWao?7~NkU`h6Us|oZ4}!9h>NtI@wwDjx=iDGPmr0QK!D${L-e6#sy{GKHXf&-{4&B>h?^A7uD%Vh7#R+e_ z91#>e7Sv97UgS8&>%WD%|fsZgj2y#f-9Jt`K1)>MguCZ`2zi5hI zB_Gy-!~Fd1Q@iGB9E*Q}ZUi4`!cc~4O=UgZ!<A}dd0PPUnrqJ;=CW4- zwY#`oQqotUb0PnGAVgn;oM0+8=yaui0r6a#*u6oK11^b{DE09=f9E8jgtTPEpx{sL zrG=_dCzL`o^tK)*NqPDbxh2hXQ<713T;?vbf8K8@vBpD@y5%7iL7R zKB7%_6=uW~0*zDIAhis|!iwY)8czS9f1DJOHOD_@Pur%d3OZ+%l!X!jZW8!*noceR z%U3Y&9OLl(9BlQE3^}=kF2T?8*~fB!sH+T}K{*C}K2+v)($R4-6Y%wik&-VXH8OI( zBhwv%=?jDv4DcAeNkXb6pay@_(gd>BO{oCf?ukjwAtNhZ+d9Ijc7Q}pKE?+;BCr){u!p63Set zH3ws1^r0$KkQ`DWg%Lu5Uu0VctH6%wjZlJdr7jq_j&KA3qP-Gb7q&6T2JGUfhzsPYH@n9uT-pUuu z%G-U+{2bRz+Fpx`rav%($-8-fot=c5hnevJua_Fr#z5Wkff)iA$ZGkNHwDcM?n+8*;2|OY((AET?4a!kPs=b#L`N?hP3ikdl|WRXyA(ifr{d z5=#it5=7RD^Br(BR~AQ%Y_H?4`<8becx-9sh@!ak5{Pu79cCdHW5}AEtxRK6icW6! z*%eS%hky-#cq(vNMqZ!vD>{XvT>;I#sjzj4)hys^Xw>K64d^&Z+fa7zw$Z0Va2^$c zE#mK#zHRy@yM{H8Mv`R0yoXil_sr)cX4OI5pe{}V>KXFd&IoUoXnP9u2AFI#8 zmGlIiNmc-WBBdPa@+E4>U@mI*6y&Lz5E)j&@~^Hz1<(uKvPsRAEGASs#=g)s>Oc+L z>Yv<8c%{66dlvN!CEbhQH(=`9_2%orq?N0ShooO{zE}xh82D`;=O6stX>5`N!P# ze!ZVnVqd9&7#*0cE zzL=Q@w8vKOd^OnN9LFI4(~x8!eg^=js~F7GIf|_M`B0lvwnfDNDAXtr(u|jkmM|?- ztohx$NHjD@p`l7fX|>K=z&a-DDg$2cb6<#&o{=alKr@SR~oAtf~rR_yS|TQOO% zku$uH0OAZ!beNVTcBr9w-w_!4o={Y#7h{{g3g=8A@vUh2)TY>FQ(kV0DFd_Mo~udp z&&^3ku;DCp{e4l$MhS2_yPqlgp(l^PwcmL6mRYx9SozpQk640+hv#+^!$eI;Ipy_Z z$lIO03cO0>cu+Okz(5?d-}@P)nPvFvm_9taQF7fDG7DPYL3Ju3}bZU_Z@6+J);wlS z@c@$RCKCWdK)k=df+$cSE=M7y;mukSqUAF7{8cn8@%LD`0t`rnZn01IEhh$1fI84X zp$smq86FiJh3A&F+HtiRdBw>Hwm7I1jo~XrId;Mrx}dFyePK+T;1~XmitPQf(Yzn) zge4WOSPbH|e@^rwu>o>tnTq!&riFM6V&a4tvk_wSJjWL2QQ?v&OWBo+|H)P*uFpo( zSNA1p^N?8z$4!@SvrLZ8fR4o{_{SSc7KWl@%^W#)VB^wBw=q~;v zfuaxYrg5ZnqYBCi!1-4El@w~rtc%>j1>*|2Yp%bV1ILp~q+%PPujOfxZSGoRyDR7V zW2LhtL%djorbAlq>$`c6zTEZPT@n!s&RNnvxDxPc0i~qjD7#79;uxGDip{y{B47#n zO#fg9={+jeLXU)1+AfM6tzL<7ftD%Ve>~d^K21e90ah-(+?-iK$r}XWT#wFY%k!lI z-B4>kD1wJ`UwXxPYbO|jJ=@30s$GPR$MAok=N;#={?hOZ(M60I>NF*{{kH1bv`P(Uxm%ziCTe*BzQ)vydwNu1)@cChOF+Q z1rkrtL-L()2m}Ez{%gxCCiZ5Jf#8lf9_6J<>yS_mJeQK0Yepjri}>bWX4N!KiqFjs z`@K0}f&kxD=Hwhq*5G{#Oi5{q>#JO4ygWlry=0!O(rRZ3z26|hDa7%J{XUf`b)NOO zz|R)kSDQxZbCZmgMaGIJuq*>g-e<&Lox*6>hF5f@z(!&XPiIN!V_Y?j!a)?T0I1uG z+%KVRc9XQa{B}{73yH&wk-}MRFHq#U~<`O6{q;O~g}I zk4NmxGX{cL8ywyUDDpJ=g_u1}^j98(X#OFqz#1m5&(Ic87;ZQ^L5JNP+wD|wAi)}C zV}i?=AG?$g*ln6|JMV1(yximV9p}9htKYgdr95{S=TUq?gAX#sW$92<`+LNz0u~d% zwHleuMGlRd!6}0^KNR>)#IKNgeIDRxO0XtGRI^AK-DH21pNx?+#>;87jQPkL&~Gn>R8vRnxQS|22H z^8E-ClsLp>DDR)S5(M)QBe@J!y5#fb9{5ScYyn7IxrH+W&_O|60N!~L+0B4nuVAp=4AV|=TE*yyw zO3jT5GF-te9g}(G9$|U0VnB(mtIiQa%Uq=dFQ>46a?|zUY5%DLY8L|QV%nPYlNCax zVr8|Dm=YA=`G}IELh(no*GBW(x+`lOTmD9xzhVw+d0dwK=kqP#M++au1|;>>*IJ2^_4R)R<|$mpl$iAARyt)&LqBfMYQhB`3U>Y z(%5iBZ4YxgXQvb%ii474QKqebQ$sTXJjI#9y6Akm4L()qx?(5lxm_OV32WgYDQ_Jb z!p4|-*PWOZvK(;)iXjt z$KS8p8&%4Mb;HSNAKO;(_W2(g&Br-*d1KJ))cY#&FslO6xdvt9Wi(R@{Y$RFWx5Uc3YiV9Y&4Y?2vx5fFr5A0vAC>2woM>zwu9ckM7)&g zuenZDyvGjFP}SsB9Hh22ZRVBquyO)yXYf3zIiLvK6cHU#-YduiW6w9*fiAm;T6( za&OBN`2u+SBAdmtya5mO66|`1?S>!tv!8G0IV?EWnpP_z(q=P7bE`wJaiqJr-Q^nl zJWQ?$^o7Mae~08$caO&N(E82>Wbi!#b6W z(^~&vg1xA5#623^2ooajL_#}nI(2xPjSnxW)#_=4tp;Z~f?Ak2ng!|x!h<)fT8M{mlX8EaS;s7?!yD|K-T zTWhAMDT)7GzFv5s_9e8P?mA(}@_mfZC}#11Q3 z$NiQ~3Vk`_ z9%Bf0brfHooa@=oJTfkNX3ip$BS182d;iLX4+17Ibvm5&#UcKZ`n^T{!aa&!nU7=j z4sU{j>hg2D+fsN|qvk~#YjdR*Oh6TrEcR;R)UYhhTnxGud+!?TsijVCcHCkx{Bt%P z%?FF=0(whC_$BDD%^ack@pBl^8A8Wb8GE??&~h5Bo=(0T6dBq-lY_l<56!Es3}?KF z)77)AE+j!KgtSTqBi%34H9BuYE~D$)O=D3|wH|ZOk4)GSxBpMFyN}5HlX07GUnVbfLp6p}XU_184^Q|Q8E%hJ_$Zja}E!T@9*5C=A0tlgyV^X@g z^wOSZuM;AUrf#hpxY8N-tbkEiS!pl~=Xk5s5Q|F*dTL6qJ;7QrNK^KPMoxeC=g714B1)1~~;+{_&5kZdk7@ow+YBt~L8IpX?0Sx4zbuT3aFf)l)~RP1R;{sZqQ-`BJ} zBD@uhR`}6)cJ*0YQ;4Y3N45CEn~JCVI37e{pxBlIwbpWVMPM$Rc@Kx`p26k5g}Y>J|$QC^6k2A|f5uT@q|WA2Wk& zB&M4t=dVZZ_$X5i$eyGT-OrFfl(;fE_dJ>we z9Iv(doIOl6v6DsaA@0k6WxzPq9r+!maMVu0Z%{XwkUUx(9$xFk0;MZO$+>*wPG_@* zTpZshQ@MF#7K@}SZ;wZyy#PalVvU`~|MEUd?#B~zJ)P8_!Jx4cVXI+>F}y;9>i-4lxFX?h31qp4>4?u8q zxF+uV!MT=sGzHwv#H-N~t`W{~zk^u)UE!&;PNC?qP6=^EX z@nH=O3Nhowr*gW5e!avo?!?olM_KCd!d=D-^wR%>er!i#!A?%qc4rwOT%(--N5=-k zaRVkx8clw~b6<1_i-|Ra7!+UMV1vYQlOz7t#GcnF*wrdw`K|VrlwoE9K*L|56&+b= z%dEe(@=d!VLxsS{pe-pQO%8)I(x7`xbqnB-kKrHU_6fcB`a|nerak=@GHrXGF&nBQ zGPH0vhL}i&mtyltJ6fMjB%Z7r1DIz9Hwj0oUevVI3ds!f>MSr> zQzPf(WJS52i8N~C-K|(qX|2a!jJp3eU9(p_Y{pb%Sp~$|bKNO#zilR1@M3mie4hmSldi}-3xa5yJmV_fi* z+toDPC6eRh>)#Siu2vn=|I`~-Q0<-2_i$PGm-iNBijjs4Uv=~tFi8dp`_M;nW+~e) zv*iY(W`)Dg1kqK{k;m@;&^lDO^h&(0J6;A62ka_>N{X|!ZlWgHT6kGJvIEQ^J1>q> z4zhojM+Yr6Z5(k5{!4=P0CV+s(6>d0HDN4Nl5qjZ7lAMT%2&=s!)84I1!i854bD(h zGd-R(0$yJLKs}~*!%A(i8uLN~TQAWqRyQI!Zv)Qai#FX(8}FflpxOM!dE;_Gp+Oqd zcgU8CvXjO*gGmmdb$-)uMu3am7EDm3jDxI>H!k(ls&1gf&nF5Ox9-_eWJblVI-ppG z$QCyqN&6EF(Z7j6qn!1ESl6;5GyV*u#BT6vkJ(6FDSXo+0GnUquGf@kYzaTMu^v@3 z#q%L};Y_27GZX~w)ys*42I^eo6rn_&ooTe_JV|Gu??oip3)ADSma6;KeM2>u|}l9uHaX&lQ8ec!b~J;PO<1 zEwpHMGi*?2)Sy#$RUQXh* zD78m^9f>((^$3sMW$kzMgM3FmG@6(AU)(_mjYz2Bm*iyC1Ag0j#B0&TJkRbsB>$oO zP=dkh&~Ln<-#53%KU|*6XfK|iq&d@c{K{$KA-lqb)O^t3@pQ{VdM{YL`)r;^$*esm zb2KK8Fs0%OCwLl*MY(|3mxwjj!r$ z6s&dlEw`PgcT549T^$S1qg{eJ?AR*D#I-~np!D_HX`xf#xR2D(6!a~2Bdog!_KYD8 zKW9CY*(*lp{M|+y>s*LFq+VxKdO`pMnZ<<-#kA!_dvvBIX+&nZRdQ$$iCP-e~$ zb$V%v<#lO-2s%jD$A;56feV~EV&-OS4q6#Ub7JeJn$3v2r9&q22l~eR zju%>Wj8Kled;h4U&2G*UHanEN9@q|%r)Yp+*Z|y9C0?LMn#QC|urd7viL>h3m=@fP zSbPm8W+~e^|2Wyq6u2PsFpoRUg%N$=@w*s?uuU3gB&@7olzG7s6KjTQVilqR>h z`ZpNRnkA~}+0R$H@GI16BKc^K)%%nh87N9daRhFmY(BO^W<{*fh9$lwp{U`?tyNKh z9@he}4*y?P=MJ2N4zK+48F9-{)~_}9e6(ug;e8UA@?kPep?(1|HA7Z2S7mwDM^?H~ zMfW%L^x(NMAqu9bz;qf2f|V~54K z5%m91-s$i%k%dsBsWDs`xAUu4J2Uuuyq^Bd_kGI_d>2J{CyPqm=-^*6t<>|s_h^HR zXUJ{BiHRIN1lnU`vn}Ik_wR+YKt^y-K(p*Jhtiqz{6gtOs&+@IMnO77TV-N#kublO ztNeZpq``$A^XWl~m*-qP`F zb;m(DBQVjIf0zT&ADfct)}s&oAJhu8)V*6fp)_IGgTw5BxoTa}qDj{Hl*ibD0*U*N zj01k)>9b;iCXtvSHb*7~L2qa+x&^cn7yDK`iu!f()oYgAm!!^krfJBw1p`wD1i7*U zGw{GT-{eX3GRIUHRG38MM^Sa#qYWiXM4{QMC9p`$>(77=K-gyqxZG@}c_C{F#E`%8 zUOS3B2zcsC#*}(Jr5Qc)C$i?Y`4KEJl z_#~jGO&@UJmgm!qz>w~wdOkFtXTy={v#`nzdUx!&1ZI`wB~sXz!IGE_yn7lca&<^4 zattXZU@)wXciZek=pINa7Md5PWHDc9@abQIsSrziKblLIIo@|0zm9}D57`WV!}t=C z#260#sDvV$5$SEV1#130ydFgGfdRS1WK+`W8m}8*$>-50{B0qg$LK%Q*v4axxYoN{ zvEq$0d~VmQjXrl+zosr6l}EO!-P*i@=qrf8>~80nEavW4Vqm27vPGa8{59*nW#rA( zu5mATS2pBG`&fnIBFli+$n<*VkIUT01Hc>!Aa6!oXO16WY%U>xHq!HvLRWQRSy2Ko z+;)C_QfQJKE>dmqSr=C2yI`1B6+`y&93#JsuQH}pvhwIgLkz0Ie&gj!r{J>h&@qrP zV(k0ezVJk1BRed^2WkY~ue>byb8aNnJec$H4zK z|0pdz`HWl9twzFMzWPzIf+!N2*xq&PKI>MYt-QybEk_LQr({$K#GaUe6ZifgW4n*>fwx zR~IePUncli(#7#RMN5h39JEgS&DFezUO)IUgb=mY9CG(OUM?@3Y>_=8V5J*yQpGJ% z$vl!4jD#!gJOJVY1~W=Ku0_1#zjj@Cnnu^O{Za5jZCN+2?j}k9(x}z~H-O-8&o8va zHyCN}XH`YR&eIevl(9tC=fgD8`uv>pb5CU1AVCndZ*J0SE9+T4TT&KPe6TDIggSyT z*O610DU4Vw`>8CqS(<5(G$ajNdS^YzI>x7SAGBc?sSBNn+K^t7o}#;_)SEFHm#{EX z1O=r|1%|CtoVc30B9Ya8O(Gtrl>En)a>+M7k{|3UzW^V&ci`!Qpzd@5z3p6pKFas2 znq_TPj;-x&dTzs>F@H#R{BEGtLqKZm#Y`PDuYOmaaat+FQ4tn=nifa1EybZE88EFM$G{n9mfmp1nVGr-*Cj zbfLJ@D!?^fyxYpCEmGN&Rske%8)KyhrzLxmDH8WXD%`;0bm;9*^QQ!yEL(kV?r2_u zuFw)il%2ZnK|*|2cm04*3aZYs@^K^Zm23kMfmOzVX#NL3i0;nF?d3}M_2kyDGhE#f z++9j%e1J7~CHGcEg?5DzJe;62!v*kxepYlyW9LcY zL}qhrYoH@!!S{Dwl2{&|aTm$D)K)+Kv0kfv^*~wW#$8{PqvD1FMrY4Km3T~|d^+|!(?;Jph?)^z5lqLNk$(1 zcX8+vM3o&w5|-f>G&anY@0^NdJ~b@8=A&tAzbu;TkqX`+_c~8{s*o?7k^G{`nt%N0yih`9iygh^YY zA~IopeCzl)bTgrk9Nv;;e$<&+*}vy+U^2g3Y;%VMyO6 zbB!;*?P=fuNN2SQ6+#9~NNW_Wf2G%m#2Q~3(fJfY;b|5jP~dvSU}GJtT#m}_*a2Q} zemt8#$ortF_{$@$7&;D0dNGteJNvXAR|*h&*T#(Rhhxl`L}VcUL;rl>D2-Q3A&toY znq$_j$aP%yP(p_oR;n=Q0NSLN?4d)nn z1XTkV+Q(>t`S`kHFBv-7{j`Z1`>hyph@|{qqX=o~D6TV-%h61n0Xp|dRR0v5wpkgO>MLp3xT)qkb6{X@?RQ(KiiN= zr2bGReXtH%paO5D{JeLK%cV7#=K))fKxUxV|7o;rw`AO=QU}dVWmarK6CA_Poek8a zfLF#yV>&*$c2vPerqrTP>lGdTr_4AJ_RLZmS+!7lYaXXVVxLfw3F}%N8(i%T-4Ehx z4=fGzD_1#zqdC=^_KU`|-C@r#QwvOe;I~K0?9ChNlXsc-uHsqdc-~$@X|M$CrD%tt z*2B#PF4*vGe4*I93#)FQg`=MMWo4jH64qHt?|#{(;f{JwWIe0kmnN{=-0ZBjtmSiR z)3_2Z7nfzN_ZdK&QrP<}(t*3M@|Utn^Dypb@5cVH{A`GH`pCp-Sr)|kWM1}y|;5?_+ z2TwWLCyM4)SCQ|qWYa(FOq)BKG{KB#VBo0$XtZwk$bW{LRToY(F`Q-4YeM8y8H>;N zm0#1@HJXNc?&8Gx*)qQ^3Tz-}q%D5dJW(wtZF_tK0wb4%97NZJcqZZsb@+Ur-h5X6 z^~wT=OCdN?(EaYaC<-fwLK?eDi8u_K%W=P-V@pH-F%Zzab?_UEM=6uhoT6+gNnVDmlfRu4Y>@!=*rS8CvixVxooE&G`12 zIR`FF+!kDh?6|r+NNHnU2OBa&L&^z|k)Hc)&3v!#r8$P!gnhIzIInbIE%#Mc^=4Ai z4a(^EubN-s3KS>sx-j*pMS7@?4I&h=8u467x=lssfB?6N#K$SwQbx>-!J5O2qCn95 zwpH%^;NJq>$y=mN2vVrYrgpEY%YKMoNuo?^ps=Gb77>ySj?Bhf@E?XXFeJD#>$}Eg zBNpsmWiUFq5|D|7_ zm#J_V&n*Y_yPa@*4yz8U5>X|Sar1*S5{JDm%z3ii!8=Tv=bkps=uU2g8O=}akiZQ{ zyN!W3=YPW87=wAF_l?k@%-p$moacROBHsE2=BYRL1SxX^LTz08b;sT~`t6}I4c4D* z`a{@{Uo+QXE@)@)Drla42-7!DMAf-SS5M}w_`~!atd9h%x2yFL138Oq=H11DZJ8>2 z$-|WRWD|Cm><#A@?WEJ0DkboR#SsLV5%#s==KI=QeCz@Jn-aRv4}J+aPY=7m9C#mX zYlFwW+7}L=)6Syd@(_a+J8alrE)NR{?wuD1lL1IoAE%xo2MWiO=4*pzLJx-9JnIl00}hknzA$w&T~f;8po(|SDKkDL++sr`-%oq@$mTAVtAd- z2*shNyJ^6a*-6w4&IK)`k#M!XyPBdq&O?75}dfo@|bTZB7ZsHzP_dZ&VO>KMDL6AQo1+kpv;T^gX1x&m>H?x=KI=7B(pJX8JdJE!8T! zO%Fg*sT;OPZ;|G4VTp9fYMnA(jc$AHM6u?b4$UGY(s_fsLy0c*1Wq3gmOwL&s`|=9 zrxKc`{2h%aTG4tij2gzp6^OGf^$I+z#EspNe`VvNz#u-7p!m{Er4S%u*TQvKoDD3M zY!LBIY*oQK$bDf;@#$_(TT$5zey8?xb7Lpx%V=e~*_@TLIXM75B1>mG+}>kCzXNoA zlVB{tt*z}c4uhTL@gd?1-q^|_{9#@RNtQS3=6?TRV~8Ma!H?RVfE>EB2MF~D{z}-} z=rEZ+ok7zfs2|CvfVwtw zqqFWaIJqS`8Gr zUmfRjUmU+b6WS3Xb1M4|GiYNsW4-#rkBs@^<`Cpq8wK1F+V)vA?bSH-={aQ?@y{Pv zJ?lAw@+?dxbhh#2)Z1efihQQxLzHK!gK-sGb1U~4klr7-6OvL}(qKnDvL)p1p^6PC z9i&)dYN9_eOBI#D3FXw({+;2jjD|LCT)%ywvfv`Ssd$LB!W%j4XCvRR!NeP4w)s8s zj4jbIBo`3H%IFjwxqvjZcVWOrLq(RA(nBpXw4C0&$5h?uZ7TVAC^j*iPDIM+Ov`fE zjsqh9*Ci5O&4kb{u}-@-`C3y(Zsa)im$oCXE%xsVAI!nDJt&YC#_2cHg!JEa=FAKl z?&%_?R)8ME=5K`)@shy`HudD}T=!U_vrdRqJ`mt>q-EYh?SI4&0OEpBo&)Qg8rn1?%9&jS69e9*(``v4~5$4$ZfYYLTt30siF) z9%N#S8Mq(x#_AZdN%&U^S#X(4QlT6`rgb>4>pp3eTl<^__+sjj*5WTk!b{6t6DN$F zpuNaGA&KVM{`WBZy{R`2tGMiAjvULc9(2KKx9+ZTc#Nppl10^{O3*6ygU6YzjBqcpyydUK#_X>*a&lMqTDTz@)ltG4jwAbK z<&M%w9EQC3G4(ye3n9bwdIb_pQ_81JCPA8;ayGD_e7(ciIS0xf{ds_+9BRfFTkmTC z%;edv*}hI%OL@SKV{KzC)FQABA*I&@^;hVAZ!jyPN9tIUJerA`E#I4pNpOPg^>42o~;c9VQ>r& zPDJO%Z2t)a1cUxFpDR0r$ig~|knt>#p8Jh2s+7Ij6)9>!l@cZ)rr?gC+fofwW}G`s zyWDk5>4n9OPBqUrJYbw@1d`V7L!e3N;d(Eh7>zxI(#nizSf4Y|>dA8{AiUzzTjEy=nvQRx_--i`&HnqK#ulum4qc^%ySD1wb#j@947J6ZAG=@oewa3CuoZI^2&w(J@ zp>`X?90A9Z&cp@{^Y&p?jARB%uexyqQ4XrL!xsJHiR?A>efFBozCYF~LPp6Zwkz8V zD?gMf@t$;+`Su(6QGvc{GpWm(P2C7ckdUD6vHP3vZBps%iD9*+W~6&wsB?)}3?iQ> zudj6emHt~&K}TCf7a?WmbmXDmv`na5IgONX>w2l&A-oWOoms6KPC5J{!y1Y5jPWgolB0W4yQU^@upV~%a!%+|@4t||*a$k{Y{Z=%nqLkFw0 zxu1S$niGI@-`p{$`We|(y_w0MTKsE0clL(Qf+`CdutxZ@r;m;kMr0ys9L)B{KhKM_ zE5AMKucK!-Puk|V*sTgIexy?s;1xN5fN4aLIPsD9YHE6vM-wk)-<|^>SsAL#P2??^C z$2lQ+!2D4Mgeq$$Jd3cSOJVfI&?l#_p(whSXIN@eXb!h|SBd>znRN<_pKeX+EhH(l z4SqDlfT%{&WJcd;`R5IY0~?lv*t3%vdtrU-21k~&C!N|S{sE4ODOk?!erRVWXln`^ zDeAUB69AXWq=f_pWYE^fLMW3zinz>kG}Uu2kn(l|MleQwZ;ozRR3j=pp*zg@0ZislTv|C;T4 z%y=4lWdE-8tB6peCL&@nql~%)0QV8Si=^WTJ`k@3q(j2kagP1|9*^}CaccJkqO=+ASVdq?1|D<(#t z8_Vr>ZAph}?Kc=409JuBD1-p7Jkgiw|N5&7x_w3kz)nIhOWPm!On&(fqV()?(a`dLYEo_sR5MPY$Z!|6&*efENf;>2{ z2dI8zcD3;>zTD|j;EJ-?y@5B;@UUF5Lk_B4C#2E~06X-DatD%X2_*0T`9Lj`qKk*V z)7m2n1x)}&W5Hxz1uOo_zbB8CS%YlEAjF)2LF`>x^S(R_c?u_Gs~DySvi02Aubr3~ z?Isf31^&c$SOBQvxcWZ^C+h*z?HE9G6OJT5w8l4WB*Hx7hYs*fF(RK4g{3h;WIXZy z*oCUsk2P6{GwC#jz404Vh9r^m5VQx4re73hEKEnPE`mDz;;F9qNnx?6fBu3_6ojy? zDj?Lx;E96nj_txko<5IOp9W5cgyH|s@UMJ+uN^VP%J6t5W(@%Q^RDMe3d*q5O8p?! z4|zp$b7w~B)X;WrH}S=38xcVDJFrQdGiQx(j|HC0d91wNY|NPw0F(ntmIvDv{WEjN z0_4}iGo;r;1||gg(%ygzfUgS4TIiL8omjjsJtOd<1pj$gD(tD0Z(_gw>1#}FLpLCy zE_fa=4({TTiEnZ@ zS*|L{XA{t0wtcqWbNRG_37{a04sMV)tCDM&^BoltZS(5g)F_= zY8uD6-|%P`#1XWgS;VcwPn|!vPL@vk$o$7b@orh_fo7F$z3wG$slNJX0*7LOUCZX3 z(|cbeYwmHI&HfiisQ44XSlPKAX0rL?|N0&Xq}zW?{ORv6BGgvHKS4*PeV}w_ zP82j7QWgOZQkX^4Y=uyuNIbPVj=I;R>s|aUjMLNpL&Mp8_lrc0I#6}KI3`HM+-!pw!LT>)ax!ePo_#zE{-rhk`}ZqLs|6;Fj!#%Q}#zsf(BRstT}Im`t# zPC$Cm4`$St3Il!Bar3@WO+k8+&l;2O1gizS1*W}3*&uw--%TSk4Erg1tI@Os55sP)7A1ie%b3|h2T)vXq#y&Yz zY|Y0H(us!ZG1pZ-em{uD2QRG#Vh1t^yX^t?`$Vmb;j({wk7(imVk4;J&tKL@V- z!~FNbMXOmzPT_8dPQ7jXen@$oq>|58Er!BnE(Lcxstn911zzSLeo|nZCrPKGvuNfx z?3@q|j#R4{(&{pt-`8P-a9)ILc@id3zY#VA_9;~faP+eb8fWx{fpW?9(Rm5dG+tim zSa@zd8!3<+P%2i0Fc=@h{D$yc@ljz*kAG=Q1<$>6k#<*mUUFgH<8(0W)gZiU7#s}O zz7`ku8*-Brwccu_*F5~91f~$X2ctx`cRAgZ>D`i59!SKPD+ve1Z$COZWMy=FHr>KR zAN<5cpPKSi^bBTs&c=oF?bmWDjY655!UgY|q4Yf7=3~+zV|~eWhTf}4k9QwpYIh$* zmk+Y&GB1|SDPdu%aC`U6$kV&k-$~cGkO~HqM66xTfFNTNF*pt!!2x;SsObCiZ?Xxa_vPW%r)e!!whUz}gA6_+JaHOLNvUQ|U~e#IdTLqKbBgH6=%T(KT_TVlk+jHf9PkSX1NH{ni)F4LshBv?5h+jL+`CPg3a!cg~rHVTp zgycQTQ#te?3_R6y%b31Is%0Tc5FgQa?kY8JY@WIILn3VPR9F(b5?DB-c)B%~G8Zi~ z0ks!}Nb~MepYsuw&5P62TE?6)oNIP$wzCUhEkv)1dV>k3qy-hh((uD|WU`N^I2$v( z#G#-xYW+?YAIb#K4r`P#q+%fJb1^BNFrtr2AY&zE@A{rEyA9G?-r@X`bM>OQa1A?# zQVdr^4y<5#C6ahC{kGCA9Y%FL21cDdz>$PSJPsaAglrs4egMc-!^;arD`~80UmQIU z@Xlc&cKTcEz-AL8qgH#Wj1yIhKKZ>z^HwLUPeYf{6eSRrK46LXl|i$iZi2&r45RhfA)?zU0bif1Y9BR|x@NhUXF=trT18zD00JZq@uMPAME> zblX47#KMBbt6{9=PO{<^%?D9Iot#avYJAt86i%EB$@%YH!G9DQh%1g5`LIN&GGakt z5Z*_*HPL_StrYS@=QQF;6_F$SJ~5yZE?&dm-DIt zDPYb~`o>`ZAoFZDb(GLid3!7~M&!0>tegd>wP{F1XUt@p$AF~Egfr#B0P3**PPSB$ z%+&ewIIL8|qdRB5sS%0lQyeObA#HORy6)gI`moPwGSVchQg!-2VuQ0{_f{HLl{+4q zjc3hBRM`PCw?65{rL0NWh}pbXfn%<*Uv`lo$A&LBb9~DV=0|ec?Z#48|6K++r^vL$ zUr{fRTh5_Ml8FrvA8!y7cFxUVyO}CrP33^ayrkDw6sh10r z48)*q0(;jcmUu6YiH@-NY=_vxM|KQ6f z&#GjYrp|Ymxjp$ypT@&YxK;2RM)*xJjZ*k*cX+f3wen5PzGe#f)mSj~a%KD(75Z z8k8|-gVDtBabEDP`&vUeMd2MVnmLXY;l6cZT*4c438vgg(N~WtAf?KkiQPc5I&@^K zYYgb zNNZE@88}t7_8%XT+UG{0VWIpug;zh}Cs(|OA_grj8^Em2O={_Int&;zSf zEQw|kn@#GbeD0%)fr!nf{ z;RRQ9DvyXxnfWwq5oPgAcCGr&1$>ww2crD1W5ak=HYtA!6SzOI#52kLm{%-%4A?Su z3IH0wp_1aUQv2;)b##|GWE2p#;x!;@~y2zA5#)9lS<_H|h$Ia8vy z+g0kwr#)Lp#yG8~ewOwCLzdDH4kP{3Xxk7qrO47(h^hv7Bw`&Ws&kw11I(}D(Br)j zrz@Ij04PgY%Edy>kk*1M~cxpmS)CnnY4HfRI#>PfaL)9E+UI7Tr)^kwT>q(S z(hj&(BeQlfQ-pAeEl30-*QnQKN5yw7gPq96bRSsBeRTD=^kzyMQna? zAwwXqIQX;!%yrVeD0ir4qS$K*O#ay^cW|}9Flq5IxK%%1HUgV zHYqK>J5D#n^;@yJN9EIkv3Q7}A za8~U-j%Q7}r~j6Z%w;rz)UD&fQiQF$w~XXS9UMqsYy*iE33s9*64`JTjy5mpBh%kp z-Z4hjzN(MY9FLmFzMpf|StSwTpX&~Q( z!|MDI#MnsC1%n?#4l2Oxld;F&vZ#X$ifRkL))pX)Z!dN631;U2rf}>|9`Gs%HUtd5 z2MH22#7sfAD)l~D!y2g>Wnnjle7-=3h(dF6W9tECHV|AjW}0_Ttq_Qk)kRRkcj{!N z9ksI|N*iDg>;1a`kiLt%Y;##)dZ(-XK8@5v5DZw3{PUMUT=nW22&^oAA~(Z&NZP<=C=xHqggq44wh%V zq3r35U7rQlD|sK*`f8#OiJrLsL_H@#6kx)B@fziDptYekE!JBQu)pLs0ksBQ&5ki1 z@rcFCBhD@;BBugUD6TN4w_k1Rs5Wk3{u{=T7T+Q|o-bt>@hl6&*;s(i6i_IYxDk(f z!FV+NMvin^AIiaf2J2?lW8MH9C2yEnn`t# zp=sb9exA^_JE#f);CpP&$BlRf-6L^Le8l+xpYp98_{i0ekt}&Aw+mxcMfYWj}8nC zTcIQCVsGPW>g;PLAv$qNdAbUqnP_2WB8lfyGlYyT)HyKdi@S!-GK3(kLfWh8v>;YF zN_YXw^92ib0vO5aOJR7&_Ii>MM)fr!I%IA8U1`!ei(L3KPF1}b=6HavYAh^y6B5VZ}a8fhX-`@%Dj zc>MVL6EmE)c7wyw?+^xLQ!2HJ^bYtmFnQ1a2JgqF6CN0e*(j>hfn^TJX!4_=qG&J3 zF>jKZaPuJ{uPwn5^4X4QE~&j}c+5Hc^LM04mE1#k(&K{^-~swj^G@?fG;53fu&s@W zpf~n`E1>cD306(g)Kt%EDFqU0lAGw0!i}~fn`6KCfdG}G7>6!5B9_+PP+HxLK+Eyq zW(Q=ufZHdBl&zC=$}Q{Ex3buPrYBV(fqHeST|f#){o zcZ;!8{|ZE7i7|jwJ^WEpBIW&v|5uNN5ki_LTe$YXzTR(3K=-m9hB$lD1#=v9*{45w z)dOQahX^uQfD(C4AS~_8>|;7*ZE_`*(ZRg~O%*EE!Lj|mVu9|`MHJ)JZrL=c zff&iA*FH8tJ4rn{Rx1M$nmCFi=U6%&DAZxF5y5y$YLJ_D=g@(Uj%vjtC z`=V?(R&Pmgfx5NNoZ|{UlE?lm9k=$-%*OV$P!;Ag=BT0>CPm#qdMwvRAEm(*go~LO zWZDXk{(PZjczrd5&&2T z?3nlDd{_d_Kx&+HL|l@iq3HEOxOrK^9@8Eu(PS*o`;UUhQ%~#X|2E~~?^8Iw{n{vE zn}24G!3foMX-1J29P`gZA=fV#L-C1g9nc@zq(^xLI9Ufh{7H7r4O=}xqxd}{nk?id z0M@2fPB7S(*-s>zsW9Tnr`>$m8%bo?pH>}J6Ni)k9S$m5lsSMf9d8DZs!_y~5rgFvyVh}VW+cbDsQQ{$a zZfeDszLQ$F`?Ul68D5sXEx#FpQo};=6}*L_4hY*=<$wGOhqNz`U6{rmtrCly?Y zv>`cy{gWw+s({mcZ*h^22tH@N!3->T@akZ=mMlk=Dj01{*xQzJ8)YP|!(scol<1J& zLtN4}k8=ZE*3ypTV4JGg={GR=E{Xz+YRqdqtg>i`PKF?gms9rP?Fv%3Xgf3v3{tV? zBEwXwlEV$?F!rSEyNhBA)<`wK-29CNHnKiA(==M&D>{_1)~gVn-7~^ydisQDS>jhz zD-he?x-~zQ;P8I;#)~krp+yIgj|HiDHUP%=;`#o+*m3T0F5gfvRe#{LWgX(VZ_RB?74MEZADn*@RFo7mwIWnxR;>ce+;ek z^(WNB_=o6nCk)JOKgS(UNz*M_y6KxG$d{s%PrpWPG0sHTEBW4Q3O$r3S?9eud_U6 z=+gdsA056JnjqfcLvxiVIme8Xc5NT@9H0G~r_zN`{T3Xx7sBbOi!!UMsn$!&jo8#n z2+u)J)!@)J8fmSVt1;g8f_u3Ba^s2S@)D7`B#zNY{IQOYP|&I;=j!W&wOzoBs@ooolQF(>2le(~W8cA;fF4MY_VPFzUufh1K!~ zb%;!p zLeIvVHxW7U=hTpCgMmZlG+dnF=I>hcY!MWodMy-t;v?z`y%vuP1J-(plex}>H8CEJ z8H{QQr?JV|UV>%#rTo6V!Bd6**p?VvPJeS_m;IVHgE5-|0(@?=kQg9uC^}fDz;X}J z@sgi%tIF?mGTz1yWa+1K4aPZd;y--f=AYvCKj)}O*3=U{oMYs4i^uV>B-o%tn_NV} z-X36Zc@Tc0hKagt($8J?E$3JSt?&V{q3>*Hxs@*C<@P@IdwAiO4aK`X!u{gYb@S4Xx zKuz)v9EkZnLipfl%Wl&-fJwT&$KJO43RhxHCLDfSg4lBwpe84fyhT%H2D*xN9nm93~4y(su;1_wjve$|I?<+@WCNni03_w0Gl4}J^__i|EnBAUP~~=hGIOB@8}S1em}ZA3AITbQPxr%Z zgz&K4dBPIPBB!Czo`izd!O#JoH(!DM>|!4wF|qRq<-sg(DJm?fb+T!sZajqcR>cI> zxqK4NJWIUq>pVgcWt|S)H<&=i`6|}ZtoLBGzz)XfxQEcjsod*AFU=7joFAZPjrFXs zlOVoyTH5CHe~_Wvwi7AcA`vJNM;2kw2AAyv*ZFqy3I7x7VL2BMnyM;e%j32{58^Z3 zZG}T;N8@GpAYY<+mjaj0bX#$lx&In|@;PBk!gMsBjaBY32H;9Hwq02ctq9eUuiKaJ zo&=I-%E3pma6w0rV^vyBmE4?KKVD%ihBLk&GFQQ~B4s;W*dC_>7FFFWl`kj3DWbOg zxNUzM^5mRCW}Q!$v;K`MRrf47XZ#7JB<0xmfFtLs`>q5dNo~+zS&ff#W5ZP@`FbtH z(bw|fQcHAkCa1fUDE421`;zHV;selsY7w1K#9z+^fkJmf6ABJRNEJeBssuKGjUR(b9)rNDamG&UPfLA}=eNkjgvA~` zPM{(C{q%kD&B%SRGQ#@~ZgI?%#VjL*elrJV9UsXKNIccaTCrumvO&R>K}cw9cnr+w=iK z`i-4gZDvEm-9U9;{Mx9>AHcS%S7G-;APQI}@-1~bkY^G^flsPHH5QZDsQ?mlovf{J z9qXCQ>G_bYmQ?%=sD?Du#?pZDT|WN`V@)9vv4xF+%U9YNoeS4{h`Q1nU8RJ##U3K! ztqrqQbBl`JR2qfKURt#Ux}!swul8g$$Mf_9r|#{QDoY=%14?Y5_s$$X`Mf(&JvG5m zHF*1zY#m(Jjor(*#k_YODHHU10lJW1t;z-({_6Rt`=@?Cm6{F3drc;0#lj=GVSQEP zwD53eJ5yoxi&uZ55B|GVP~#3 z`eX8kTWExrd}=!&O=FmV9x*p2_~IkL7I6fvxv4gT!J&t#l0*c-6ItKnrI{8?m1z|T zc~258E?~19feoO^W4fv)9gmV`WU^m4CkGlH=3K{WitnACPGhg}`ENG;11_#xDxNVs zd_*k~abhmKdWbW*B6%7($Dsp)ou~n&-6dd}*c)&g;BG+pRCjezytwIouuhJ)D-=&y z*-%nUY5Hk2))43!wm{Umg;lm0P;Hh6DPTnPSb)f8kI!=muPb~TfTZmS zOW7JM53WjgT?k9#_P8K!qO{hG6=h_|E`O>B!a>A4<#AZpOwYnS-!1jbia*uZVx*?Yh;bD$MjbW^)n zwohhJ46S=(LGO{FP}VTZv!JFpkyqkp6$Zder7#HkIj_6yN&fP0&Ku;RiY1rei|+s# z8dn6nxgJg>Xjo3lDtN&2QjbMuuMdISzwXLI3RDKk{R1Rp=qx$;iQLr*LA>m6?sg^ZWu)*0WgnYqE;4wrWq4fxX~f@~fIDsl8=!b^B5^P5 z==+(gy^fkxl!&Kf%cFMJvkTY<?-dMs+Pev;}vZsR&TToT%zHtDEAn zM@8Q?0((u{&Mqaj3WQ0ku4lO;Q*zjwqwX523cwD` zqWbw=lzlR5yaC034`D!rUD2-Xr)2#3=KAusvFx{5sg_8GJ;W7N>I0^@PG53v!u zP*KcDK<(cm_RbY}&-oeWGPPBpgBnt(l5dgx5i0Y3{6}UtBE^%xEbCrNK&RR!$fGQi zTqrJcYo2n~;Edl^F1889dMMUNw_(mfV?WzBak7}46OghUte&lqO+zYH-g;#H7zG$9 zK|9N>%~5P1HB%{p@yx?cBZ+$@LJ-0!Qxp%?$t(uubCU5i__=k0>4m#JzGOHQI$ps zqQtunH%gIUrQ;r94mId+9|W#HibZVfy(~-s*CLBx7b)f-#%O79f{B>f$6j!+ck+O- z=DFrNH&9mJsr{X$Rwc(2#1!E1U1sG?lgYsv{_QXHMdTvi(|ha4myaGr$Pc!9vq*XR(zRTMXlBFV(%3%& z_&e1x4Z4)w$koW4M8Db(g*_$D%FI@tEkUd<&C`A+D9;70(cPN6HRpN4su04{ka9wX zh;4}cvvFtkna5c7OCxWxO{h330t5CgF*2nZtbLP)&I-8(n7~Xh`8F~SsQ~00mh=Q1 zkod{91PbL7jo5Yrw=rz@;W~bDwK5k9X9b>qnB=WjGXD3Ctht7gOzpJHG`5NJQl`(5 z);4#|aRiapmo5J&y&z8*Y7033e9zvBpRZ85!whmF$3ly|>2W!2EGev`$C<+=Ej(yf zpD%o5$cC`XgrrbCPoYg|hpRMJ>1TIyZV}m0@^_e;WSXs@dFl8n zT|llyWlZzttLNwZH(~zqrQHY#h}E+FkZN2-DRrana|Eff<@`w!7bER-QH*8APTR(6r#gzdvPRW3o zGHO%4nDu)9{U^DY&JG_%>ZSzJE1T`$D@``n`fYIW{9AvBPG@{m?+32qu!ddv$)kJhf52LK?=vtdHpY@@M^`12byU&J;F=!w?8MQr z{y#$Uh3U(A0K-fF(~B%GU(Wd?+C+I9f`_lt`NFH2LdOf!@Gtmnk4v!*ceAOeup zBjXC{Fdx|%$imG*A?BB5JoDt%8z<#2U}hY zRX^TqgsD$p0q2db4NlEwG>Ol`ewH2#8V4_FClfHoml#C?6O0FuCKQY}jWMoj-S1(G z!t64$ggCYz7jKDF5ZRaN+azdiaE%U&rl8ZN#8U0 zJ9Ed-ucIi|$zul|r)rjL^k_%t0b{rb#`NlVJd~I=*pYR|jLd9hTTk%S^(7Q#`a#8Y z+Qpz%b@pAcN-P1;`zHmBM0?C@+*@8_GsEP29!1g-;`ME&qW{W(q)@DFd(WREJaqy2 z_asix=-RhJ-FgtpOv9cWd3f)qwY*Td7+#SLLn%FWK;L;Xd#U?!j62{!2Yv~#Ws=iW zJt&l)W92zeSaM`0*i|~!MK*MU>!p*7sx$@9Tw?#q$SJKpv&cE(gb>7}>val;=!C5I zI3?F4QKEOi|?mI!z(XZveO6 znZ%?cR4m0@SD#+uq=vEpUs803_~5l}tGTq?$QMX4-hD-cs|3E{-JaD9!3?yj&Jep0TErjGZ8SUH*z5yJXbTGNAH2CXM<861x$!a0Sw1+vqUHiRWqo!q82*GeIELp>Dn zpF0bEJ3&;{LFEQCD6QWz!OSPC|2EWo1ted7K;-oXEiltK$p>(UI)se#pm7M4km1nbnx z0m8?@(8}B{!{M)c_gHseIgWf>UtmJIm|suX!3pvfxK*-6zv1>H3E`523unV_%AVdw*ohzvLQPP-&*zgLIwyL1 z0BSoq|2?;F7D=gCxw{Vv1h+r&N#NuA$w9fuwgi@#(S85`(eue9WDGMP-+hFJ(k4;U zSO>Xi+u3-G=^4fWA7)k+d~`ta?@~B*dT-r8Gh^Lg<(%|Oj!%@%X?fZULs8Nws=iDC zoOzA%?Q<)T&VZH8$;OzDEEbf+wy#yK-SP5i)G`irE_o{&l)A`@wn9UF!I}`CB=sL? z4*NE4dZ3ILO*{!_#=#C&sXRsx_L5A;FbJi) z0U|KIC&t&c$mq)=46j&SOj3KTN!3l#mTZXu@F_j;Y7%|F-L24K`jqvEv0cv2rx0Pd z5FBcmgZuiM$OY`6po)0BFE&xC8Y#hcDr0_z!Lfqt;GDNK5vrv5v zaV7$?@))jJc9dHY{}r&C52;wY70~{bDoNr!0xB%|lR`C;vhUvk#q6uVkX{pTx66o; z-UpCy+7UY6c{OZIqZSt7mIN~94UvtXvknykB&EO1YSbYlRCQEU;!%O zDa{%fS0sz+;*q$zuWoK0S}D4CHy7Sm7DE)A$R`SUIgSw@fa8ehp1R}{*wMRm+;MaI zOqfF(N@nM3F-T6uS;Q%uF893)-5K=6gMrt!6~Y9v@JB&WDllA!WYN(6_03aB_FuEh zRv&9t{tO;&vkC-$3gC!yC`m_PGRBOUVk(6UknY|tAqxRtE}|afO-zBXf_bdyuIjVe z3iukOPBAJ&H3d~|UW~Gjtp>Yl>6U?S+o-zdzkxM1q`)Yj3W2gUfB@X*xOUIr?SDZ~ z`2fX+<+rpb7$MbAhgwG{(Ps!Cim#qmMCJUK2k9c4#b8|WASFTa@?nhiBj0pX63?nL zmE+yrG!u&gDtKvl5Sv{Yv1m_<7L^h%Qb#t6s^+;&g+ZYBshZrQyMHgkh9xdAqwjq< zE4tnoTUk%?If2#-^IihOcE|b}Hbv{Z4iZ~~d-CEOi{AfePim^d2>t($Pdqt4maG*k zYKPro2US!`I75;}hL}2dD;JA3<)*SO!`dJR4c?SAWy5rU>{Itgyab=WnGFd)Bc=!X zLvXsnwVmw?DNQC{EfTTUGr;T?1;s-+AJJ{d>G#AfT54kwI19z(wZF8tkYBZ|@;lB| z$}C2@3Ka(Clf{lUQ#P3vvoUs`FokCzb(|DjBPW){N&ZKi4-Nu6j+rv6$%n6!ued)=^H#@cqL-B_ zh}J1<_A>vQ@x=L{a>m*# zZ0V|+da3U=wbx2A>{&taV#rgKCgC|f1dHAQtm&-;Wh3ysSDC{yo94&VGqz_K&e9W( zFN_V)rEiQ)!KY;cYeL9eTk8tli?l6};}jCEu<1(^k%Ry zN=240#5p;#spm3jzJ`kZn{KyRJ-LGQH={DeNT;Xpllef3%uGAzydRJh))jU!#M8o< z7qo3Ax^}9gHD<1Y#w{YK+Voa(CWzE7+|IBfOA2aw77#wiN`DdsZ?d_Srd7lny85lY$9|fPL1PcNrR>34^Yo;8BA=5)?r@ zth~VwDTv4HjuX%KVY2if=sR~w`TeyhDcM$ZM_KkT1PZ>Gxv2}ShDXyG;tgpc;Cyf`w)2HAbW5)LY&@Odk)%ChyNbZXw~L4 zXd^*=vbW6ariJcCeN`KASWT=T7ui8xZl8F-YYIERvH8DV@`?!R)gMD__DG(AlM%hN z23-Nrj{gZVj%yVzt%{_pKLi-b!{Zk|`SAi;`eZ#AC+G0q{wMoz+=FPT^T+>4M>Erf zZ^_gm*jN|ck%fT@X&hOLAr!!AaKg#aFd_cxX;%3RpMtgC>aKn3Eo90WAE}JVZN(LF z@%X!k!jvr#Ed&Iv+87u;)%5PhYBf&qg_@<3j&24F=LQxK%-~z3U>{nqS-PXJ0BmM#p6mb0~OeO`Y zt*37>Uz6uP@YVqipsu#lhd@R{vVd5G;+=P>-6oR92j9pRlJ_&_1B!bXFi|fz;pXNuWaZn$JdTy8l-+4E}r;9$`00 znN-LJNCfp%QB>83S*wgW(w@CYoX0X1EgKLzZsYU+us`S8hyQH*J!aNttCEz8qWd}M z1>7-EnXD2Vf^|z_JlFe8zxkKeUnf@4#4W9O`&)l(>`}eKLE{RR^6cShJ%VF3oZ{D zA~v7fZ=gKq>bm*x`nI(JL&N5WK zXzEW^*R^`7bvLOp_hDf$|DF5%EKQ5S^welFmp zOG+B@`uhi{)=(9V({_=@pqIpVDal5dYjNd-qw*^4XTrR@&Q zlJ9v-ol^m?6&L{?)V_Cm5in;FB5He4%nc_tsYh%KJ+k#6&+J*V)>B3p%lKt_|M+0g z?0XyqKJ3MuMqXx|iu6eU2~iQv23bd=()30EsN2IDA(R%kP!0+kv*-pm+lGoIeCd=8 zPi-fS=$vATShLX-1FEtdf=9%)=+UV-gE6K&;nJ4f=(HH3e_xmgXeWg@RqO0%bqzL$ zP>W9ctifL>WxhndP2t9B0E9qH?5>|LMA&Z7kNY}3(&G}>EPg@sM;ILTaOdL9jXYTD zT5n*$JQANU%im#l3UKw7Uu@derjwoc==KPSQdBfC^i9AlUpI3MU1jF8xx#bAI@e0L z6o?K8=@Wn5t6QxdgZCN0Zc9}Hj=-dqxQjCE5N3&4444i;$G)a?nu@t!fbO@ zJFURk66C`R3l^=El3OK-VWt-n=>{=MTul;zUqw(#8fI16F1y)QY6JZR`T-$q84@rD z;fPY2d&;2KK6_W?#lMG1{jcSY7*X%~pW@1?sFqKSQ*V{}~#|AUX>luA#SVivlrTh9-@ zv4QbC38ZMyMURIGXjaBjeqFA}Qj*Kz{e|WJ_aJ45X{4F(FtBuy=U@3?&mY?ODU~Fl zV|8dD)q)r>qNjxFlYc_A147W?XxVJ2U@CeQ)8m!fwpg_`=BDpsg`?1kR5bH|{e%M( z$w$M&=|CY?i_b~H^{Yebt2vvYsT&RCBMlpv>*S~Bmmhr$7e7!=DljnqI$ojEE2VnV zNv{#&Qh~zuk^L|+wg6VK40<-1#f?&hAQtKU-Gff6Le|4RiSHV!|D%K9R$=-*z(4Oo z;fsyk$Cv1ws?8H6m73c)GX3=)T^nCAp(F-%LHt_lw|}mCz%Dt-;Trmyp~bxkD)wk+ zXzndt3mk8LA1QHY4mxU|ph5#vNFHTd{Yc+cg+wb?M=dmOY&^4Hv z1?Z59=rL?~ju;t9Lcegg{()6*Otnglr;0_jJ=*##;oCmADj~3qo?#hSAl)==B$k!# z20&!!y`KqT?-M#q|2_6Flm zUIgySCZ5-44vnEw5itL?BmedAO~XlXjLvqr<7q$M1kgEZ!f6u{{P~7D%mS+lp-6po zF^{z9s0y*_-$pQ9q4M8yPzf|=Pm$)7k5`i%vp}rADbV!YVKUqNr|}X#)glfqAbnj? za3$!NS&NXM+-frG8{)zT6$?wz>aQHBj`3QZj(IO{mW`#%p)H%!}dT zSIydL^7f;@q&n8+kz_@{(duI*4EU!}}ZGW{Qk?m8sZ~D_e%|>qake zOx*E_*?D(f(G=O_tU8flYCmTpM(A$L2n3c0_m3DQl5^e@Y?t3WvoWkw0Txfx?)8%< z|4s-AHn0hzv^(n&OzxK>29a+!uf7Nn-CG{9v!`-wS2sMT7^@&@9Z7~p4zj&eX2CZ5 z33((4A2ti5@DQPo;dLDmpQs$VQxh-{-wTHw!F%iINto$Zhmi}-5a`H$P|QRYXvusK z0?2RNGzO)D6Is(J-x~G7Vkc7h{$QE7E~&WyFhRRc*$|B#2P3o<2a#?dvV%4`eg-TV zXl#EE|8I%B_;?uyXr;7tvdk;bi#ZXM4b(8?0M*{ z`hp|%-$79Mb*UdUK$O)cq99&2jMJ#>Xj9uMD^BxSvqSFwURYHw7WIJgvNAueGg$R( zFF9|WJ?)yhzbZg;fDg)%)=-KWvC-}5G5!jmEd1|m$qGJsS<`9q*pynSj;p3e_wL0n z&dqTFTX-)u!fb|bcD^zdrGa)>3LI9c!$9`$psbgS4aT?+?)RVNBs=jr{-Btb(O!Qp z#(4@wM+;9wr@rh$j(AB(cIfb#?)8a(<|(4|jN@et`l?V1q+ZP}X6Jr_OOe`;+>_|c zq7M`0*aAqV+=$#FTi#gZnU_Vh!DUE}iMD-W*2Q!EU8=k0wGfhITrV33?=3SNt~t=g zcM>XkGYa)ocZkR?ocoQkFDsje3mVT-vKS?K9~O<%z*>P4{$-AqKZbvY9w`XRCC$k8 zbj%s8@XRm>PK^NP3(DS$X`gsVOX6gsa$!r?UHeyMxn#bi+0X}VFqK|g%urse(F4iX zqOiVL3(vl__Z+(kf~?ji~vIG?-#3i7`lO9d{a`uz$&I2ew%op*$K zb0CKK7v&LhGeUaIR}}g3ip8vH?>8vkr}J$bIJwE;t#rZ+=uhGAB08QPnMla2do(91 z>~g1Tl}U49_Cz6UBlV+WZhZ?bWwu^CS!Jqg!yPM%VV*`Hru6qPqE#i!_(5y% z(hx3Fz%rni9cg4AepP^ae4wbfaO-N>77g(Zl}m8z{Wn?3D6pog;P7s>J`&t5__kx!speo$u+C2hwy2N#;qCA@#qDEeP3MmGVh ztoGPI^F1ChV45#AkZ`-~x|Z|BQ{WyX)i;Rc;b7Aw#BAA@g~dVuKVQgg>@rEAW*~() z#$1W!LL86XN|$0(1aX~f%=#qqVMy?K>GNtF*N@~@yWDgc-57uLe2rv78*8saHo{+l zLKukp@Gu@W1d()f0M6L?g%IFNx2CYUh zL!`y4%taD#4@HJnNpn_aXhG#)9ru+u+*`FI7Ni7BCB~kGmqwk48%4!evxze$?`{Bu zerxJfu;#N}YQW|^UwU?gEYCt`a~lNn;Ww)uF1)xw}5n$Z3oh3lRq%tQM5 z*m>kcuA-WJ9&fHG#W+;1pl?F)=!dXOe6tAfm`Wk_Dl zb4wbff>KBB9NlC_3by-a>2DW*JATx~>!m8+h-%{4;`(3W57Tj58=U`oF7pz-CRF8jW&}!(*}A1047LG6 zjUr1|zu0Xj*M2M9^F{+CD)t`OrUGu!c1766x9Q{6aNw{-?950&^)Zl`ebe(aXX02c zQdM@{hdhg()MT-sY=Y9=P^)Q3^*AXz)K}6_7wCJU4u7D$&9nJj(#GbP?DE@} zI?9cfDwnH&6jKaosXI&G+UFJ=8 z1HDt4(*Jz#PFiFfG|&TVVzCW?x0@lc`X^Q@90&pi!M_IOG(Xs8_KblbsqkVC75J4l zemX)C{`^dZj>8R9C^4sjXK0_wCjl`m2W`5W8@00xJPlbF)8JHk62;GtotS8qrc@;% zAHhC71nF6<@uH(6MYVdnz3^zrGQK~PuT(!MLy8UaSCM#_ed`F_jSet}cO5Qgo!)aG z>H4Z7a%!hdJxG>dDPC70$W!E$^fg6lG*}b^$HCnzMF`Xnsw{Z&T5n62DTmOLVL=<& z)r7lR_4luqh9HOa?Q0ejC{;FH&OKkI%MmRbOs(>+=?!e+J&e;HpH(^vm4>To60IC}_}8 zvk^(6{wQ@dqAekM*5diLB&o?#lZ|?EU1@phQ)MHo*-PamF`2H!>(rB@giZ-JG%9`|tW#R}Y*5f<8cCCT#OBXGFuq9yX;w`*Kx2$s)YI;+FqCH%Q16mG zvUbE%W6EvWgy;)O5|@L-26l9St)xum9FR9_#l2K%DzC( z;ZQ75M+(WsS_WxbgK^vrLl90knSYb5E|HsD>&*Q`Kqe;mcW?!<9vV&E7q(s()`J*# z-d34)1};(X*rh}=K_IIE1|W1()$Ft1>4EkP!7F7wsMg;`@P41PDWKMEK)UlYPqItd zOegjwJwmn%Zj3<~6yU32x`lM;%i|!cWc|a?%GhRiB(BXBB~3p#I|3LyyzAl`$U}GD zrQG|;2)!xcQNI63NN2HlKK(pN_*_rrmcpcn@vL?cp#~DTpI1+VOI-oja+zeiE!n2x z!rAM|$ZKz*9kC9v2b|Y#3qk^iJI>rgq`|;Xue%!Wj#};A@+V#oJFF_0mRDAxEe$_Y zwb7t=`;z!2k5M#tkEK|TYVrjfKgCzdEO4>2bZK7LNjFB1G5QUxRN*raxAVhb8s?o% zuG9FZs;Wpj(z?~zY6zzk9Q!aBR$tM>O~RJsV<-C=4fd~k_MI9ttWhliUQGGEx$9Vz zW*R{1hWQ(I2^G7Oxqqd6{2`eP4`_gh1{}z~CH2xrquuEr3CqhTJi2$y#Tt)9M-_I` zqjsugA0BksI%;jO7NXyaRFnwTx#V+!v2a)srqx%$3HziO3vIa}jN!S@me?(IC=~|U zGQv=nEwcl(|DoAxUZg3gdp7g*4A78_$Hi{kU8Z32w+36n9Qgi*erZpZ2y-G8KQB{2 z<_B$jw;?I1wg(q8cJM9R{){PueR)t&mcD;_OaL3$hYKn7qPKEd{up*aD@`$K_^VtG zoueBUT16_-7|2@t)`tSb9O#q$C|ew;gc-~KmjH@68>1Xt`s2_{XiyP2e#sAn6X{mk zD{WxnHtF5kwX|+xZ;>v0{>%C;B6128rAA~EX@0P4!F84lggUDU7!_9$9fv3Q|(6c=uSzCq+u2WQvLx=cQ08Z9tVfi zuo(#PBi|{=PJSz{kGZBgf6K{QP3ux5>XWO?=?k3x5wIyuS<=V3V;YeQ`mp{Ls~c|z zK>BXf$zb!wr1XzFEWQ&`pf}5i=^ZTxx4$=pWhjYa@>w7Ngd zQ@BCOjXt>^xV3|wP?g5ql{|t97(MIOk+OQ1hz3ZZ6q=8-Tx1T_m*N4V=3nTYq+xr& zR;Afp%ORMGb!@Byp(8uwG+aD~HGhNEc>{9xm2A@#7xM^r_SRq|MX z_eR))h6Y5&2)7LuJK7ttAEQVPh4|&zB6ZW3tPGZywMY{w)OaM-3(OS5-36H}ir}W< zzq@KWtZN`rEoZ`+$|aAVi7&ua>cS23!Fg7IutH8R8DM%l>2^KVV2B#H(?ZKAVQ(L4 z$AGtV(TypNU>Pf(+B>Xt(U;QyUnofN(+l|1>^_z=el>>cvY3<=fdzVky{Xui$pxj8 z>z}!u9O0UAW*TSnQ4#`MUn$FIU<&6t^Ws=`5(JA1w6oGab5m1_tzRSkwk>r;hGELf z)Bpbvw`M4kP)k>s$Z~jBNvc*)FZf2h^Kojf(;s<<`j1~kBf(OFppuz+t`HRtVjBeI zizo2#*1AoT9<6kr8PdDsMgK8mF3u6`SwxCji$Sq3IoxS+4hp^GlAV$(vFP)Ackz=L z`-@8l0=jc4ds+2X*f?$O#Ib3z7pzm7lXr>*y}GxGTUcFbVnkp69?iBND9NZib^*;v ze*4;tjM@l}1&xz`V;x{hqffd;{9U)|8NA(ZmY6uFb9>ns{2PY|3tlDi&6)dkM*H08 z-W%nYYnq{csI*u`4_P9vtPB26fL8(gf4T@TqD-X`zh#7m?IY`3bbR)4UMaqMB-ZsT z(;5w*iwkY3eQ2uS|5Z6mGs-7`kk2bqv&GDRoC|1y1z;{)KO?nw z3sDkGx1X&~OQ*9&sSK<&Eh}bQ=bdUlXKujfhd8XSEA`fYU9=DZFFYJ^=b+P9Uh>M*pju!42beI*ZMYML|>jC~BrSVLpTS=P1r(jbDQh0EYv~jd} zuF&=^o^+BM2bRXwiUO9FS;PAN=|`6Kv+K*e-OJ%oX(K%ASkX#lM9KUi*X#?0wQj5x zk5}?grqYY>7fm7S#?VF6Ra9HVMB3_fLqKv~yQxRe!zId~dc-k^{l9)=e_YKtXGr?_ zc1Eh^>VJKnX)~>k4@b-5b|`xRy>V`BXjaa`S%wZ9h37TyqtD&A*-2tg>+FA!vswJK69wJGTp35+X#DyW175yjik58Y8#t|%(rymeg(|T$xQJUHNkf=4(PvJumvxtuOLx#~ry`4n%Qk^3FBGp^G?&iNKLQ^?>`_#Q@ z)l)K8<&rFYny!E(IkoSo@?dMOjBJy_th0ziJ;y52^=vs`H-=1x*rv#yvFL(*jF4;X z`56E|K)}D|kB8x;(CrFVuvu-kO9xzC%qEYCU1Z7UzOzHY4l1acs6Wv>LXJ9DTMkOm ziY&~XTHcZBkTdlFe2+gbxC949FAsB9FFO8&dw-mwxcX2br_{*}cLB(@%8#-FvQ-k4 zN^@RH&%yZQ4c)AEo`%~T(**f0)(2DO6EgwXnl8ij_9U7pVMBe?70{KmjV8}IG`dBu zB0Y(-Eazw~Q=PCAP6-@g0zBtRTU^ntYX-_xd*+$eTbz;K0IaiZFIHO%e3Ny-IFgZ& z@q;<$NCx^<^c~`U3VRH4UTlv$YIa|r5UuxT-I^|gnc3#uzYl`60gdBe>nb&q_x4Vc zCopwY0*9fdqeWb35^he~l}F*u=X}$y!VXMRS3squgIlFc9>69HV<%ZK$Tjdq zjVTQ(lKkyXraHI8p*h<$#(&8NYnr_wH0~Y)_Ianh&~rP|n?3=;V$-QVkehOB6p(QZ zR>PEHO^^D{v7y_H>yNAPqUIc02`Yan&k8wvrt{y4Iv?+`Kr2;b2+1ClJ#N@5G60PN zd^srVlC&F^wohD4%BO7F$X1h*O2GQ$PVsytR@U$mZ#EezB-XH<(rNWfg+Qbm0%OJ} z8{3y_G&^?smDCWe3H6_5P~nTO-1{XIw8$;~Pk5H~BQa*D@GI*yuooiq^Bqe%3nF!& zs=GAkr-35Q{2o&&!qx01`EiyK)6`uCk2mIuv6^@0@;Okf-`%gLD8{-Otm`$(D)=_gnhHsC80i!m(CqVKQL_;$drwN4D zi*K6@ciGmcY?i=h6+o9$FR02fQEb(3;hh#Sb%CAi_{cXDvJ~-_g!$Pdj^fgoD2b|^v!n!sAIItbFg375-L!<>GwD5!CjL1}#4$z#_0aR=(9XL5D zcz)`LzZ}Ze`wq2aU?r-YCL!n%zy05z$mey+WWj~|k0n-|Y2AN;w20SQ|IiLnPfa_X zHttGqbrv+4_Z7G3H~usnBL5;U>Godpl+6L?pIC>`78jCxq-nM;2X7AN|APY%y_A8r zYM}jopOa7t7h)NvbIF~CcMN*B!*PseoJ}InHPaQRkBCQ$6CI-yR`c*$mERdA{d*T` z_>b@iTU2j<&1-Zo7}sjpRS|>SS}kdr@71{|A;zEmMCMX|SgS`3<_5!(l zgXGs{WvOf2%OM-y6*sMllN%lkcmRzPf^j_uQiaPubdDqz#T{vjw%pHDe{}kcN0scAK${jYQ@;-tpv>^LfKSiXQ{OM_@=~S`*4g_X$R(=!oYL`Q|(XFagskTz0!H@3`#$W#<8u|J7F4e8i52CVI z`z+*PpC<-g9!BP}rO z@YoRVzRe>*1e|u3F1I)y0|hH&O&nTBb_n7?nfpIxn{DuQ7pKDaEiX-5j1sO7x^$<0 z6I0n;Eu@2rBdH+ys!XT^N-|$bz&y%6!UPSi?~o<7Wa%CSwNb)5sOnAJ=|s;AS==m@ zmk0*V2;j#NeSUh>;+QPR6}kZ$PtXg9p(qooEddFmBWxE4=Hm|YUmua3`~hPN)`8(uf?3$0^U#Bws*@>M z&x^V-=3vVi0DUt)|Dv)ri=VRHQ2IvD5Su5?kz%qVt!1Mp+S5>}<)?1hr#aJvYh#RMtKiq_3#_Q}f0cNb3tO)$cMFQX(PFa zwWp|6W;1b;54H>{1r#rbcB9Nh_LoYDfP;z)Z>>`Udp0B)myd*N0{cI1lOi7=W!E_0 zW|ndG(5j2?F(6)c(^J>~@oq5>29>VE)FN-RW^m5jiV9=ko`P&j5n zN%##777&d3&%&wlbyX;PfWS-K?e@ah34|x0Lj(J8x}kOOq-t%yC|DM4=ZwIiM5~PCygvQWCNa2 zlRUOfSt%(n&o=?D+Wk-owMloODPKp<3^P{*e!PfP>-`MIhyY;i%G2SDei?1VAH$TL z3mdE5sG|q@9fWx#U*V_g1rOsQ34uQ$h3tia!eF6G$CTSdCwiz2u34t!Ju~X!$4+}x z2j$Z&GB&2eVn33^vPv}hSmTQunXz_rxKmtr^=>%^5v$AS=J?ZOR6Ccg?`vqdfmoz; z(vcFzRi{D2!m_KOJ|FvUI9s$P1KreUR{(s@EO{@XoORdn-7r+^W;t`&uAq9~?i2ZA zJdz?`nVeYYh(g&#fNI`61#>nLB%~H5gV!6l&g0HG^z(Pd9oG1$C3VcRn{`$njH-Lc z=}`&qh&+sa<^!rbO^gQpT_~&^uJ0EYLYY3&+-vRz)GaFE=bkle*Mrw5F^ZfMwPGYt z4R?M_PB9ogBX3}fcx+DAOt_r7)-A2R_G+mLBqKgbLX!F~f3+sA$X-_qbh|^y+v6tC zy4V!q>u_=>e~-fY)Eo~UVjd;omm0bV9we$LzZq4e?%ahZkN50%5o_?4wf%CS=%i;+ zB8rTAAbBDRFLqI?TxVl$l(*2nR2gKn(uHguh!DNw6`yY;K7hw6_}s)q z-k5Rmdcve77~1C+l{8GJ?4Z)yTlc*m47wOVvAd^a&uXH|_?GZi27>^~3>-rLkJp-% zC_NuJnhGT?pVseSg@!F>R_^N>ME)GGQC#N|!r9LoMGiVzR1Pow&M}~)iG5+`SPH5qEO#^(&aAB2?P^5Qe zcAHX4N$R+I6Y#~BtFI$K6vmaNQ=AsrL8zgo3ScSt5_t7)N7qh@U>Tsw4P<@ZrPN!S zo-YC>rE$eQ(4~kU<>!gg>y&wh4oO9FE!nnhv!3n@3XYwT?+jr ze);BcxDd#qg9}u0kV62HOtd8>NoNqBq*!6(-4|QbghQ%lfHcX(xMWxkQ%7?S;S|qR zW>wG9TcZ0EFA|VRy+m|Aqv>R=C*-7=!z0ZUPZA)CGW{KAEg{rpiF_&^GlC9GA!vV1 zWoAAdSjubFEBNckK}f~)sT!m&fEbT`uduAEe!iWwah;oDqK~!I_(n!ZtqLJXm>#iA zW3uHr-yK%oDItP&JE<%|t6)fc zQhk^-ubAwN^!A<+---3_2ww1ZxQN178FNw-^9a9j^{=-U#n`d~x@VAc^vt><>E!)Qw z4O=ENEt3?qE5wFH*;7(-A-t+9Znks&;nC(h+XFO0~1W3DB&PCaMg- z;t)P|qWc+^oFqGm{5DYEjsfVkEC+M=HLB67-Mw7*<(sm1`2G$TFC!1(k5`Jd2uwEie#ROO z>)W^dXNup~UXpuAvlq-7Fh4+YJMo<&)R#dG9F8;9E1VfU8S0x&x+T=Jjm|}hTuE9b zL6r?Gaq+5d!8Kv2g4)(OyF?gOd0uUn1-ex_y#fST`OqP9o6ia=ockyV;cNzt<0f|; zrb7SSG>ub|p21-4URIaIou1%5$YPbnvs?ujX3j^?ei09y3wO7lJQU|hKryJV=xfsa z*`^V-p7{R{qNxk&xn^Dv&0kpeHYO)!d&BYthq}KA$Zm{WIS06Ur$+j(Fe+OF!FfTsN^&Z&b=xS=b`ej2P_#zKqO*ZQ1G%SmzFam7i49 zY<^=?yw;GXmZj?wF~q~^gPhDeB_6S}eCP>WYB}LF@C*peJ*ffiV81DXQuS{K^YF&$(KNvwYE-1X8;`E?J#=OmhSaV65tmidKB)P)K zB|Cz}iB`qyGgZJ8uFkN>Cg&S8-1XVS*$*D(Bknz-&_UIWB^L_-ca?c4+|*1~G#ma4N*kuOU8%%+ z&BV2EQ4`;$_XM)|%rFrb6cx}MaII~-);?Gd-V}wx*H^$JECGZ-bZgvz54*T$`R#KA_>x7|@*;Va5+TWS~ zs}kEZ7jB#36RVX9Ggd7HB-Nsb$m_*`buV)mQmgJF^WD6Bgv~BPb?6Ki+cd<6s_qcd8q1qxj=;&`$?j7* zpsfIdSUu>ZfLI?47;?<@LgppERm*kyfQY_VS zMDQa?37qz`JuqcBxT-yAcvYibJnwp3COv>73>E6`v8*MTw}@a#ULw@d}iE z$2W|8UA)PXaZ&9V${9R&d{amihJJv~BItmU(q`IMvC>xgjsg4@<4@mMiza)Y2vU6F zqwqggh~eEW=omYow?GT?pfP>R2i1vph6+1K4FG(ZAx~ugD^rH{5i>@f_v#>l5u;r~1ZZ zSA2pwfcs6X17+Uy?$01NSvMH+$loePjrb4tZ?N1OJGPPWqd{*p!6HSdcR1&m?3#!kWHDB)lK&8znZyrZ^X~%k(#kld}XdGBBKHzco2P zM7=zdvXkWVRX*0hn}>0`Px#p4^W@LtUvEF$Pi;=PiVF|~Cvx+U|Ix%Y=pdYx5D(Fj z3#joTNV%jdcppNvJ1D;ErLpf5q{;$o(vDYYJkmP6nj}iRgT^laGK|gcNb`M zTTgmDtNryp3NyPrI}+bXp%Z2b?8qq#`*Ikzgw7=C6$v!JR{>&Jv&@*(ZoNs!Ub~07 zOy0!v3#RBLYttT61`W24LCM{YHnwDq0ctFs;P;m7R?B%5p5Xz=m*j<+v}JK!;{KSo z>Eu?woibpzy+rq4yYS0mghmWvlEQ5?4_`>?5x2>aj zddVQ@?SUw0p76JVVoxQoUb#@t`A(sNgIN&+^v(*Ev0QI5`x(JNnGKLR4gD#2f@6(( z$b_(vf+H0Gd=2 zeeg>_9hpp8reF&KtYTEHFGIgmG%KQcs z-CWq#rsv=lv=B%4exo;M%{jrD5w6@WZICR)3Rw(9}U<=C$2_1S*Mnh#05ReaF;Rha#Tm)<+Aa&gI zYoJg!5j;-4SnV~0!)4GpSFO(OGlTYa(~2&yZJK(Zdx0V|c7`W79q{KNy3DrTUFH-W zrejDJI)}-W9s=4z#6J>U2DblE)U~&Xj+q$SGwHom7hy1KvMmn&)!4$2` zQ5}J|U)4D}^6Q^#($*nVpv-|;c~U3E(75iK zKF2`Xm}6{mzrL#zf5rQBRpotiRkV^|<_0i5OSC}H29_2nE+mL`k{=oNom7`kH5a!N zi-1b5m%OdugLM0jbb*tkZ0?i`DP5%5(TZqjuZ+6Qy(?($>wor-zT+nZ`j?W$fnp%wNb z@(KOM)3JXV9+>Apk_@UDc1Vq|hWnjx%xai+Cn7P=TYsaqOu^ShXz&r^xC$u;juZZp zZ%gtZw?EdsA;|_drq4QIv64;(iFaQXG0k~Z6e%xntC8D#NKM zk|mV^fgR8Idy@&+&?>{1smWA zn9lR2zQFM|$spAjSX*5*DV=}abQ73>Zq2}O4q!QGdRN*i8M>X3>sHTRl;)V1cb5o) z{u5+O0#-+EM#5ctiI=@3a>jx$4~}Ya7)|1)FC7ZQ*?9#Zk0!eU@E2B)r*2V5qD+{8Rq3G`tsMQy@}Y9402xeNMdgsc8^QoT4Gb8qb15;M>RrYm zH^g`L_N4P&EO`?)%Mf}7a6h9tVPp}H_^1@O5jm#W^j9#KRvo>$y(t;oRBOe!lh=yO zd>0xXUkVOIxc-6upoESh^qmO_!I@D_B`{O8w{C81y>g^Mo+n$*wK&*wKOS`!)QP<3lf(Osu%>XL`A^V zMVa9+eGL`OjFUS4!YVwI?oqY%0}Wo~{DB?vP+y?WvGN2zWkC?qLk*S=g?4LsFSTW4 z_kj+l3^1uey0xpfr5=*pO1o@!j4=Vt`8=i>)wGQmwz*&l+2BTn-fr73$W7 z_4wfVbolY_d!p;oJJ8&OiiZ-TX3=(L&dOznG0|2dMzbk>`LmCM*BUTl1gi%J1K(`^kZ(O`7JCB zIAQk59dS3_p#(Mon)`aG4VeCO%E{A$%t_tkI6H2qo8XXtU6FFXdY&#)V;N##__7b# zoKpW}20dXpWuA+Jw!7&2m5`*ER);KDXHg*I(!PuPUbF+ZzuBs26SF; z^JAM+S2n_9zLnT=Mcz@!m>l3ZQ5TL+K~^UqNIod!twfiLm$Lc~q4fdLVdp9)GBLlb%r&=yPl;+^x`E>0fU>`UcO8*#7?hsrB4c%e4n` zRJWb{XiEW+n!r%A|Co^;?TUL3S7$P4f~OjJPl|^s4r!eBls+ioJ?;fm;rD2b)(H;t zmgtk~qVQ3Otm6dtXJD}) z#_bUY0BRXlI^8Luqai>+sUz19dm0bq;^xbl|5WM?jmeqSk08t{HJFY*t=+;zc;Lw> zL+C@}&Lg_wsx!6}9>Rr}rDX6bG!E&ac6!BOM` zt#x6AgAx<>I{sxxe}H!1OE4Xt#im{vmh(=$NdosvtS`{Zs#NO0#$z{VFSsbJVt#rS zWaV^E$Ts#ZZ!&{?4%KjCOFiq3=9OiRV6S7P!p0q+vd}8>DxVrdIqCZgPlsgnhZ@C6 z^^ADDN=Xs5_!*rGn|xLNy>v5iNVoS_*BBXNye99z8D+AK7yN|o$XAY8{A@z&L*X$6 z0E9d6m^T{p+Y0KD9xy)@qjtt=+=R{}&gIjce%|7`wBX+xLZWRpkq$H^TJtMJy|m{& zV5k;GyMT|M`e(@Y3Jjd%HvR1s7ESt4J(5Q<+A|v+TkB`j+mc{a^@mK+VoDIguc4<(-s#Gt>PorIu8Q zDM*E6Qig>Rkn5jLDt-E*Rn&zyXN5Svj{W?TTLL`RcBV~*4#YP_U3$c5jHYSDH27{C zCc!4a8bHfSrTtRLr36?%H=rwB%wc_F=cxtFNbZi|4J35BwE-sC*i-B>bJ9wwz@koT zS}yP}q`0V3TXZjtP!< zeo4`WdPa|A=Ml)tRk@|+L@ihi8N%f~79bFOK9c*S{GRqozAfq2p-L*(1ueN~CZc;(DXDZo8w?uiviA8%fI|te8ngQyT=+if zEXtTxDds;5WOUz?h|mBW6@RM?U*9LWg-2F?`4;`p;8SF}O?R9EXpt4S0Jgt*bxuT^ zLFMq1DtDXgqao?#*H9iXrp+NW0T=kk!Sd0gFFa(2-plXfND9P7?>moq3@A4Yz*fF zqM>F)F?~gKn3`rAej}K~!f_55a{4}NT%JOa{k&HzOB@yk!2^VYvnV(i!Y9r6mX~HS zak9~vX6xDTvjv@y5q6YzI}zu*3uMyGEWQ1_z%sBxrJLf)D6-Y`u;!cvEy^fN0m6e& zsY^(Dm_2iAl`wfg7XAV33P3pmj?65Ug{K11@1(lg9q@Ft1AxLl0ul6NH^6ijd0iXC z`##|Z41Ygomm5~=RO|b3X&m?5*%7D)FYuX)l#Ogy(?=!A288D+_Tl2eJz)uZ)v#{6 zfA=$D%&_E#J=W%e>HkC%a|w7qa9cWdi!G7(2;33cOQT! z32Co`5nQf+D1p9nXfCrxzFnM9e$#BnhLT|HA45Mn1VOQ%z#KOX;M6$68%;Mz0EfJh50;G0+MBA}nFI~Dv|AavdUmf>In-T#?93T`7661Ewb!&)B&O3^~D z+(OL&*hoXsj&4-if>6@H#608#eahhGp$z*fTP8#Uk)0yWVEYRvALhiBBc3ofbgi2W zYTJ54PUo1v1#>;Y;MLbn3bwNt>CL`SVJ>=x)skUM42Ec^VCnjn z+togGq}$aD7D@BI$R}y~0^Fij*HT#99>rs@&w!Q@&rsK|j1ZWR$szMYt|ay%!Jeeq z^-4;Ky!7UKqcRvgx3hyc>6V1=eHDj8ZMW12tsm2vY72aFD|DG$)AAr_VeTztMDIyQz{8 ziqOVejs;x?@h}qTq^|8nvM{jUUfp5u3A3AF7Q*&rwP&H>s2Y8jYBmZt^pGIpQ-i@< z)Hpgch7#J(wIl(Wr1$F4MiGY(#NcqPq?f;#+-4=mefpKDToY9o%w23*x?(~<2U~M_ ztT6q|d1yh1Z%c3>@_^CFa6BqR6pY&LDCCy*pSb|T_nNYskUI%~f#zc=2*j@x0nfWA z<%v&D$U(vn$V)865HkIx$#Ldqy@Py)o9DNV6g!kH{irjE4mAIHdnp-&Z=ewG?vsxQ z9k$@k3>#7}{pRpg%)oC3I>C#znliTjT})loqNzH-BVU45dXL@{#Z&D6 zn#X0tMHNKWR1L?%$(JXypoyt0p)6{88Ui)6@|kWG1hO#m`XN&R1pVyvEJp~?_QuLp z=U_B}D?b~ly%%}91J6`waRdVka@CiEXu&sW2gATiT5rvLb>f19GqU+8^T|Ug0FNRj zQSA6(;K;iDw|uRs*N6YZSjwd9SBTnzgy~QF%W@KDT3U&)he-i8u&m0h;2+AHIP+Ue zGlI?#{g3dLK|~A+amTi3{lP^Au7};Gnm{rUT>mfgHkT#c%+7&*w`z-~nvLdd8`W>k zTFG3PY0^wZ#OoVf&PlwwFh&XB!_is@Q5TTpo5=!StX`>XHxArZ@-)c;&_UnhL?|}Q z7r#GZcCZz=wYsW|us2@0%$k3Fx`+=Dbd6ewNU)u$b{IE=TedUzv0=q34mC6sDK4Mf z(#;tI7iUV|8Yr(t?wx+zT{G*1?Ap8ZBa1}ki9%u5-l9 zuXs{$)srm%12G4{*1jq@S8FLpB+Gc4vjLin_(;Y9J-!z3K#RwE4pRqSsoAN{+Bokc z4DwQf3V0GNc-2q_-p7Yk+X$tBg*1>tqQFRF2tsy&BR=sYw~}~uYhglq+R}lX)Dw3! z7uvm{ii9z3hw^TsX)!7TK@jqvIZo{Eb7rGj_EAbRs-aRSaYt;Nda@!xJ7*;}$Hf1o zf&toe0AZ&kNRn!OQqi45Vjl}r9Z`y3q;ONJTpzY2ogUGik*xY2qJ}X5kb6bP z_~qco#~otRW2Td;cX~wzL%k1|0xYn`KtANiqeHc{qw9@3U}XavG7HeNk~;2r(J3;Z zJVH+XkuD&2yn;=I>Ca7>q*fdgtSaBY0 zQBEa%mAV`EHir_Kj3|V#865dR4RV-u!rh%@~?9S)P&J=hmE3|hbjS2)7$^fvMEac6}pKN?(v`uhO#}cVcjj3D(;c6j^YkRF>r~wd!N8 zPUedmXuF)dox76JfKS0;!^7V4?})fKiEj=yi3OGr6riS#Y@DQe>q;Q(&;N$t)kB(v z+$vL4Y?;s+hI|hz2FQR-#a!1U7c;J{VK|0tUs?_kRCQSy{47V+zFI&UBE{cPr3a97 zxJLy8oAb(ni$-+6V`s57PI&;e-ozM3 zAuZX%JuiJFC`>&=+VgYES-t?j{y%6fT8*wW!02s;1kvY$t1Ni#JhtXA*(+al)%GT@ zYFrs0E0W5effjgY^mZ9XN;IICC5urF?y(u|W(ED2yn?u}Bw3Xk2Vuurvw3Dn2ez^S zaFkG=(oy|x=sEW9U>%YVejYxhI|^#m}s>P)H4^RrZM zq3fz`xJK<)Kn($79j+9p*Ybw!lsRPOqWg;`0WgcEkgonBBCfr4K~=+AICnO^N8`e? z0LeExlNe+w~l6orzCT?;CxA?i+`w=>o=1jz>XP~j#!W3Rw}U7B^c`V(2|L(AlCO5tdnzad&=Lz zFk;TS)%q_Wr1K`mP%hOH6RYDE%P~_|vU@bllQ=`BWiTKv%4V>NgWeX!r9b6FaPAoB zhS<0;nj5!!dN4& zv>JFGIiMv48?Mg1=$EA;8V8ZU?4%ILY%hU=KHiOocPlE2CY+FMYSod-#~5Bu9UQT* z9jRUEM2PuuKw!CLe$O{X)~_VUo&YObyA)N?f~ag%cA06rR7>x)X9^$&{91SxUYPsf z`f?4Pf@{}jrfC64G*gdinQ|Zk^^8(V^s9asVW7eAA`)h662ge;?5Af66wv#VrcK3TNkuX3P0kb~EDN&Gnw)M1zJC;|tKR)Iebxbc&)d1fVPrYv5vL z1)=SwO!gv0Ep-wZ&G2D$C-xQ4VNxO72(9>dy25eKEO*TRbW|FuPDQ0!NHO~JF-3RBws!C4yV-ym|pi&8;m!~7zAX~=~+#U$7lSddNCWy2adi3G{gj3u+P$Y|)i z-tffsGLB%yfxWuQH#6ntaogeT9u@In9LG?Ov-oAMo{iIJD7*54r*>HE=9GI;G!y=z zULKQQJlXjAv{fp8MGyY>Yib-4l*QeifzZ{v1+$j({U-(vyiW70Li`D*ADuZazl z@fowVEkI@m;%?wMiJa99!#MUTtWuB5kE`kuY>w?zRG1&ll?GSyrG`|&lZESen9)#=r zp3+&piW7;Tx%JGYxPf|zc7(yKg3Px!m2n>^oH#xp52tJXdQtB9Bq`xKsJeo`I~W1jzc}GUcFriT0^#=CPaQ1r*DzXhkH2dppQ3gPN_BrvmF%SS zJpE>y$0I-@b+gO^2dSX{pB`Qw8>1UUMnI0*-j=Th17G+U^0awWmAajWZbUS zg%hLQs1@oZtV-1l>b>z2CS@11bO62QT?t^MB4n>56nR;k^d$Pb&d>v|Fbc{)m${W2 zw306ruW8@_xsEN7(>P>zsu^ZKlDgd$Np)vL8JN#=k%8}gtpNTDJ2XqE8;>(7%Z2pB zl1sx>ow{H7vmXNm8C~Gyo61Kv-*dG)D&YyMBKy-IkOcVo%B_Nl*$1rloZPv@76Vkr zC$A&z^*LN#Uz=&kGcuobwWq^+A)+xD(Zc5*oUor5S{5WMWn3auS!sakMz?+Z>0nNd%m|f)SOIkeK&Ppk4K(swT zeXRZ>9A(!txHPO~hMJhw482u{z%A@+$;1lQ;PM;L_of3VIatZ;H z_V4Jy?pcub%tZK)&$%6ug+p(hQlv~Vfd;!&v;!{ul{P}S6(@#!Ds&uYk|KQZx-dJ% z#x@yCDw!(Ff1J#!?%iwEB)tbX*avyuQZkHeD_!2cRS8V>#kbrMgzxUD6QcVNQhR1t zVQWqoe5fBa!>YLx|ND4{P@dvmP>g5&%t6Ad$w!vUm6WBbibMu$-{w5o@5FqAsDcs+ zG1T2}V@JtjgD(Bki$CH+I)kL{5SkL^`q;yUIl$bgEKW)3`$!^K<)f)AWzYDFd%TWE zIQiw9S|j~NafM5@2G$ShpDs*MgkYpANQWih^JZmICSs+ZFdsJay7lCY9UW*Ne-Qnb zNk5CZQ?Q%>!U1z`{#bfdtnSSIUUL`ueQ=mP;0+M6WkqNJFX3U-6I-CoL}@eZyQhhu zqhdy`#lRUZeDpJ}6&)hWi8FR>vl^H0NmwY=7NVE_+=}8c_1kh|uZ8x*NOTDrOXgG7Agz3=vjfpgNu6Uysk{Py)0U<{AjJ*qTSuq_?X zme=7-{BarxXbu4zh4kcPVn$2leeehcw_U-8W8_2H?T_E3OuM_v#o32Fa3a(IBP%%o;BqX<@Vq@eYRK!}`&r~aJ7;+l za*o6;5^-MuJTGL^0n0kXqQm<#wG3iN5n7cs$egn1U68P7LQL_F@~G(!|KD^`XLrUh zhg>3s0n@|e&>&Q2zG zVOQ*?l?L1~CQ=m2lz||mrdg0AP3t?o+d!CO%N(2(ruZBkOkb(J*3lmyg)2`&?)~e* z>QlGOJuvpLCH9JXc%mbfmIqu9%{Q4?r*)6i<_L9Jj~lt4al>8j+U~dS8}f9{{woRi zd?MgM>xdpgFcUB8G!1v$qDvl2`O(_sU^$ok(YjoHxew=ucsf%>BVt8=_{;~@KU4I9 zx%Sj?+a>IB)O{(BcD`S&n?P}oz?XG>>d=i%1~Ijht=$!blxGeB_@W*y2AIEn(UUmK zz)E+tZ+xDNt3mLYhK+!W>I)&{n5uRoV(5YyNcU+uv_U6~8+1y_>ocJ_BwBgn@g0@2 zh9nz?d+vqp7P%fj*)8<4^Y2+KE#ubA4Pf~**=73d<;;WF(7(A7;%o@z`?Kk*Wl-x`FpfvVR(8bTquPH)sK|kZ{T24N!dDjRZ3Y5d?&-oPY;Pz>>NWz( zEy2)+Z5si?#4xqwqPKm=!MWmVE^Czwr-X`<)q5}5g`ddU>kRJT%pm+vqZIB^z`lQ* zL|xqEx=;AV6+w&&+Yb+xg1K~$%~a+w8+UL7ROk}omfo##Y@z91I3pBcoJR%};qMf@kwOO`yQLXSU!1Om zR*De64q0pJUrJ(KhU7NvsL}?3LlyGblmY$|fu`yJZr%`n9F1v3J0)co^|0nnO* zI;PkjCLkRVk?yWcCF)08;>esz;F>>-O;NSwWVfho6?eVpjDel_LqpwpAPh0@iMV*L zv@($-OZ6%V22sdPzv?g{65qJ{3Sdr;}3c5I!E9Dunz+)|EyIxMmGul#4l-JQAyv|IQcnXHU$a}j9(uZ;U z6iyUrQhIedu!_92xW0z@TUL(cYc|c_A#)FPa8H2bofs|{7xD6cHjxADz9>=%7fE;t zttrPjS{bk1Es}`l=ldjMI7tlhd?#5}z!bYl=;K=qe1gRjc?4he8+aM;F#A9Ia$gaLhAOd zX9ScghAjHjhTix1E;NY+ur{I(XCVJ!i$VQHtrRwVDb0iCPD#oBL-QP+wlM8pvzNHx zeu#d(yQam@>gcS{Cas0`l7|P4cmxzOG2pU1fti45!#K&NxMKG!ZByg+)mP-LxNnI+ zWWzG|L2_%zd4!POw+V@X6Nl60{Uq+B~w9NunN zCXkQ|dRR4`IQdBb5_S)yLIdU(Z|^GIyS3Jt!wOd$hGcz?kr-JQ3nz^OAP0uU;~2k% zTGT>6eMwb%G`V)JKSWS1&_5^DquM<_=Wha4H5=K$Hd3x8OEn9BAY|q6ejgNwHt;V% z0TeAxkj@z0o}%lh9(V(^qpi(lhyO4e$!k4@k$yLp>s^^t;CAH$ba3Tk2{T3pn*nQx zQ`K$VL7;lhrRGZIQ_@1 zG?eYu&T^-){#}IJNez_-&1KG6jdCQ(?|cgK!pwQ|_xSvsgnH0BLdkZ-6t}J#+?fz)p#`ql$$yW|eE2onapfef?CK_vW z0}vW#qlskNNIDFsQ}_cqc|@eUCDUSK2>bAU2ih1>b4PMp)~U|p7MWK5Vj;Kqe^>vP zU}EczEZ9?CnD?|P3CJ-UO^pQ=w<`*cMY;zZkXWkD^#8@T=Pv&XdIg}@+WYKi9<^)KFJ;EFFWqe{J>INzJktDW`${(;k_x_p$ z&Y)QweoybWLq~b=S=@g4)U~~Pvdc}9OVlORpv2UFGIy`(j#Mh2V;ao0ZAa&ni7;tm z`S6@j_aJdW7^Wm_R})Ww7BT*Gv)V%l;{gACer3eFH-M>`nLxRu-U1Q<>Z9?+=Xn-uG~R&=~pgp=}fcg+g{l z%e9xuK#IH|G~^V{-V$JO&n`1U-!xB$l1amxu=Vj9ZPL%q{ju9|gwkRyY_5Y?3?XoQ z%4$Dmt!_DHI~V&wuQ4o4=-N5hdjUOU3@-p#ib=xV_`RG#?c|{rD15n-fV|M5jQy8T z{j7dp$Y8#QDTU(LxaMS;RYc9S@IiK7l*|pQ`@xDS;y+sHr1#WNfF&Ln?xl;*Q2JW5 zKx=#>oKKx#lN{GD?+(4)T+EJ6OE!O8GNMx4LxjP+%s}P@j8!%Ypb>`ae33lRT|s73 zewMe#0X4PSC--SgXuQ1R;LcG$vgGS8dxUWpWleow83o&1HrP>%rKO`y4RJYENqRpm zoNs&^jAw7gVEvl+B=G;Oyk8)j!Ei&x*J%yUPjVVC@^o0IAXn-ZCptY#?RMt0YI3Y4 zdbPKEz*uVkMCzKKw}YY;sB~p%86}?5(f35B0>ZI*ZXNV@+ z@P)98$MZLb@Nfr^Qyzg?He^W4@1=FF_j!*%GY9yG=EB>!wflcVBA=aOh}(BFKl(ZF zc>^#vQn}APPPioqsW)S<{oVC_3u>zujz5#SE)`|z@xdzf6p-n`d=+MkW>H&8D637U z&grDI3to#S=}A+iRr?0^+AX03Gj69cbrn9lD1&=McNmPT{3kUrCOlU`#8!x5@U;wuMpP zb&&F_lO!P$X(a~dbWyzNm9C-o+&00QLpp9N<-TkLcDC^HV52(iub820=i-3K< zyDt-5;ceQ#LiyQ>_5H%{rBs~ir7hM8Boe~d?xa% z(Ft?cQezMIib;)4Pxj7(g+O)y-HrMkiq7u!=v8}wD|0Vt0pp;oEFp7R!5-)F2gG{NsI1_viJ`&+BVrslCR}~EDVcnTof)c z{K>Z4;{E?C4TNTSapR9f$mq8s4v#_3do3iyfkoq`a+*%lqU*dY+2a;`OMsb`MeO^0 z7UF5un3z0NLZj-`?4a=HhQIvLyqL>h8uM3QH0xb{5ceSl1tgJf)-(2^eJ1tbHBN4Mii5zE-em^PTj~B zRGFk_Iph@c<&4sdAKyzcN2nzMk|o0*R`;=;tu9*Ii`)pdkJl$w)5zkSgX$4Bc& zDR<0SK+CE3;67c(XgFA$Z2t%-9x?xX#NoRF_y$s}F87!Ao2b5fXymT?Ta;YntN)mR z*DN_x@OS^gZ^>C9fZa>_YCGwDVXpca65Sk_$EC4 z>-LdW3li51;vRo7wz8((AsQB7vlf^me_GdYvhd{VXTtQ)rJ1Ij zL|MZE--H)*zY~b}a>2)=FGZ9U2*!p&FO`j7e7a%bz@mR2PNX(}&Qw@8mdod}QR@7r-X(II0isfDKb~YmRl2Xyc!#m~}=Bp-mG~MRo3@lLt^_IindnqAS zVg*}y&Uq?XSV_V|kbX%VVz9lQ07s%(8ItN}WcU!j89?p!o2h2#m6J4;M1S)RPgmX) z0bOS}UFZZ7FV9+AU=}jgIOvH}eDxR9?v()CPb#VCP$zw=5=H*D?eQ7)oDqT0gWnh! z!h`e_TBW4Un_Z=Y8*mtJhA{;?U6RndbO(Fl3tG~3hmKdec&Ous!RrVt$=F3lGsAM* z?|8P>(qT(gI8(jb!kUfHooOK!8~Ku&-BkGNvoxXYm@Yq6YORUyn$>ue#gc^4)z)tV zNr|_X5oMQM-5s+z%$M9AHN}ZL_p0{d{BxSvyU>D3pT;@Y>c-m)ReD_O9A!2j+K|Nt zPm{_R3K+Dd0~bLz4kr~iyNa&W9!a`;aS#-iN~^k#)KE_snAM+AldgaARU z#k#cpMfkK7=wgUqFW6@!4-yv^1^3dFI(acMpM)Oja)U&9A$NLw=%9JmB-5sE98(2I zi!?4zVaSL!Nt6>|To$fpUO&VIXJ^CwXIeeLv~@n@y!o0#=FoA^zmx)?o?RQ5J&K%} zW@me9?fUzb^ABzw5qvy&i)p|?x(C5uW3hZD+A;HoXpmyb?U`7qMH&#AgIM7zPoJ_i zj2=nXZPx;LB)>VNes1lyejnGbCPw>83g=jDpA%9VoY=V%L^ zqB{4iuO=Fc_7BHsecXj~?zW6rGxl6$8|9$le4T4XszbO97I<$p7!`7F!tx=LUY;Ke zreNR!Gu)U(wpQ^+W<*=Mjzy8kbZ2Ae;mhF`TFp_le^iLbzzhd^SW{atN?3qwDCVHn zhsk;0Bw-StE+Lnf;W^To+GJ876 z^rxIE#zr#+sM#dYngC94HP_iT9?uE;YV8VHR$MYV){9=PRKoG5EVuv0ES6WNm}$)V zL~uX+Y6rlg;G_g?LAkNogsaCWZ)_5CKPXm$SBXf@G~^~%o_!*$|3d$)Q@&CTok&G= z!G9lD+_MGSKJ95olmWgRZ)K&%%Qlqzw8A%H7!x>r_ZShcOA9oIBXc%j1htO&1_gWV zYWKHf56nOtam!2UsyyPNy!RQoyt6FGa4Kg~Vh84HDur7F-?>!3I!cQA> zt)J+msuR3UBnmrN1%QeQNW%l_g@65ooi#Wt&-$q0_seTnO46&^B}5Hj&EgiMRxPkV zU><)Ln#jxc613zDFZGe~Oy!WXXq0d}#jZkdtRbBGHuaIhA-7bvZL2Y@h5fIq4aLwWZm z#XQs_iWf;M^E9m$d3>wIwc1YhGfCU1AZP5vF{b#MS=~Y!xpzD;rZ9#%dJ=%~C9o=l zQs%&95WPDrt{9MeNZnbnnmfq9+X19GXE@2-8EZ&@)I;x14pCEM0BL(zD@`JMvT)>S zi3drp9O+r`IV|`d5Hy{F83~9e(nVCN3ET6t?*SrN#IQN9;puAc!~w#;8+yJsyXv`i zx(W_I3DOB!$el%5ZItSA3pJ^eUuRhFJxI{UY~wm%xmGrRB7@JRO=)|+=B)yjU^0Mg zE?Bc>NY-M!&SoF&Ze!lnDuJu%$Ht5T!;fnW5@V%v8>w^xxB3b+$wfc9u2ITfj)R`| z+C*bn4G=P=Q=Ca7@}+aZ{#+BGoc3dA(IE?zBOUkn#M~;M0*1=6C@Aae7syt+t&%goX8ML&a{q0kM9%jV7kn${+am)zpX;m?D)(5ztBL5u5TQ4zg~05bhMGP%8?- zniGpnEjTyv*Rpx1Z>q_8fee0XVgx$T&r@@!Vw*%NGestFTPn#9s+{4-7{K?$l2sU6 zu`A2WyfC~SnwM?l^yz~d_O5!h3dO2t zK>0H;*DPT2Oo(Gl0F%7sA(}h6fPJ=>CBoU~rHQ*EgZuW+-5u8+Mmv{&g&GU6zm|nv z3~VM_U#&GYUM6LkgH`e!9r-ZgdAg$#q`{W_&3TJ5=B=v-9gT! zAsfGZqnO-=`J)ATQ^pvb-7r*>|g2t@ahD#3;+rBy$^~qcID* zL&a`k(}AB)L`GOiT+jIFHE#Zj+oBwv)0yu<(yZkd>R3waoQD{Q^Od~h;|u2R)YGvf zabLHA##t=!;z_ghD01h9%e;yP`sr&lrd<=ne3fafO4(-$iJ8{4AC>_Lneu$Qr5Lu! zkP+rb{ByJ@V}gYdqd!OZrm_}}=mf`CRL&$coeHfgiupKB@yV4}1&FFBx*fFzqqJi! zt;b!{Vph=8(r|^4+R4;Vk_L~t&RN`~xQ)`zY^pVmp1cLY>rp6apr24$+=zR=DP_ic zGqv;3Yxl@Hv95SHkOC(STGFCf2wFE;WR;9yJC5A5g510B$9`$$v#(6F@p?)Z2ZiyI07*ecHwgL2KZ%7-)kmpFr@g3^o&ZTxBKFZ5AS3ba(O^v2KFG4*1;G>lC1NaiHwg7(@}=5mhIn&(i< zw*CS>P}k&OU%=TlxVhc$u4Vyp*CVbD!HAbyA+E{6NGpc!AHrbCmsMj=kmyn>5*Tny>^9nOmLp{MVK#oT?bUYN zisrmorak?b1ZT6%7D4kMrOYvCAUc!5I-m^N$}dr=YfumcAG5Lq-K8IoD}h>d1KBx< zZxMW5($FQy`j4Vktf~Bk(A2LMN1EQ|I43yFrwFUm8q<>wfCk$OGc6@^o%SBb*4H9Q ztIqbrX<1X0L27`)ul!MIS9mz{q*t%BkswQqO%~J&nq?9XXf_7r(x#QQSHZq`=`N~S zU$!~?)1@_%&6cHLClNKEl(ZNHDOEf3ey_l{|mzy#Weymb`@!D_s)umN$b*#N%IFl5Q;G*)tyD z(CC4Ms)h6lB&Ywy3nL+&Og3&LJLR)5gs4<_GG4D6eEQkw z4F$L!cPL!u{9SJCFq^QtAf_hQ z0skIAm7siuo({mJMD54Qt`_?wB+>FQ0Sn{1u*2x;j=7mz{G{2Ir(LEDR@s1_fv3oT za#$K}##5P$X+(Gc@Dk~4vcvc*x1XwhlZm*+GY%~U)4sn)94<*Z7L|1CNT0|4^$m^} zKhkBG!W+wb_!2^d(-?o5`ZKLT2_W|iBt;(X<6}w~BFFom< zF5LEGdH<{`(Ro{889 z)`IaO^O60U8p=yXVX{rXqQS_osA}mDSgg6CB)Rx2a*-db{>oQ8_4j=ke3d-&YC|Lm zv|_fN6_+PCBe0lnZ}(`Q2BNMc>~6%>;H7v}Z(MM;jcHZ~02C{(B<$Sj?3AW}-gtv{ zd7oSQzmT89g4Sm*(13c6x94swWTlAa}9UUtw1u}Cw#92D|chM zFx(SLFx@lUgu(l%(ZfAOz0Ge;e1o*1D1O6uoIdI`!)?}|YE zeqbz@6(WE!Nh6gNeq+O(!69U3*UAaiF>dEjZUJ7_d3cGox>^r^Fk$(rHIahrYCR2Z z@xj7~oeq(E^pPDW=~?omHT@O%8Qi`3KmXk9z6Q+Ilf|(iG5LG^l-4{uI2&6>o+)(a z&iri!4-V?-=?`bRSpl(==$hWbgxi7)Ie%unV#T2mtfl=gv-yS5Y(!|`1o{3oNc2OT zB@4tU`Ex_qcL|WlHV3(2c8@QvTpk(%9Gqf)Hz*vvOckail*^D;7y_x~0c?V`Gt%vX zT4>cixWdYzSJ7n=2^|rfS%jvu0Oj#=e1qE;<=z|^vpx5{l3Q6jA>JZo2g8GNvh>bB z)G$Z}uzm5|cnqXop{EfcSg12Mz1j8F&oLXe^G|PtPBBA115LEuP|7^#GiK53QZhm*jJqrhSfW_WXK9N1Q*z7j&ytINh1nNywJ zbSroTc(`>Fq*`28HLn*y#CP5bYsFpGn;<&kDyk$Fw8;VZ@+i>*0GvgS{2q(a>{u$c zI_?4lKbTCqv9@@q>SRYICUf0fENj5(6r*2&9tv>QgVM7rX^|{~g8f5CAd&O127+aD zTzZ36WgTDVO1g7)lPu{C23J)MMw;Sb)S(q9ESp=i{fJt9UD`KuWA3_I-()`~kBqDQ zE3bhurIL8z9CFD;ActLSGnAEcP?7oi$xg&xO5XN6Bs~IEb4f@l9ouZRNr~IV-z^>| zIq91zL1;oG94bqs_}xq>waj{CDQk@$UB!~xj?9u5c*w?qP1~t_KJBiwL$DCd?=QRM z;p}2*9#bHkkVpd;}ti3x1I{E%iMfS@t=!u$6K zMK8d?!*yga z*ilowCbeYus3ya*NYFF!#7v$#2mJ6`;71uR{pG!T%GtJh-NvO#QL#tdivTIfn!f>j z5{$JZPVPhtaKKiL;+3(x{6t4*wi6b+#-D7JfnOZlewY9x!)NESAd_UmN44)qv@{;Ti*6> zxpUsYBonu4X6;Ya2XSN{;m7oS>Ob*g6ehH8gZ>8?OvX--ctowo8g_NOCJ&CewJx^N zWYUYK{xRFCRn?mT8}%MXVK!ceDQ=e%KUR7R8@AjNY0aTQ9YspVe)2dX+Up#ik7mN- z&Z|+R1{Z^11Xbm^9Mql(L@M~DW6eta0*%~`(aW-sbAgoD52&#J`@LkvsL}~9j}n8l z)diXx41fi$hPQD5Dl`XJP475Te0TBJpBLMRh93w^()3F-tyV?xede`{J7D&fPzhn+ zN>vr7cx>iw)1W%ghPRURF5zBS=-wQZ2(czc#)F@rX01y}t6e?$6!c&>@KS4)&_1-! zMi4||hZk!zy$fVo@&NaCOMAxuA^0^i^vuUhlgrq?{%q9yA}2}!y6!m7pCgbV+f4Lm zzQ!~Xs9yA~YyZPQFEW&k%cN);npw%ois< zqlYKmIXAmtMyNKiiKf8XDG3!q!N`0~`5emXTnh{$WeTtP0x5S@S`Whmlt-*HMHZB~f*!MJmLI));iiVSl?2+ge8t2g++n$LAytf2fdom z${wm1_a0PnT_1YYS#D`vdWFS>Nu~xpvT|$dR1Jy>?=sQeJTyEc*a91}SvVR3o5|Fv zNBdEo%QP`aIdfEy9ZtOxfw;7UnUr?jUl#K2k*rTI5`omf#2+xhnYbnJL@!md4gE6& z=W-OHo!dnq)XD9>%iYM1q1AZ6Y62r(S{{AfCyd_*9a-Ke=E%kh z-zRTxZar&kToG*vP-}-qgl#- zAt`#S9Q3q=z$FF(OsdzKQ+0;5Kd(z@9;a!`cEYMv(uG$~Q?EPWAM>fq8EU*RcLckf zZTM#|>&IEW7OUq@-VK(!V8lj9J5T#3-$SR-m2e7&q4tz{r}#BGNg!6eh8oa8=}k~+ z6g#Xtyw@WaEM>O{E3O8tn_Et(rd_L|wF#Yq#!~%GIgdxIEWeioRo?_T?mEdUXdjH< zDoBtTQIAVY$3%na;!n~XOC)|}vnJc=bVQjfvh?A`(b{Io#= zy2nP+Dwhycuo>;e?-sMwF%goX%*RUoIOtESc(HikLAn+xs6ymG)`M zc4gyVg)>gIH{RCy^OGI5oE{|ZRZRb^d*ec|=}w5?9rUhf4<;hX>^J@q#LuslFh8VB zAW!%$iy&$uR*T49&Db~lVu~p2#6dyb{D&lj`&OJYswCC!-oR6*6#w>RK`>pb(ds*B zH=qg^3W-8n(@C}y_1{PiE}(6Mq*y2H7pOFYwKD)V>l>y;S+y&=cU6JD|WJ5jCV zJ2Jc_rUXM&i_^ihAXpr>1oC^d4-k8psRK(+oS0Y^+f@l`exg4@Gm^KO5z0b+31ktf z!Uk=J^&I0-7igHi*H6-_!h6FB&0YTNsr=x!RDxF{lEg&B(decw8kJGOZmX9jTo^K1y337F;ho~cd?fBK`_^LDy6S07!Q+Tt7)Y3! zkpk|w4&{F8YxiOqtEp;GdgmY+IH9^dUF*A&xxG{rOMh27IWwP~I%PrFO5}@4ibT9$Kglf%I|>wCGzzbzMkL zew#qauD_Tf^W@?)5W6Jj2GL4GR?*Vzg}^@nu1cu z?1)6>GJegV(Cn$zWQ!>$p-Hm!2&8>YaiV~%r)$V9yzWXb+?R}MkvMDW)MDO#7lSC?FvehTL?lVi0!ELKMY=LS)!BMB>IQJUrhwA- zpHHNI9|*0%)OmMkD4)_K$tpp& zw%OyfyhwjMNAD0Ieb38NX4mLj=}mMpCgxPirks!2-7)S$~Tn1 z+n1#`I~tYf2tytb@d&O;?WDUR76OQ^_wIy2=D#L1xLR~7dN&YK)K z3_bz}F$^D|h&@Q?Zne<;X5;bpyrgirU{Oex%PtGheP8LN=Q?&u`&qJoGT%2lZX+w)LO+dS}_neo+FwbD~pB-*U@ zLiW+MfO`a2mx8avg+8m1K=2-7{?41d+1~zWJV^u?hd{FwOZB9E1a)hf$vqFCqYzDm zRbs;7$(f#7JpcI#*izc z6o`IGWZ=qIaWyxzbBPQkc*QpDJWgpvHF6akvhAgfFO3XEW9pIkL}gx%SZ|TlwfV-u z4OVHa3lvI}6T~GvZwOcuE39iodt=F0oj2rEE|-aXqW@zOreEC^9%hnm3OkO7A^lIA ztUBC2X7miR1;dVimAOjGY~bk_M`!Y2h#89EtiT{^f|;^u_?|h2m}3D@Nn3i;skG}& zun6t8i-lx%i_0jXo_seI4wsz3!XljY$z#5#@?Whk+f;7t;)ux|TV`ex6!apC|-11bpCx90#oSTsUa(x=MDzu!-!sl4LhQ%~H;F?PL zCD%lWs|~v9b3$)c*>BX1I1#TQ+@@v+8(6_LN2_oLunf(0tV5yo3p-%UX4~e+t&U>V z{Gr`^BoImNoa`d=+waQzX4bXUiMsqyZ+)(7J@_lj|EHqp-v6@u=8UU#$tMxMgHr+^ zkWkRSEh^@$lq`eoonia}s_;I+r#o=*-QY{RYj+nrlp{YVVYAq4tjEBwk>G6GPxcn3 z{+0u&!ITREN8`Z=a|cPb&I6ncOjUauDlx%jI;}TYq~DkU(!v5m^oJ`ga|kcXwB0^! zHDkxdJ0=g`vF4(v-J(8A44%D6xxU*dpNyWqmNCML^T~>15}XpaAw`5QlQ^NM191?* zabCkJI-MWN_va6Hp|BoYN~!m1tKkiWc0o%Czg6R5t{$wV1jV)hJHkzJDqxTzdc0xU z(~=3r`Ys_cY(;Kr$mA9k@b!@Ol0^3r6>ufT^_HuU4iCO8$K?Z#pOkelA$r;I@#~8R z9aG=VnC|~di-DJI_uVfK*z2?Ur1?T|>*c5Q0m@o7 zC`8bQq;DV;&`=bvhyL=L3HV1E#weThwDbu0(B}>esxkJs8&c1_09R9=Vd~0Vk1d?W;o8 z00nLS+Q-fjsKRoa*=1iBc}Ygh{Km9ozf`wXB*Wu{#2G2hQn?mw!M0##8WW5LO&?{O zQfZ8ZAP8nxvUBQ2(pk`l`$l}eQ`_l9TmvIy=mhVx$ zKi4+0sq9=bHXZ2nYAYw2)ydKIayrwP1HQeWVCcsRCq2jGmaOoMn=9+jvQXssD-g6PRx`Y`I(oZlMUJf>mX&by99#95 zDFlpz*~c72qf2mleG){O_?>wVw|4-Xpiiz>EfVU=BP5gE4;@_yAc1r{WN(iB$*o~Qd zysJkPm2KZrrEtF<#SB>*<6hkoyN=Gp26tM*VLvyQwYP!naQvKIHNAnY23w@#I3feEzT9LJ&j|m+Gda<0n*unab5B3VZsDKc0#j8b%ZMyRM z;6Kp~KTSxwGC8ue~lF##t4coe!}l^Se^-rHs`4PLz5PeydKWa+y;tq%%VY)`-6 zw2X9uscIjzfVcH20_&{mu#y$VE#<|+XWJq$A(0qNtcYi3-*u{fT+r>yP8gc@yiiX& zNGmswO!YE%4cyK^-h1~5RQqXMp`{e_H{Es-UOYpHrYyV*)(rM7R3?p)9yBR}BP{IK zA$|)pIm7o7KoXO~wBW^BoK=>Kh2A~TA~TERWRfsSm@Uf%?XK5iNO%*tX_2!FwP<93 zS-Dm0{YWvTXM6DwvvD+8yqV3izc2)&+ILxDoYbU!Fa(A`2pPRNO;_B3BCJ*wc;Q)0 zh)e!OSRK-$Q|v@ZMI8%D;8-Erf<_omeuO;z&Oj1|GtxBhdyzwIqn`{j3Jg74s>(dM z(rfe?5==+p>lCZyE_=;l!o2IZb90pG+xexQc?MBm$=^Lo>4XTJOK*QH#E7wnUI|nsh?u`00!hm%21hTG<*uBvs{V+dJBx@W6+i9 zj4}B^rB-oX>?DiPb6~cu*G(+8BP-VH`Xk@7)|eD%Ns1u#4e}#R14;yy(W(L{H=Gso zlyCRlERnZ`@hVEMR<&60mXBX&8`erw^lKfU={x-$fT4N+$XeMHNkUtEYvcf0TPP7 zrCK!Zah+5K$-e|u&c!Iur8?5IEvr!MKX1qcB{)wDvYg!Sd2%u9_%n`ocRv@SUjS`a9ti4~+ zB_(>>Mc_Yczxabx+^yJNo|i@iuxYKlK>wsm1i9O$yVuEh|H$n<1K=8V%M99*?H*}R z36MG-v)W8~4Hq;;lxH96*bI^?@v@}}S;w#Xt-j)+ogCJzvZrz#)drPC4FAdsaKyYV zyQU@btU3CoD-H~?wG8ehaaKRAK#*o>g`jY!VS0^Ms*w#r*>OBx9RNOw$Sv~*9y~$7 zohae`lSct|i9Q+o1B*u6&iW#8>>PPdIoyXxfOxmlw8a;GpI;&1KefSe zWEnQ3Ks&$cDnY8P7Jl-;kQvI;L_IBUK6ggyIxA~Wa_%}dl8%c14^3I~52H|9MvgAl zRs#H3=N{5lSRpr9XK1gh!*MyXT35SQsOf$?r=`$dH&qmuCTWPJQ3x@ZZ(+hs8bo2~ zQt}Bs(nT%cQ`%^}@lpr)$)}#W*^BtBboSYc{+8e#l_17Aa^Zx#3C@OX||g&0O+qqS(->~HG?1ns4bjfm1G z{!AAt&30Y|$$-sL3Ox*zNc`Q7JC^SKy;`%zNfa2mTqXpips`g}$Y*)8^GwjAh~O-0 z$1TULbL*f{0V%wq$H3qK|4bj^+8j6{0PN0`K%*6~Go|1eUGVVLidsat&Ma1nFaLj9 zT*(2Yn0H8Iv13kF(Km0@J|fWeIa@RGVewWYu3&`R)i3KL;F|UJcGzDTkwEN-?9dJkn0>%YHG#8J?2!q z-=vjJJkFxZF6%5Q6{*TgIbsI#-sH9kA=+^;&)4o`VzRC|C$x?qkvEfikTWLIw^0Hw z>XUAT)qM_i19IHUD8Z#ZpPF=0?oBR0nef?hSC$75Q%~-wu3}tQ+rs_vWJ-YZ_K-%p z7iLxs{*V^;Zt_LfKIVAAg}k)ljA!%~Ra~jN;4vWY9uAG@l!n=^^lD zX`H_q^0CG~x9)~gY!Z;;2B8ftCY#j9r#-bIKn0HcEE_*qW0f|LL!U|I}xdmc3R%;S{py(+Nd z3>jR=hU}Aa|6Y^YLHB)ALNdcmq7RNlHz4$e7U_X^teKI^$CzNFBtW)^BIje&4n_Fjc428$t zL*bry!Oz-zZ(kMEjqY^RmqJO^ur-9<&GQmFdI5dLT)D|;vA2csB;_mSw!v^q9sUod znSls}uH&_&N5^#0hE30wVlFhpP|`<~B4%q^!Mo9Dx~|npfA9f0ut2!(5o3}eqBD1m z6laVV%og&(%YVyr`4I>@KXz(-7KtyDlmgmk!5^rBD6g4yLmdJtCCNL2bI`qFg;{lw z_mtc*S+e-aVp$5{B>O|*EsY1roXuaYzlYR!aeW;TYYo1OC_qSU^U z6P}Nk*Ksm@a<~x?xBlU0<6b{4S*&Fx2%--IL>DTd{*4u_KEAjmk=-ZiBbkN}|6})= ztKONmPEA{gOkQKWc)ON#>Uu(>bMiTPvmLwquS>PqH+sZ9n5q`+n;~%liG&LbZ*~!l zcG4wS3YDTBESbQ!xUhSk^90kS+_}&82kWn{I&_68I-kNV@vyAIG0FX^&WpLv_x|1) zQ=jFo7u_u#sR(D;20??lwg0xPN3ZuMUq?LYjmjE(|12&90DUvOUJEM@=+s&~NN~^U z=exYef=)Jj*?*uF^PTWXv3yoK8LJ0wx@`U|OR75l=m94O>Q?7tl*$4Qvty+hPRiY! zds!5)lG%XeN-}+Rk79ROUW6sSgh7*pBlC?Fe2uE;-xDew;G%F4Bixa*dMTKXROpPUrg+1?b z(ZNzr49tTG%h-!=zRD5>2b%5@!j~VGGwYOn046O8@w2xhrNnel^voe5n398kP;&;K zi<_KSq>*P1PZb!~{3|&MSC~epnbRzLB+C3)zq6+D=Y56V`zZ_hSBanbOssLiqP;GS z-7YaHuxGwLlqbC`r#5cjn<@V37wm%PD>gz(6z%mF4mzI#uu;0EO}c)n$f)YwE=J8KInY}T>+g*1m4=5PkJYS(!X`=YvEy-L@PysWrBk$voHaLRRi>$UTNBPE$E1o4yxJ4c@g&# z6RL;3_#Dbz8nf(7c*r~vzGbe3o085$Vf>iDW|!AYZWeF5W!W$_uRDcjw60=~>GEY` zORn(~?GH%aswHCYqJJ-ZsSWBk$~J$OhQTV+RoAvXadtIs@c!nfrYm9M_cqyahNY0= zL$cO2o4m2=$tE6oYdRb z{sRE~NC)yUVOG!OabBiUo0)@mz~0?w0s&pSRwe9%f?l z{w+O=ikvaAnKazX=h8MqL#4TU+Y$GY%tZ{;sGqNenMq-^jiEYku!Hk!{lgwslKATT zzL@#-L>s?n1Gw0aD-aYm|NLY3Hk*&Uk|BbPVG+(CHXcJIbBYom&F?_C z@Vlk9EC&A%5Ysw$Bh*VqzP<9M&+{fGf(pA(06jp$zf+*PDKszE0l%{CVyR6tcQMqI z;Wq_uFJJ$340K72ygLl1${3~vm@~T-c;#QYXYNB$VOZxZA;}pd02s}HRMiTynGQSP zKPGh-ny0C=ynbi^#Y2V=&55_x<|-3PwH*1!ToANLBlGykJ?sNFM0i_`q?;ba5p=}x zl>5Ws|Fz8yiTx#@F3~3VUCcll zoIrI)X?6mdd2hU>XOclVI+{Fltzp)nrGvaa3~zH28pr}xz%=!9O5@~Q4b3bi8c6d1 z3fh?pCzq^R22YNh(D8fxiUIsF;UsMY_kDO&1^)+-wB^w4If<5KIs9Ump$fwh!5%Cx zoq3O$!X`Xggr&I4Pu3k-TCmo=fHJzqzFmIpefSzIQFBUyXZ(x@x0Kq%zgx~Zcgvuz zM8&u!ZLth7$(HxIG}NUK5cI@$_LDxnTT2WbBhu<663!iSfCp?lPKQ=}r+dz^c>4Az zt05BhE>c_(y7C<1q`MS%0;~oX2h|8zdZ^e)V^y}22(GFPH32GdGG~I6X14nHD(dl^ zPE&}JEF6gjY$l?fj=%S;7U249oX(;McaO7s++K_aa0^l`0Ui9>#}@4pEAEQNB`h!! zg}Y}L?yowiw{V`N1yCV^=SKi%D*Z;CITdt}Gd!-6=>wpFX~HjA@0}>UHitDP73xi{ zspS9Kh{7~T#d45NnnedFVy{IaXm4ND{Be)Wo)|p|P}9{A$keo=jZUQmzpbSRzG)`h z;3bH83YJR9um_$T&pW!&(VCFf=mEUD=K#a^GAB&J#?Y}|8nz}=DuwJ8{~H^wq&xt$ z3eT)l9eSzjYZiB}UTP;2lI(u%4)$6FT(Cg{ss*fvtuojybAxJ01nAu}GGa{zwX~_6 zxKx&oCeA>D*}LB`zq2K66uGit#D2}gy83FLWC6^;Nve|dCRHS8bm^L){-pSHO4v*# zGlwc9j#=8%)}7q0&oTQnIG{vPFvrTe7z>n&MBcrvhmJ#K#Bs1t&*kXi5sy_m=tZG} zx*8`E0UfR%^V~sT_W|hAL0zwvQxw()2=!p(1XBwYg>|%@F0_0`hsZ*K2!exQ6dLJ> zx=4r9=lV}r2_Y!yl%!|ZGWE`j{YbItl{|Rbg8Gx)9ip-LE-_l~F!f3{oB$|?7YFKK z3PDP>stDfJ{%SVSW!9)^-ZO#s0$p$@{pwVH9uUTRMj$ULIQlP*YCr)oVwkN+yNta_ zQA!(@?}d5NS+odi7+n1*$D=}0zChpC&a|qVV%l}$6DaGy?n13;o z>&np>qNHe3&rBNbY7Pb#PwsPpv;BaSaRyjF2MTY0(vf2Xt%@1KNWC*Z9;7?_WtkA|K(qS7`l5Q@ zmh2FV>EhlIJvQ{j+{}9SdD}aS6{UhMnTz9u>f}3(kdpVaGUM4s9z~8bMMg!^nf*Gj zPqg4I6LO!fieTuavDBImpa4zMA&Wj#Kig6*S!zDTk9~hG{^bRL6G;_W7Fnt`P@V}Z zoU1<;SMfvyjLlo-L?So>TRo5p%Mwh6BtxJ87&Lq3($=i_AXks4HFs%0OoXbcbGN@N8yv7NHtyCIvE7=Sq38D(BdLUf0F;-b zp{9GvQ2R#cfpAw*N)iZzIPW-S;*Bu+L73kqvcdV{pPWBC_5^U%yzXoFk_7w0+EtGq z1IpgDo#1q(O9X)9Dy6*9`ml06<98r<;*z+{vjQ}f9M2t5Uupdy=(msJC^wER1vHRs zG<$eG-kIMbHb48qdP->fXl3fStz?$}ipVzkVWISSk`Jg;n3l)(Eo5w3|9j@$*|Mo@ zG^sfH0260B4+YqMq*wTku4z8NxZYT?1YhTEynTOUV^b=Ky!6F}=$g)*pM6S4oxCOT zbD&C}SYV%R>87X)1UrY~c%R(_chbTbYbmif+TmrH&9jS^FJ{3i!V4rWhCY;eq`(o^ z#$k~>5fNyZW?=uv2jzJrgvh3fr;{09WFZd)%N~@2pvd2ml11(f^#CDNYAC9kk+$bi z2xkG-=@bvKcUVl`|4O1z61Om|Xb2ue1UV+$rjEEytIKfMxWldlR7{B(ZVJl;7v-~z zbKaK>r)->(P10Keqk|PNGa-+9!7YW%kA=5nAyFQE5nA`dy6>63wgj1GvFcO5 z8GR!qO@udG<+3gEYWRHr8Pjw=P?MUpQg5Z^VwnE!9s5MjF7NLt$(nWlY0WX%a&z?C z!4XfVJ&vSZk6SRW=F}j4wLnZGg7{P(v~X^+=`MOc`O#nmWr zNU_V7PFmlZApVrCPs|tmG5;5Z06C1k?6EX*NeIePReST;U5@xG$`aCMR~-+~8`0V_ z@nqEo81~46n6GJwlY2U88Vz-ekg*FfuPhi+6_6E-954j~;cP}s$hb8D%oX7=idtAL z#<}y=DJ3FvyEn3gpjO@&5wucPi>t151UJ~hK_N+L3UlXQC-ksjVkc+NAb)6)u!nWZ zkQ*jEZcL&hMm>u_1yD@!jpxcAck^xP;BFhTS|D7GN!}J=`){k@Xwvx#4C0x_c<6H7 zUQbhpS zC!z1BM<$dqNq^R{$q2Vh7*i5u<|hRK!y_vJ7KiC%m>2=lP3QLU|D;A@0z?7h> z(gbxhm4gN5Cn&hMXh!QQQMh&0Fr3+{&s4KVvM!;AX{40+t34_@;q}F|79bRqo0^PH$5ug6Is;I_Y5N6>ZIJAqH<4MX_c?q|l(0Sm! z_8)G?cut*hCiFKAARGy*iqInP|F^|{nKzZ7UGn)lMEbXb3C-3R{69H1GUrIDf$+wx zHE;`5%{6^mB^~6NaSRdY@s_3BfaE9QKq>|AqP9E;(rd^ zOx6I;U{o|TP17)d5{-I2iA_Xg_1{AvZl1!?J%kdI`shI*-nG6={$k3%WNw9b^hR-3 zNmJWU8`uI$YY3!8Y;`nwONNXTn&$eQ;=iqqO~IbKT)WNC$B;6f;ltXm-f{ z1N|;{RUp{Ak4fwt6unspIAx-Y48)l%UXa_R^QlJUF|upk%XE9&f9*HrZP4;yiIXrj zrP7;F7XNji+w=kmI?hKW&I8`jhZQ?#26(F96(C6D*aGrQL7TuF!qjpI^hWWVix zY)V)(Rk?P8g8tnx$T#0wE)fBMD>%~f)VEHp!%yGeDb(e>V>a=hn_BYkkmm=aNl}78 zr=RTxE^1v22=b2(hy64A?SCiJxyUc_k>3Bk5u?OP+~22*K(mpjm>WpGhJKews(ZBi zG6s0MD=#tB(*9wd0K!i~qh0Fs?Z7PsiY{5;v5rapp3IynYTI0P9Q`Fa@%Cb$%iDc* ziHV9*yj0xlT{G6BZ!gR$e0mx7-t(A6jrUnnm+4%d#%!98HH|hn0Rt>zlIo$Zt#A&D zDwmD9Xxfx+)aZ)x-5M63TX+K{AM;5(*}l}+cFf~c{YBV3KqVN{3{U$-f?$q1m7MQA z`fa13SPMdcztJq_#a3u}p>${1B8|dw9S+j1WwPZc2fe^{(}SooBD-99TO)Cu+$CIS z3I3E_2@KI)jSE|o0AFzO(s<1-&~i?!eQhYvFDr)JU}=AsW*f)4M2X9nU%z_-n+y%~ zHfzdt%<8$FUZLo1CRV!=va1Zt#x6{xd;cB;d$Us*23zY(hDT!~$&nUMGo6PIHzW#>93SYU z&4wS)S#j*}sNZcthI)4K0=wqopNEV4mhRK4vc68)&`yx?rh=onKV0Rcz1*7wI!TW(p=d5&X(&kY02wpqYiWOvKg^Hd~w8d!~(vC?eyD|vHXMP_n2aotZU4R zS5px=X;VcfkDcPqC;JIbTDG%+RZy+dFRoRe#$l6$JwJ+gkdpozDF?sB1P&~^~V$J&XnY5oOu9$!fY^%xK6041F%jZ z^!)Cik-x!Y3D;lr;*#XAP$me<&{i(->%(m@Ebsv>MFTy*QRrureE#Gc$}`m@@hzxr zQQN6=A`Bm<*SQx_W;EUP!|Jl`=iCQL!FXUZJYrGRvF3oJ zirGaI1zOU;$5<8n1K&u19BhQ*n6M~KBJKQ4LXWsjh7!Fu1deW1TjptjP5l>0Y`$9D z08`ps_S1e0CeH78+WQAn$|d8t(P()cdlJCUg&T3ap3S6c9h`y#uYl}co<*sPg}}oY z&8XyRUCK5f0%Kw=TL9u%R3jnjl<=aDmu{ZXP|wPRB9|O=*DW{lYKCaHD5`R zVc7WGjz~I-JJV1^!mkeogS^;RsaDJvn*E-kz!{k-bAtV42IEaHbS=vYbY}+RFbkJ; z&A)ZuarUNNZ_0YSU)n=%T{2o@YEic}94^Q}IxPE0spdXRs276ehi~35?LQj8Tf`vy zu~Ga;7ey=y)wDrQa9Q3RGH>mM>`{O-YDP3TmuvO`Xuaw6b@n5e8DRycGr{AUgLaf1 zx_si@V{th*WNl?)-gUhF#y9v@Z(Nlh{A$e979E5&a7lS-FT79VZR?A|)vkUul~kQW zv`O#ev&ExHTEGiscvDw^bQ`qKaA*a#Y%N};JsIzqnUD58AMyH2dqLwPD5TLlh3K~E zA16Vr0%#j!a4P=`dX6Yp#^uumQ{6JYm{D}P z*Wr>we54fB*FTiOsmh}n@`23;f|v-Eo_}A{jO!wb9nuWHcYOA!eR%s`MlZqi)x|Pt zJ&|TWix0Pdkwqa-P50h`#obs-5~iC-H$AiFW*hyBSa`62Ei;pAA21QYBeSp4w@_Vu z*+2;{obj_KOfbgPMmMIrvZG;iH6aIRRoRVKHtlod-@At7O-rKq#rflL9Hl!1)NaLm zHGyu({qk$UU;~c zY*S^hyk@#T<@dV}ErU1D4$~y#Ox>s(%%2-s@O&Lp9)>;jkh%#FjGrVG~jyuL(?C_O=5fZ%t~iz?pw!f#?Cn& zm6@(^J*U0sE$=;#Y^)hUWq7|gYS%l^U{%1A(c7uY+GDf=e&=sK4K4Q7sd7U0jShCk zG7eSb-BLEZhEwspa15?r7)}?UoITvWZ7cQ<>OaCB%!PM4)ci4%x5D9pFEvvi74Lyn z#1}>41u5j>)?z%;8}fm*OseIF;R6^C$!{mpP-W%`z2DrmwV8bklVN$fa6Z`M`L~FB zg71uk(0y&WmO?{83V%dPAG`EuT)QNAbm}N7V_(-nH2@6VaMIV_tQeBypDjo$wFufh z*Tx9b2oniOY*xI3ZXoFnH(k?Gzq$VT45~Djm=)Wydg_BmgoQU_t~GT}`?h^|v(fh1 zrau(=<%CK}s&(fb}>$-Sq*>+I-y{R(x3XWFsPQ7J`6w(EQLk2raNu zh$$zZO6E}!#D^33shfB$=Vx0xJVQT}Yl?wg1c;x3k$6Jn8*N*)m9Wquq|WK(o5;v&5c?rq63e;D-L12Z*-GZ6!&kEz8n_t$s0fu6gE@K>wSKsYK ze%4Z(Ficuw!j`PqPJ_bS+~Kzt_bMAOlI{dIwB^)juD@rwtLIzu{%-Hq6^62qCU?Hg zrKrcK40hzT6)_?N-goa50nVd*#XEkNRpIy6ezV`S-XSVQ4y{&eI*DjlixTVwOY^et z=yfd-6zsK6OH{ic(*r!-Omx-#Tr%cimZrn1QL^--;0XZRY>uE_1TN7No^%}Se#d*z zyS$#m?Yj5&KmiU_4_R8F3!_%4hB9E2x+wC{fSD>>gaW)m>Blcl{| zFsCF50Y!^_len_MNN5JM$fGKnekZy`1^bT31rfqtt@YziPT^30 zO{wY+o35{eJ=YqHuC+aMlhAvCYq!Hlt~<7R6w%joVR_U(P9EV(d>aMobMOiDWThgc zvTIaqBORKB8uXVm<|v(#Oryc?v3mr$`cp`dgP6jqT2YW>cPX+p>c9CeT*EY~pqkBp zgc9m+V;pa(De(;F%Xhz3@`Mq6U8a-f#WrV-0M-qy8yhy2|6*bt;g-$h`HmkDJisY4i3{ z(ZkQr)}#{1DF({Xtf+OhQaZ0kcDCyaFh~=f?E8Fz3ABFWraF%H==@9O<`2g9uYe3L z#C{Y#n0kK5!#E9_*3b*8!`Z7z0xNVR*?*Qrv9P*GsmT91-gy@a;7yryNVhMcE)dokt$kQ)4vHLx8V?oTl;sc`HWX~NaBv?>J7A}3rP8W`9a?f; zNpF}c@PT)22Id9#qBAC*ldE5)TeM|H9w~YDpFtY67-J#$5cME6uwDw*OA-;GBESD< z6dR6|Ol<-9yAI1-hx_>Z1wJ)~UT#n#K)7xL29iRUrk5?h$3~>`+e;=3_Fy1VENPrq zW`v^^9m7;(P_l%KGQce;IOqcT4Kv4>)RvX2i`py*V2xuq@f4j*M0QMJd3E52fE@Yf zQq~W=QB%%#Zf_vn>q$9ps`3V#++&v23=2{DqZ@?A)mP&LigXe8_&y;^J zCQT1}rMv2G=d$Q(ujv?2N2}Q6ir|(^Eeu)#FE&0es%2W7Hlc(SIEj3ZLn3S*3y6@5 zRa28q=YUSv`LfH94`U2YFylfci+KY+1*Du=-ICrSH)Oz--2|AQE%pkr=yVq|3`$w& zkUtL=vK*sbi(9k5VOAuL+JTVXtyQA*t+!S*aF0^9wuOB5S-p}B7$a&M zsLKFw9@{&!>ZyjazyWt3sRbj9YYOjgYMBUhn-u_Ta-irD`bGgoXNkmw_XWRgp2XMk zj#7)sZj5rVi{D_M3b4`z|0_a7z3|E!vcyD<3~vbi+u(Zz$7i_8#Wepdj|?yT<~|Eo zPDft|r+32>IuW>lJY3t57*eX*kA;z`!>hjs6@8SQ-Tw_s%YheGwXx|y6eLCG-*U)& zslbt|F9c(|G&pCc@7Knqs0!2>0nVT&XoUcX2($120MisVn#I42mRH{W4aa&%t?6AO zIF~5LJixNoF2-lcf&j7iF)ueKN)R=i8pFfQ_q=J5f`~&8Ap}%q$QB*+(r6HEcYY!& zk7%c~J4vOPXBADDCy_T`)j2fz9tY!qNPWkm*8Eixy&!oGZ>M3E<|e#C$v>U1K6f9~ zoR>(;ys&k0r3pi=WIbO973H*hUAasN4o@-uNpVly?f^^I)ZQD_AIw&1=aRG-6UmuI zU!AeoRXbY!JwJcp+Y0gK#un)Uw$9TO1X&f>&Kx8G*5r&%M|7(lJmsHi!2$vA9NJ86 zBs9SMgRml~O0@o$k7Q&!j6e4=>)7$+ry18o;Iuz$98gj@lhBgY+eu4L7;nk={DR~pD$Y%XoqvA1P zBQ9^Ldv)}|rFyaSL-{HHh9--jvcb}iG{zP0JsgsbObLvcd?B@*o8Ys5R4^aa=SyY* zae(OGc5_iXItA$U#8=Z4;d!R%&M*nA(nlmZcH*qPwvrpZCR6%cMVr>k9H35@$l{@X z5iIeYNDkTF1K9+a4a{rPb5veg>ORch<`0Kyffs%d`&TMZEdOb@-O~ z#-Tmc`{bXGOI3hPA{FUaLG^VbLjKy1{Xh#vBN^~*EqwDw{nV04K5aYK1;Zhlum8ye zEr}>JdCbT$r!K%Ws_$TY9{R@VY)ty6>-R4r*_vq4EJSPgKV8~vC?adK7|0N|+lk{7 zg7s_*Qn#@;mF+PhaiOfpzSC>K_`MQQcDwr>=G4OA$I27kk&GWA0fc2?kVN(jW9EF} z%eZwzmfgSDZgb-}vZ?$GQS1!=V6>Ah7#idLO|#qav!_u2`IsUH)_H&tY124}d!CUT zAEy?tRIY3p|6?@5YpWPVZTgIND!(KKzI99oE8AGz3e@Kn`;}=z#Z;W9Emlr|MOiDK z!+b|>(qW*q!~j!Dwk9q<#=na~^tpZ}zIT=WE@`qptOaSC0hD~HUvk9dLiFAcibmRq zItqG_Kf0pmZWpCRQRh#Mdy5_j2_*sv?!ufbm~ZU+a}e(@KJkR-d`K%ub`JM1x4*7* zOPC@(E`H^M#yt$^7hwt5bYnqJ;XBDd>6XF{`aykE=Ix|Soieh5w^s!S!2fJz_z}AS z$?A@A7YyJ$Iafh(l1Zda)P%Eh&^>lA=<2BC!r1tk9kyVaf{@gjNQgr*{7`B8s9=1^ z8&VlPUe$jaW>3^N8RR9%p*csn6fB3Eg;0pSplP%Y+<;e35h5&{3F_ugD+jKx^$!Qo zfBm`Qgat5HWB4B^@W!z1*wfQ?5j7&_US-X~pMRnhun2kyC-C%|>aD(xb#S-%q#^MT zq{MyzNpCA^EC#F{qz0R3h01FoWsD(D5kEgrCify8wqf5C6A#=<385)nwh!8cA#&n< ziiKV7fW|9~;H(sB{8Uy&$uZTXpTG_I^-YqnoW#xgm4|Q%CAm&LQ|?(tYAA}5FV)y@ znA^%s3{f5cnM?XL(KjLI#nE~89&ZK${8Sg{FXPLrYz_i`6H8G&fFZt4atze1vRA;2 z25@PT)Cu8}T6Pj8;Ru zwSND)gZ2q1DZmZA$f6%``I<1fn)2 zn&sZ74`Iivr-v!0;4k59&qXfUeTS)NI2nhZV$6j6#)unYfoVX@atu|}fxe=N%BE?# zl^}cpeWDd=aNXDDoWX@jtRmpjOI0e$+ytS)vCeU5Rfzv4>WC_!J+=v`<` ztKQAZ&=*AyGpz$#OQ-^85KH(*P3TBdlwE^VdLel|Gu*u$Eu$!?B5ux}WA^4kIi6>M zAEp$Z8*6`FuK>Wz!noFNa&`Rw{Tm3%!_4&QTc?MhH^?gGqjVp=_zyKk`xO(qLezDk zBV?lFAe9{sO`b%`(%a+CiWS0{S|JO$%Fv0$AfZkm2=;WWp>I;hU%nA8g7szv1QD@! zj1ybzocUKk_(crlpr!h+iTj%G2UO3q`AeWvj(dS8d^qYWk`qMJ0ZzOvBwsf{smY%!wcGR*UwW- zhw9Yy$g|=QxG_HQmKk1&c_~6iZBVmar)*q=7)OF~Z>MS1z*ZdsEF-^Ft1~L=1sGDy zWR%Zf;z+J@I1q8a?zZa6JM%K6nBP^Evi=g1{vkiqKDOiYT<+sCUuF$QewyZ61Whd! z^9_=ixc6S@B{vXhG?2lemIo5{yJa^)I!Z2ethX%gk4MkqrYo{~*4<}oeMr}euz|}D zrf7t+i8eMtMmvqd*2=!Reb)@$Y@o?_l_XJ2=<*4oT<1Q|Beb)^wrfO=1 z3;84ke0%kV=|5~$GOy0VQ)l1b*Plzlf;WE3rdn*^ZGa&$C+E`}O40>qNr= zrLURM#9g4*}hh82umZZvPytO&P_>6RB})2ce3i|L><{D%mT#2wTP3 zm$x*{7s3ZRsaP}*A}2W|E%TUnHs4-6@mWOHu9gf&C+se%yZH?)wa$9>)))1fA^SA& z_M9A*8Ho1ucHilA_OttG{0&~RLLwF-2Lp6|@tOLP{AEfc`N~`dO)Kvn%qb!NCv?;t zE;?-f#s}1X$*H`EUsN+Zji@$*KY)&kk6g{;bmkK#?zk8Uto6O}w8JhM|M^(n;HP-P zckQL>3Av-e#VSLhRg>*;(4})^#VzYSTG||ZjhZXX zB$-gt#Tq`MAOECTi%g;TK6RWOMj+U*3jf|&OA|Yj)ej?GoU;zXE+#K!ta)gC0s@)V zSVJbLC|N`toB_*=`nKD>xr&Kh!5X*HF8gDHnXr0E7<6O$Dp$z)Y0qRU2mvp}h+u(k zp_b&f-U62Gt-s%D6P}^0wzTKDO7s4WkHIcZ@>PH?1zl{yStPI5N7M)MAdmrI%jd5% zU)3K}j3*>b6G+;y2x4+d3s@dAx7?ve+h^NCV``D>WzsXVq-AtUzbbm>2x{I93&lJj zSknwbzqP);_$iRGGv1u~dHnhe3bH=%VY4dXHYhHM9fOMZR-EEQSs;n+WVX{I5KnD( zF^yfIsa)v$ko3U6K=!YYL9GeSC!fvB>t(KxtVn$!?>hR(__c_90a4Vo`t3z%nRh_Y zkV(4WWEzp*tw;!RGD4VKhcI025_}w$g_5RTeN^&YR_ggpUCHL}r6qa${l zj_8FqrUWt}oyf*oD}u>JyAq3#QKg})>6isS=nr`+I^WlTCX_PS`Ed;#=QF69{UBX5 zJKQ3_Qm4T>4PI_C7rqQjf6^>~-vsddfk-vI3m9H?E;eSr(uj27Sx{E{(Rlx;9nM}< z@t#gzNAv5ir#s4!By?Ua*_Jg+2a_?a;;aQ23QkF#l*IVHKhn+_K8?}qAU@Mi^4S7W=Q`cAf54?^i^kzM&{LM<39guY zs!3#iI#09MSu={QBN^gIt!x!?+}KlW$nFkPxwVp0*Bjq^k$pZW7*Rx4_$p3ncBu<&ax7G41|h++eX7|?yleTS5#d8K69g&+ zsoTp=3tRS8K>u`W8bxw%F7&CpMZ#uaz!>kyspqr$42*2k)VAo+a`VE4@5Jp$VqAiE zX80+9VlQ-1+~+-F4GHaTM?W1;l!>P9^t*1a?ba z0zILmT5)QFE3!))5$?Id>z6XZA)Y>Owm(6i2^f%PyON_?(gn0>LOY$gQ%Etf z6%Y6czlZEBUI8r9Ll~cKDDuHVg83dILj&j*uP_$WZBe`T{xF<2= zN#@(PXN#350#Y4VQ>j5!xesK6Rn<7%^m&nRix1is?#XZ#!^w}#PkFN%!OiN#bjyr~ za5sovl5u&u`Fl2j)&4zKN8jtwD(H!gzm~yU8ne&HI-a4Y`aG_q${?{{4*N_eMs~d} z!+7?&rqF;}&L#}!6l7=R*quqqutBa~?6q(P`Fi`6Dm&U2+j z8u`ZQni}!NQ@t{F4aF2h+aibz%#KXE@qdsos7eBF0e2VHkkG0rW^8+B>w=NO`+~$c zikxo`z8j}lfQLVlOFKk0si4YfN_qvYv7{oc;iM8-6h(z14Qm0E8@}x30O^**9f*2I zBQW8(<>>JG?Tv|A{Ewg1bxp`40}P;mJdWer;YnehnTf`B#5zJCnW@>usP+OQ z;Td>5VZ%v?g6QCvQh!}meQhYDJ=KR(UY&n;x_cY>qY_wM1ST#V@(H2E;xws8@1j?Z zcA3ASt_i2k8f_@tP6N0G&|9(XR(Me_lLG^_Mr|Q{Lu!`aWzom}*enIQTk-K<(c@aW zjvgvy|ItQrSZqLFnDD7=nZBvE@y(T~aaPbjB!(Yh3i)pRYDLI7G2O4FWPo2HZdr2( zxF=LbZpK>J+ztcfk5l%s_!Y!9OY`4c7S)rxsMTXKxj4o3j$Mm_tdH^nK#p!#gS<_V;Vmr-fLON<;(kqlrl`iryM9(bATpDDI?j!3{WLV8MqlA=h{snciv3FLGPftF9wH?2^{J`amV0(#GDZa3f(R5^DPWf0qjm<`i!1AB2SZOjI`|AfjY$}|u z_K1o@u?HDK)8V0YV|z_FS!~#lGCeXFn~&jNU@o}}b5eiL<61`yInHu~B=~spa6$v7 z3BIJ5<{uR1bPrZJXHI?`!*nPmNvdMMo2%YS9%b(ct`BE65CSSU7;#XzT?4`0>(SpN zkZ%8Zx{SPdpxHvfdbKha^wgph5o#@r|)GfdTVy9>|WlV_x^g;-@|b5eSQ~F)86^euARpADd;3N|mFwG;cP`L@Y zhdS}@--#5DrH9{!JI#Z+$)oiH&!(+Hu%ElzjuKafHZZI04PM&Sd4B zc1_;%Y7Lj7=cFzK4Y@Nr&7)|MUEPlDms;8zCn^OZ=;=l>ETX z_cE6Xe3|v-*5jW*+{8rSHpnX7Ulye}7>Zc<5$x@v#ea?^5ndLj8D2P?vtPh*$0?(! zk32(Bji(xPfXX1qx{*(7%Z>LBbIQUB$Zi#)*PjBgXaoECzXhAH9+fT7Ti%PMO#M6m z6P9H#qf82>n?m~wrJ1yoe4WDXJT3*Oz+J91;iY?tXFGt4I zte=dPXN`uGYvrStkHI;-F-TUU^d2Ioc}=($2FLYWEXNKE5SUywXJm34w2t zuTjH;-$@%`V31X<_2hGO5fZpriDd#Z3grNN2z{pC5%JrQAH=N?aZ~u-BT?PJ(EoN9 z3X?!}<|aj~9#3n37}|0(lVQ8d(*C_RdAeojCfx#REsCL*Rd2(4vF5YamLjdrboWI8 zsV|!8Xifw!Y@&p}KT!D2FhNEJ{S8+?%A_@H@m4bACZ3X605CY4V*BvNaYKSYyy}!D zqL+NA(MKp+j~Cs|7*zA@_U~<`LoQHz+Tf{#<;tPIkFt5z;Ji^ez+f1pKwa{asVXbg z?A*349-jT>gdaD+M8(vd7}nPXZ&6@<&j-lZuAb%=oFy<@b|kVq+b$A?Nin5g&T5d# zQ9aKB%jd;z3qt~I4!D5B|H87#$K}Z-pxdNseW5-u*!juYe7vp<$_rDX-J-YN&VaT8 z6vbWrt>j`4>wL^ua7YdXBr~)1Wo4mW3^d4j{d_SmT z5{+|A{-lieswdF$Dc9V1E`IkF!~*R?nzatKT@0x|dGD z$wg?aOffOfg!+Esi+<(Rd}7m9#<_h7QrlDB%{Zdc*z*p$&7BIm1%sm1oW^bxBTYj7^}Z+ zp@RpZ3@QXL>Lu)yN6Tuy2f96T_t4c1B(O`!b8fO5Gl&UitcD+oW4~&1=+QKWw>fO< zUlGKXCpAC}7)yqn))3dcjs4;Jx08h=Q<-YNET~W3BXBC zO^|mLcqauRXJ~F+Zo!Ly*{eGBv?n9_q3pD)MSGbW4#sV6Ne{u`lZDaDKK;V4;LUPO z#9}f8lfBthVMSLvX(-_UKQwx%1@Df%~I^zd+xz)DEB|v%(W6_+N-1~&;HDOjsQ7riMH-|%_`_*-=5qN47 zfg%D`DoO>P)g}3}MrH`pYlftHFJ<1q6-IH=`b5yiJ ziVCVzB~qge*NhoIa$PlGm<5_D{iXsKFPo7M=l}h$IbmaXj-t(jVf@$TQwd|1pjZF8 z2$Lki2TjGPaz1ahxayvfB~Zp$1E_#Q9(*cBCo1dxy<}Uy?{gLd0d7_5oMbM z-)!(6wEF(=r(}-Neai79Xz`pCu0ijzV7toCQBCD3BYU`>+Lvp-AEx!lP~)SJbf1FI zyWq9N8o@?YsE&1{`C%?;3k>1P9n@gDikfI4ZbrgvBd{lcvPmIjaFuU@k8Z(2BFv$? zM0!6OV+DN%l%!zV)&T$UET;9gw;m-;5@gWSk*v^&GJNL{>wyE}o-vTlZ|aR7nllgI{F;|p`cPD!WJZ2HH?`MF0cUvQ>K-sK~hf~erMGI z{3|jy<>Hl)cy;!-dUrcxKPUrWU9G}kb3F5EwdB4&2j!Xaj~$wZ*l_6m19l@zK~JK+ z0*)X&!?(7ES~=Hv_wjF?EK{^U6BCXqla^^%0LuI>W zGp!BE-|Ufe}7>4=W;^&pMSYi{nx= zP91IfW059SyS8ePOY+7o*aZdfX`ismsCp|iKUskF&e9Mgwo5_azr%g?I1DjxZn0Jg z;dJwr_DZe|wUfVArX|{HbIhe*)ZMVq;nsZPXp+YVv_f5Wg_H1zm(tN*fb}f9>VsRF z=k5~2;K*HvoqtGBz?$H43Co_pV_H)8~H$?7=Pj$dmBCmeIm1ma5mh#OO3`K}rjbYQl zh7H9(L&*#j1d-d)6Pxl+qpiflfM0Jp>{lv^H+ zMY&hzr5*i3DLonyG@@V(4$lii!t)X?CJ_dCVaK8YTVOHxel?(=WG*uzW(T^DT~B-9 z(w_2ucF>~D3WZ+^yYrc^t)~bY5-f?4t#mGV{b7iTo<=m`}XnOUatg#i=dJ0pw1>w z{5X_HgnPpWEK+CI&vy(<6jR;{QZH_~R#QXHS0|QDAi;>Q?=+ls;%p^Zg1}scvy8N! zgGR>&R{OR+F(YL+3nw~Biq@p8(E5geps+zq^x2^> z3w(?nDZ;$KkV@}`pLg(Rf ziFDkR5_lsTaZ@;fN^4|6J{?E8Gv#t1XsRnUj9HD zZTK6}?b9!eHvW-BLjcW-98-xj{?|>%Sc=T|64T26i_mpNLC?KlN&oWzJf+fUu_2;c zrc{Y4L`^8GkjkG#i8|YOpzpZZsi@)qQ!T)ypG+db@{o>t@?YerqoeEW&pgz044*l% zbk6?tE6uN#PCl7-;TSu3`lo_cts=Is9sAy5;Zt>ziB8kzvsQ0!uT`(ON^{@U<@u%ZA(K)Syz z2b^(`)%_Tel_f-6pTllT%|E>#`a*3Fm{Je17dZvL3db`Q9JwJy4o&Ej3t0tX=-W_iF9V zePmC;Yz06EXz|08CI(L!(3J=)f(uTtFnGLYS@#)Z{o!)iODrvnVRaJ2+Jw8V}(MHRc7#_=U5#`faM zG*~`NRsOWl?32tKe94A6_IXru&L?hV1bdz9e54h+cbhi2Mm1@H%63;$B?>&tAmHhd z9BHBZzX5bLaO#RKPR5*r5bY*;$rr|0gy-G2TuVx-x5gS^I2Uh->?nVj&DGg(T=A)1 zymf0mO<~@r!Mu(%1m0=gkeTQ>=Ha&{KHcgw(jU<=G!&vO>zKt0HV3F}ivmRz9Avvm z34RZ4#gKyk@EwAByzCT5<~k#X;rx$xkgPc%ELn?9<630Q~ z<)@Dvv&>kunnf;kiQ!@2D>d??f6R$9Ir16E@ovU|yfT6oxr6q6qdoiku%b`}|NB4MBDT%ljXg?#Y0!$U8 z8(5!<*|qX&=*yKch)2m4!iAU5H@yl3%@+kQvN=))?=eQZuL28(yn{w91OAc)97nDS zrf%5yi$aas>FUeXDl*@~!(jH@Uz0a~!w0~iE)f+AkpwBF`#HdZ#K4eY!2T!4SoAT!<3|&fbu*1BxUFx;iY%p z`+4D#y)VfzrOyx4#|>;u$L!BYSCv^Eq3sBo(&8xe$@*p8Ax|R3GQt3t3q(55iCNylN?ivzqIx25)osA}U4o*;Pmj{~_kIkh%|WAHGmq+O&Wbkl)QOtP zvld$5c-z*`&I-_bB5+P*=u$4eFEe7-NRd%cvXsU5G>-ep61P}JMaoNuzl*Amt=xJO zU0R9@?wO|0d|o8gN{^iD?p-6c?at#MQ~CH zk{QuNq0>-U$TMtm2r^!zxgkEKw9*CFZMOK!p*38s%3?=f$-01(G)W3;7I6u(K98AH zkSB)H@G1YjD3(A^0y*pFt|^AaL*la0_pH$bUnFG`Vt+o!ThbBqh1(&(=5=1>7S~Q~ z$lC15xxUyo*&730a>+{H!+RTUKjS|m&sc-IPK%_;t`pb`I&*XybPSTB7&IbOA22^! zU}k0aT3Uc5BhNi6e&SVXFOyD{WD1?LFlqLv{G-$J<{Km+2{w2IZv@(GOy+S;=(>owy&4~g@i#wCC2`PwOR*r#ZW1j}zbLM%7j~4K z->TrTFsF8}cYbggUV7KxQACz-gSV$w&*S%rk Z>q;IdHdgA~C1CG(nrW~c9+5>v$; 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%0D$ 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�|xC z&}sxP>&P>EvU5+%TXbQkmtxnQV7UKJLQ=8_SRbwz!rZ%|2hT*kRG6{kp*=u>&~uTEkBuX`uM_g@zg@s)`{bckU?##&Uy#Om8a@IcGZv%)6sNkxviv$_x& z^G&7bO`7~^vaBbsCKa&bb=rx$z}uW`=aJqPyfdn|SKdLeC!6D|uN(f|GFTSVTv}a? z`W?k90@0(BK)e)@GUAY;ljdESn^tLW-}_dNCeE@SxKRDlVGbNQQpY4cnL+Z{Do-&Q z(-J1fX*~&6F+v8v5YD%3O3{WNMdj7H(iC*71N8oI<>Mm-Hbn z*xq-^sHe)OC7q;n9$h5M2ZG5#lQ@{dVAIBbF51@~)fz11h*MA#Xy0!>`QMj=FR4W~ zZD|%zf8bRiQf*=VO8c_2od~nI0ndTLIUc5QOdd{teqAyZjF5HC;3GsL{Z_q@5ykh6 zy$g_w{Aj_qmXQY}E{JzFpvIj2EqK)_0U7DIAfh|&Z2$7goB0m57MB3<3R~aE_+2^d zszmnOp5pOGk0|NXnpfe@;}kIjLrzPvkfCQjQt3i#3{!Yyje0lwcP;m{MpSWr{ae4U zlI3Os{q3Z9QjaOCnb!9q2K3pz=i+SS4K9KYx%hR~_!ra{SBJd$6}kHmXUmGr4(KnavFOK4ubXUp$#Fs?tgtF1AdyHm+L zxkbB6Yy66ML(e7k3iwdiFLxVXD5JT?(Z3Qj4gC_9ND5hc_gG>i$N7&?XD7z;O<#Oo|I>mveD`V$v$Q)4c zdO;o0%2e3?3PA`Bl(2!+s3vG=y#8QHrKp(F&pSR)(EM}?IEtZ>}^Mh=oyeX|G4(#frFu@m_ zpAWKpPyxo7B2q6ha&@mYx=LmHP2q)H&yLS{3|tXl+gf7_cHVo~5KTudk=jMgAK`@^ zxa7F(`ikkbpbwk;YxPhoJcG`p{ffSVa{eA?6_K-sR0!^hS#VO+wS!b>D%)urD)>K> zvb*~4jd9vK?`dAn^%Nahn-HY6*O|CF1onKr!ZW{mFK2n(&58`6hX>=^;o5@s9{;H< zG_y`mN*0TolEE%un_pD=rt=OhQQKG0^Q6Zzl@e0RyKL+qmEtH$srXhu_S0z#S)vLc zjdqNU;vO^e+Fuf7a1?MdS{wwECj}L37p4Cz!7zQ_ixPfPa6%r=FtRGraEUxk~0rQ~voSOSf8q6ZECq_bN#+hciMR(E;XN str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def _write_equity(data_root: Path, ticker: str, *, missing_second_bar: bool = False) -> None: + equity_root = data_root / "equity/usa" + daily = equity_root / "daily" + maps = equity_root / "map_files" + factors = equity_root / "factor_files" + for directory in (daily, maps, factors): + directory.mkdir(parents=True, exist_ok=True) + + rows = [ + ("20240102", 100.0, 102.0, 99.0, 101.0, 100), + ("20240103", 110.0, 112.0, 109.0, 111.0, 100), + ("20240104", 120.0, 122.0, 119.0, 121.0, 100), + ("20240105", 130.0, 132.0, 129.0, 131.0, 100), + ("20240108", 140.0, 142.0, 139.0, 141.0, 100), + ("20240109", 150.0, 152.0, 149.0, 151.0, 100), + ("20240110", 160.0, 162.0, 159.0, 161.0, 100), + ("20240111", 170.0, 172.0, 169.0, 171.0, 100), + ] + if missing_second_bar: + rows.pop(1) + lines = [] + for date, open_, high, low, close, volume in rows: + prices = [int(round(value * 10_000)) for value in (open_, high, low, close)] + lines.append(f"{date} 00:00,{prices[0]},{prices[1]},{prices[2]},{prices[3]},{volume}") + + ticker_lower = ticker.lower() + with zipfile.ZipFile( + daily / f"{ticker_lower}.zip", "w", compression=zipfile.ZIP_DEFLATED + ) as archive: + archive.writestr(f"{ticker_lower}.csv", "\n".join(lines)) + (maps / f"{ticker_lower}.csv").write_text( + f"20240102,{ticker_lower}\n20501231,{ticker_lower}\n", encoding="utf-8" + ) + (factors / f"{ticker_lower}.csv").write_text( + "20240102,1,1,1\n20501231,1,1,0\n", encoding="utf-8" + ) + + +def _prepare(root: Path) -> tuple[Path, Path]: + project = root / "lean_project" + shutil.copytree(PROJECT_SOURCE, project) + shutil.copy2(SUPPORT_SOURCE / "lean.json", root / "lean.json") + data = root / "data" + shutil.copytree(SUPPORT_SOURCE / "data", data) + _write_equity(data, "MLNATV") + _write_equity(data, "MLMISS", missing_second_bar=True) + return project, root / "lean.json" + + +def _command_version(command: Path) -> str: + result = subprocess.run( + [str(command), "--version"], check=True, capture_output=True, text=True, timeout=60 + ) + return result.stdout.strip() + + +def _image_identity() -> dict[str, Any]: + result = subprocess.run( + ["docker", "image", "inspect", IMAGE], + check=True, + capture_output=True, + text=True, + timeout=60, + ) + payload = json.loads(result.stdout)[0] + labels = payload.get("Config", {}).get("Labels", {}) or {} + return { + "engine_version": labels.get("lean_version"), + "image": IMAGE, + "image_id": payload["Id"], + "platform_artifact": PLATFORM_ARTIFACT, + "python_version": labels.get("python_version"), + "target_framework": labels.get("target_framework"), + } + + +def _run_case( + command: Path, + root: Path, + project: Path, + lean_config: Path, + case: str, +) -> dict[str, Any]: + output = root / "outputs" / case + result = subprocess.run( + [ + str(command), + "backtest", + str(project), + "--lean-config", + str(lean_config), + "--image", + IMAGE, + "--no-update", + "--output", + str(output), + "--parameter", + "case", + case, + ], + cwd=root, + capture_output=True, + text=True, + timeout=600, + check=False, + ) + if result.returncode != 0: + error = f"STDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}".strip() + raise RuntimeError(f"LEAN case {case} failed: {error[-20_000:]}") + artifact = project / f"lean_native_{case}.json" + if not artifact.is_file(): + raise RuntimeError(f"LEAN case {case} did not emit {artifact.name}") + return json.loads(artifact.read_text(encoding="utf-8")) + + +def _equal(actual: Any, expected: Any) -> bool: + if isinstance(actual, float) and isinstance(expected, (float, int)): + return math.isclose(actual, float(expected), rel_tol=0.0, abs_tol=1e-8) + if isinstance(actual, list) and isinstance(expected, list) and len(actual) == len(expected): + return all(_equal(left, right) for left, right in zip(actual, expected, strict=True)) + if isinstance(actual, dict) and isinstance(expected, dict) and actual.keys() == expected.keys(): + return all(_equal(actual[key], expected[key]) for key in actual) + return bool(actual == expected) + + +def _project_contract(case: str, payload: dict[str, Any]) -> dict[str, Any]: + events = [ + [ + event["status"], + event["direction"], + event["fill_quantity"], + event["fill_price"], + event["fee"], + event["event_time_utc"], + ] + for event in payload["events"] + ] + final = { + "cash": payload["cash"], + "position": payload["position"], + "total_fees": payload["total_fees"], + "total_portfolio_value": payload["total_portfolio_value"], + } + if case == "default_models": + return {"models": payload["models"]} + if case == "target_sizing": + return {"events": events, "final": final, "target_quantity": payload["target_quantity"]} + if case == "explicit_costs": + return {"events": events, "final": final, "models": payload["models"]} + if case == "default_full_fill": + return { + "events": events, + "final": final, + "source_volume": payload["observations"][0]["volume"], + } + if case == "fill_forward": + synthetic = next(row for row in payload["observations"] if row["date"] == "2024-01-03") + return {"events": events, "final": final, "synthetic_bar": synthetic} + return {"events": events, "final": final} + + +EXPECTED = { + "timing": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 1.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": 9889.0, + "position": 1.0, + "total_fees": 1.0, + "total_portfolio_value": 10060.0, + }, + }, + "default_models": { + "models": { + "brokerage": "DefaultBrokerageModel", + "buying_power": "SecurityMarginModel", + "fee": "InteractiveBrokersFeeModel", + "fill": "EquityFillModel", + "leverage": 2.0, + "slippage": "NullSlippageModel", + } + }, + "target_sizing": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 98.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": -781.0, + "position": 98.0, + "total_fees": 1.0, + "total_portfolio_value": 15977.0, + }, + "target_quantity": 98.0, + }, + "submission_sequence": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["SUBMITTED", "SELL", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 1.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ["FILLED", "SELL", -1.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": 9998.0, + "position": 0.0, + "total_fees": 2.0, + "total_portfolio_value": 9998.0, + }, + }, + "buying_power_allowed": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 150.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": -6501.0, + "position": 150.0, + "total_fees": 1.0, + "total_portfolio_value": 19149.0, + }, + }, + "buying_power_rejected": { + "events": [["INVALID", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"]], + "final": { + "cash": 10000.0, + "position": 0.0, + "total_fees": 0.0, + "total_portfolio_value": 10000.0, + }, + }, + "buying_power_sequence": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 150.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ["INVALID", "BUY", 0.0, 0.0, 0.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": -6501.0, + "position": 150.0, + "total_fees": 1.0, + "total_portfolio_value": 19149.0, + }, + }, + "explicit_costs": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 1.0, 110.111, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": 9888.889, + "position": 1.0, + "total_fees": 1.0, + "total_portfolio_value": 10059.889, + }, + "models": { + "brokerage": "DefaultBrokerageModel", + "buying_power": "SecurityMarginModel", + "fee": "ConstantFeeModel", + "fill": "EquityFillModel", + "leverage": 2.0, + "slippage": "ConstantSlippageModel", + }, + }, + "default_full_fill": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 150.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": -6501.0, + "position": 150.0, + "total_fees": 1.0, + "total_portfolio_value": 19149.0, + }, + "source_volume": 100.0, + }, + "fill_forward": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-03 21:00:00"], + ["FILLED", "BUY", 1.0, 120.0, 1.0, "2024-01-04 21:00:00"], + ], + "final": { + "cash": 9879.0, + "position": 1.0, + "total_fees": 1.0, + "total_portfolio_value": 10050.0, + }, + "synthetic_bar": { + "close": 101.0, + "date": "2024-01-03", + "fill_forward": True, + "open": 100.0, + "volume": 0.0, + }, + }, + "terminal_holding": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 1.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ], + "final": { + "cash": 9889.0, + "position": 1.0, + "total_fees": 1.0, + "total_portfolio_value": 10060.0, + }, + }, + "final_bar_order": { + "events": [["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-11 21:00:00"]], + "final": { + "cash": 10000.0, + "position": 0.0, + "total_fees": 0.0, + "total_portfolio_value": 10000.0, + }, + }, + "liquidation": { + "events": [ + ["SUBMITTED", "BUY", 0.0, 0.0, 0.0, "2024-01-02 21:00:00"], + ["FILLED", "BUY", 1.0, 110.0, 1.0, "2024-01-03 21:00:00"], + ["SUBMITTED", "SELL", 0.0, 0.0, 0.0, "2024-01-10 21:00:00"], + ["FILLED", "SELL", -1.0, 170.0, 1.0, "2024-01-11 21:00:00"], + ], + "final": { + "cash": 10058.0, + "position": 0.0, + "total_fees": 2.0, + "total_portfolio_value": 10058.0, + }, + }, +} + + +def run(command: Path) -> dict[str, Any]: + command = command.resolve() + version = _command_version(command) + if version != f"lean {CLI_VERSION}": + raise RuntimeError(f"LEAN CLI differs: {version} != lean {CLI_VERSION}") + image = _image_identity() + if image["engine_version"] != ENGINE_VERSION: + raise RuntimeError( + f"LEAN engine version differs: {image['engine_version']} != {ENGINE_VERSION}" + ) + + with tempfile.TemporaryDirectory(prefix="ml4t-lean-native-") as temporary: + temporary_root = Path(temporary) + project, lean_config = _prepare(temporary_root) + actual = { + case: _run_case(command, temporary_root, project, lean_config, case) for case in CASES + } + + checks = [ + { + "id": case, + "actual": actual[case], + "contract_actual": _project_contract(case, actual[case]), + "expected": EXPECTED[case], + "passed": _equal(_project_contract(case, actual[case]), EXPECTED[case]), + } + for case in CASES + ] + project_files = { + path.relative_to(PROJECT_SOURCE).as_posix(): _digest(path) + for path in sorted(PROJECT_SOURCE.rglob("*")) + if path.is_file() + } + support_files = { + path.relative_to(SUPPORT_SOURCE).as_posix(): _digest(path) + for path in sorted(SUPPORT_SOURCE.rglob("*")) + if path.is_file() + } + data_payload = { + "full": [100.0, 101.0, 110.0, 111.0, 120.0, 121.0, 170.0, 171.0], + "missing_session": "MLMISS omits 2024-01-03 and enables fill_forward", + } + return { + "schema_version": 1, + "framework": "lean", + "engine": { + **image, + "source_commit": ENGINE_COMMIT, + }, + "cli": { + "package": "lean", + "version": CLI_VERSION, + "immutable_id": f"sha256:{CLI_SHA256}", + }, + "models": { + "account_type": "Margin", + "brokerage": "DefaultBrokerageModel", + "security": "Equity USA, daily, adjusted normalization, leverage 2", + }, + "source_references": { + "algorithm_settings": ( + "https://github.com/QuantConnect/Lean/blob/" + f"{ENGINE_COMMIT}/Common/AlgorithmSettings.cs" + ), + "brokerage": ( + "https://github.com/QuantConnect/Lean/blob/" + f"{ENGINE_COMMIT}/Common/Brokerages/DefaultBrokerageModel.cs" + ), + "fee": ( + "https://github.com/QuantConnect/Lean/blob/" + f"{ENGINE_COMMIT}/Common/Orders/Fees/InteractiveBrokersFeeModel.cs" + ), + "fill": ( + "https://github.com/QuantConnect/Lean/blob/" + f"{ENGINE_COMMIT}/Common/Orders/Fills/EquityFillModel.cs" + ), + "margin": ( + "https://github.com/QuantConnect/Lean/blob/" + f"{ENGINE_COMMIT}/Common/Securities/SecurityMarginModel.cs" + ), + "slippage": ( + "https://github.com/QuantConnect/Lean/blob/" + f"{ENGINE_COMMIT}/Common/Orders/Slippage/ConstantSlippageModel.cs" + ), + }, + "data": { + "format": "LEAN local equity daily zip, raw prices scaled by 10000", + "payload_sha256": hashlib.sha256( + json.dumps(data_payload, sort_keys=True).encode() + ).hexdigest(), + "sessions": [ + "2024-01-02", + "2024-01-03", + "2024-01-04", + "2024-01-05", + "2024-01-08", + "2024-01-09", + "2024-01-10", + "2024-01-11", + ], + }, + "oracle_files": project_files, + "support_files": support_files, + "oracle_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), + "checks": checks, + "passed": all(check["passed"] for check in checks), + } + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--lean-command", type=Path, default=ROOT / ".venv-lean/bin/lean") + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + try: + evidence = run(args.lean_command) + except (FileNotFoundError, json.JSONDecodeError, OSError, RuntimeError, ValueError) as error: + print(f"LEAN native behavior run failed: {error}", file=sys.stderr) + return 2 + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8") + failed = [check["id"] for check in evidence["checks"] if not check["passed"]] + if failed: + print(f"LEAN native behavior differs: {failed}", file=sys.stderr) + return 1 + print(f"LEAN native behavior passed: {len(evidence['checks'])} checks") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/native/lean_project/config.json b/validation/native/lean_project/config.json new file mode 100644 index 00000000..82dc4517 --- /dev/null +++ b/validation/native/lean_project/config.json @@ -0,0 +1,6 @@ +{ + "algorithm-language": "Python", + "description": "ML4T native LEAN behavior oracle", + "local-id": 771804201, + "parameters": {} +} diff --git a/validation/native/lean_project/main.py b/validation/native/lean_project/main.py new file mode 100644 index 00000000..940ffd48 --- /dev/null +++ b/validation/native/lean_project/main.py @@ -0,0 +1,136 @@ +# ruff: noqa: F403, F405, I001, SIM114, SIM401 +# region imports +from AlgorithmImports import * +# endregion + +import json +from pathlib import Path + + +class LeanNativeBehavior(QCAlgorithm): + def initialize(self): + self.set_start_date(2024, 1, 2) + self.set_end_date(2024, 1, 11) + self.set_cash(10_000) + self.set_brokerage_model(BrokerageName.DEFAULT, AccountType.MARGIN) + self.case = self.get_parameter("case") + ticker = "MLMISS" if self.case == "fill_forward" else "MLNATV" + security = self.add_equity(ticker, Resolution.DAILY, fill_forward=True) + security.set_leverage(2.0) + self.symbol = security.symbol + self.security = security + self.events = [] + self.observations = [] + self.submitted = [] + self.target_quantity = None + + if self.case == "explicit_costs": + security.set_fee_model(ConstantFeeModel(1.0, "USD")) + security.set_slippage_model(ConstantSlippageModel(0.001)) + + self.models = { + "brokerage": type(self.brokerage_model).__name__, + "buying_power": type(security.buying_power_model).__name__, + "fee": type(security.fee_model).__name__, + "fill": type(security.fill_model).__name__, + "leverage": float(security.leverage), + "slippage": type(security.slippage_model).__name__, + } + + def _submit(self, quantity): + ticket = self.market_order(self.symbol, quantity) + self.submitted.append( + { + "order_id": int(ticket.order_id), + "quantity": float(quantity), + "status": str(ticket.status), + } + ) + + def on_data(self, data: Slice): + bar = data.bars[self.symbol] if self.symbol in data.bars else None + self.observations.append( + { + "close": float(bar.close) if bar is not None else None, + "date": self.time.strftime("%Y-%m-%d"), + "fill_forward": bool(bar.is_fill_forward) if bar is not None else None, + "open": float(bar.open) if bar is not None else None, + "volume": float(bar.volume) if bar is not None else None, + } + ) + + first = self.time.strftime("%Y-%m-%d") == "2024-01-02" + final = self.time.strftime("%Y-%m-%d") == "2024-01-11" + if first: + if self.case in {"timing", "default_models", "explicit_costs"}: + self._submit(1) + elif self.case == "target_sizing": + self.target_quantity = float(self.calculate_order_quantity(self.symbol, 1.0)) + self._submit(self.target_quantity) + elif self.case == "submission_sequence": + self._submit(1) + self._submit(-1) + elif self.case == "buying_power_allowed": + self._submit(150) + elif self.case == "buying_power_rejected": + self._submit(250) + elif self.case == "buying_power_sequence": + self._submit(150) + self._submit(150) + elif self.case == "default_full_fill": + self._submit(150) + elif self.case == "terminal_holding": + self._submit(1) + elif self.case == "liquidation": + self._submit(1) + + if self.case == "fill_forward" and self.time.strftime("%Y-%m-%d") == "2024-01-03": + self._submit(1) + + if self.case == "liquidation" and self.time.strftime("%Y-%m-%d") == "2024-01-10": + tickets = self.liquidate(self.symbol) + for ticket in tickets: + self.submitted.append( + { + "order_id": int(ticket.order_id), + "quantity": float(ticket.quantity), + "status": str(ticket.status), + } + ) + + if final and self.case == "final_bar_order": + self._submit(1) + + def on_order_event(self, order_event: OrderEvent): + fee = 0.0 + if order_event.order_fee and order_event.order_fee.value is not None: + fee = float(order_event.order_fee.value.amount) + self.events.append( + { + "direction": str(order_event.direction), + "event_time_utc": order_event.utc_time.strftime("%Y-%m-%d %H:%M:%S"), + "fee": fee, + "fill_price": float(order_event.fill_price), + "fill_quantity": float(order_event.fill_quantity), + "message": str(order_event.message or ""), + "order_id": int(order_event.order_id), + "status": str(order_event.status), + "time": self.time.strftime("%Y-%m-%d %H:%M:%S"), + } + ) + + def on_end_of_algorithm(self): + payload = { + "case": self.case, + "cash": float(self.portfolio.cash), + "events": self.events, + "models": self.models, + "observations": self.observations, + "position": float(self.portfolio[self.symbol].quantity), + "submitted": self.submitted, + "target_quantity": self.target_quantity, + "total_fees": float(self.portfolio.total_fees), + "total_portfolio_value": float(self.portfolio.total_portfolio_value), + } + output = Path(__file__).resolve().parent / f"lean_native_{self.case}.json" + output.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8") diff --git a/validation/release_checks.txt b/validation/release_checks.txt index fa3b63a0..f2635fb8 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -9,6 +9,7 @@ validation/generate_parity_claims.py validation/performance_baseline.py validation/release_candidate.py validation/run_all_correctness.py +validation/run_lean_case_studies.py validation/common/comparator.py validation/common/correctness_evidence.py validation/common/data_generators.py @@ -19,4 +20,5 @@ validation/common/types.py validation/native/vectorbt_behavior.py validation/native/backtrader_behavior.py validation/native/zipline_behavior.py +validation/native/lean_behavior.py validation/scenarios/definitions.py diff --git a/validation/run_lean_case_studies.py b/validation/run_lean_case_studies.py new file mode 100644 index 00000000..3c307b26 --- /dev/null +++ b/validation/run_lean_case_studies.py @@ -0,0 +1,316 @@ +#!/usr/bin/env python3 +"""Run and retain fresh LEAN case-study parity evidence.""" + +from __future__ import annotations + +import argparse +import gzip +import hashlib +import json +import lzma +import math +import os +import shutil +import sys +import tempfile +import zipfile +from pathlib import Path +from typing import Any + +PROJECT_ROOT = Path(__file__).parent.parent +VALIDATION_ROOT = PROJECT_ROOT / "validation" +sys.path.insert(0, str(PROJECT_ROOT / "src")) +sys.path.insert(0, str(VALIDATION_ROOT)) + +from common.framework_registry import load_framework_manifest # noqa: E402 + +from ml4t.backtest._validation.case_study_lean import ( # noqa: E402 + RETAINED_ORDER_EVENT_ARTIFACTS, + compare, + lean_side, + run_ml4t_lean, +) +from ml4t.backtest._validation.lean_runner import ( # noqa: E402 + check_lean_cli, + make_lean_env, + run_lean_backtest, +) + +WORKSPACE = VALIDATION_ROOT / "lean" / "workspace" +DATA_DAILY = WORKSPACE / "data" / "equity" / "usa" / "daily" +SUPPORT = VALIDATION_ROOT / "lean" / "support" +CASE_STUDIES = ( + "chapter16_etfs", + "chapter16_sp500_equity_option_analytics", + "chapter16_us_equities_panel", +) +PROJECT_INPUTS = { + "asset_symbols.csv", + "config.json", + "main.py", + "ml4t_symbol_map.json", + "rebalance_dates.csv", + "weights.csv", + "weights.csv.xz", + "weights.csv.gz", +} + + +def _digest_bytes(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _digest(path: Path) -> str: + return _digest_bytes(path.read_bytes()) + + +def _atomic_write(path: Path, payload: bytes) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + handle, temporary_name = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent) + temporary = Path(temporary_name) + try: + with os.fdopen(handle, "wb") as file: + file.write(payload) + file.flush() + os.fsync(file.fileno()) + temporary.replace(path) + except BaseException: + temporary.unlink(missing_ok=True) + raise + + +def _copy_project(source: Path, destination: Path) -> None: + destination.mkdir(parents=True, exist_ok=True) + for name in sorted(PROJECT_INPUTS): + path = source / name + if path.is_file(): + shutil.copy2(path, destination / name) + + +def _prepare_lean_root(root: Path, project: Path) -> Path: + lean_config = root / "lean.json" + shutil.copy2(SUPPORT / "lean.json", lean_config) + data_root = root / "data" + shutil.copytree(SUPPORT / "data", data_root) + daily = data_root / "equity/usa/daily" + maps = data_root / "equity/usa/map_files" + factors = data_root / "equity/usa/factor_files" + for directory in (daily, maps, factors): + directory.mkdir(parents=True, exist_ok=True) + + symbol_map = json.loads((project / "ml4t_symbol_map.json").read_text(encoding="utf-8")) + for ticker in sorted(symbol_map): + ticker_lower = ticker.lower() + source = DATA_DAILY / f"{ticker_lower}.zip" + destination = daily / source.name + os.link(source, destination) + with zipfile.ZipFile(source) as archive: + first_line = archive.read(archive.namelist()[0]).decode().splitlines()[0] + first_date = first_line.split(",", maxsplit=1)[0].split()[0] + (maps / f"{ticker_lower}.csv").write_text( + f"{first_date},{ticker_lower}\n20501231,{ticker_lower}\n", + encoding="utf-8", + ) + (factors / f"{ticker_lower}.csv").write_text( + f"{first_date},1,1,1\n20501231,1,1,0\n", + encoding="utf-8", + ) + return lean_config + + +def _surface_checksum(surface: Any) -> str: + rows = surface.to_dict(orient="records") + payload = json.dumps(rows, sort_keys=True, separators=(",", ":"), default=str).encode() + return _digest_bytes(payload) + + +def _input_manifest(project: Path) -> dict[str, str]: + inputs = { + path.name: _digest(path) + for path in sorted(project.iterdir()) + if path.is_file() and path.name in PROJECT_INPUTS + } + symbol_map = json.loads((project / "ml4t_symbol_map.json").read_text(encoding="utf-8")) + for ticker in sorted(symbol_map): + data_path = DATA_DAILY / f"{ticker.lower()}.zip" + if not data_path.is_file(): + raise FileNotFoundError(data_path) + inputs[f"data/{data_path.name}"] = _digest(data_path) + return inputs + + +def _retained_order_paths(project: Path) -> list[Path]: + names = RETAINED_ORDER_EVENT_ARTIFACTS.get(project.name) + if names is None: + raise ValueError(f"No retained order-event layout for {project.name}") + paths = [project / name for name in names] + if not all(path.is_file() for path in paths): + raise FileNotFoundError(f"Retained order-event artifact missing for {project.name}") + return paths + + +def _encode_order_parts(raw: bytes, targets: list[Path]) -> list[bytes]: + if len(targets) == 1: + suffix = targets[0].suffix + if suffix == ".xz": + return [lzma.compress(raw)] + if suffix == ".gz": + return [gzip.compress(raw, mtime=0)] + return [raw] + + lines = raw.splitlines(keepends=True) + header, rows = lines[0], lines[1:] + chunk_size = math.ceil(len(rows) / len(targets)) + chunks = [rows[index : index + chunk_size] for index in range(0, len(rows), chunk_size)] + if len(chunks) != len(targets): + raise RuntimeError(f"Could not split order events into {len(targets)} retained parts") + return [lzma.compress(header + b"".join(chunk)) for chunk in chunks] + + +def _promote_case(project: Path, order_events: bytes, daily_equity: bytes) -> dict[str, str]: + order_paths = _retained_order_paths(project) + encoded = _encode_order_parts(order_events, order_paths) + for path, payload in zip(order_paths, encoded, strict=True): + _atomic_write(path, payload) + equity_path = project / "ml4t_daily_equity.csv" + _atomic_write(equity_path, daily_equity) + return { + path.relative_to(PROJECT_ROOT).as_posix(): _digest(path) + for path in [*order_paths, equity_path] + } + + +def run(lean_command: Path, *, promote: bool) -> dict[str, Any]: + manifest = load_framework_manifest() + target = manifest.targets["lean"] + if target.artifact is None: + raise RuntimeError("Frozen LEAN target does not define an engine image") + + lean_command = lean_command.resolve() + env = make_lean_env() + cli_version = check_lean_cli([str(lean_command)], PROJECT_ROOT, env) + expected_cli = f"lean {target.cli_version}" + if cli_version != expected_cli: + raise RuntimeError(f"LEAN CLI differs: {cli_version} != {expected_cli}") + + results: list[dict[str, Any]] = [] + raw_artifacts: dict[str, tuple[bytes, bytes]] = {} + for case in CASE_STUDIES: + source = WORKSPACE / case + with tempfile.TemporaryDirectory( + prefix=f".ml4t-{case}-", dir=VALIDATION_ROOT / "lean" + ) as temporary: + temporary_root = Path(temporary) + project = temporary_root / case + _copy_project(source, project) + lean_config = _prepare_lean_root(temporary_root, project) + output = project / "backtests" / "fresh" + runtime = run_lean_backtest( + lean_cmd=[str(lean_command)], + cwd=PROJECT_ROOT, + project_dir=project, + lean_config=lean_config, + output_dir=output, + image=target.artifact, + env=env, + ) + lean = lean_side(project) + ml4t = run_ml4t_lean(project, DATA_DAILY) + comparison = compare(lean, ml4t) + order_events = (project / "ml4t_order_events.csv").read_bytes().replace(b"\r\n", b"\n") + daily_equity = (project / "ml4t_daily_equity.csv").read_bytes() + summaries = sorted(output.glob("*-summary.json")) + if not summaries: + raise FileNotFoundError(f"LEAN summary missing for {case}") + passed = ( + comparison["sorted_fill_multiset_match"] + and comparison["fill_gap"] == 0 + and comparison["canonical_final_value_match"] + ) + results.append( + { + "case": case, + "comparison": comparison, + "inputs": _input_manifest(source), + "lean_fill_surface_sha256": _surface_checksum(lean["fills"]), + "ml4t_fill_surface_sha256": _surface_checksum(ml4t["fills"]), + "raw_daily_equity_sha256": _digest_bytes(daily_equity), + "raw_order_events_sha256": _digest_bytes(order_events), + "runtime_seconds": runtime, + "summary_sha256": _digest(summaries[-1]), + "passed": passed, + } + ) + raw_artifacts[case] = (order_events, daily_equity) + + passed = all(result["passed"] for result in results) + if promote and passed: + for result in results: + case = result["case"] + result["retained_artifacts"] = _promote_case( + WORKSPACE / case, + *raw_artifacts[case], + ) + + producer_files = [ + Path(__file__), + PROJECT_ROOT / "src/ml4t/backtest/_validation/case_study_lean.py", + PROJECT_ROOT / "src/ml4t/backtest/_validation/lean_runner.py", + PROJECT_ROOT / "src/ml4t/backtest/profiles.py", + ] + return { + "schema_version": 1, + "framework": target.evidence_metadata(), + "cli_observed": cli_version, + "comparison_protocol": { + "account": "DefaultBrokerageModel Margin; per-project leverage 2", + "costs": "Ml4tPercentFeeModel at project rate; ConstantSlippageModel(0)", + "fills": "timestamp, asset, side, quantity, price rounded to 4 decimals", + "terminal_value_quantum": "0.0001 USD", + }, + "producer_files": { + path.relative_to(PROJECT_ROOT).as_posix(): _digest(path) for path in producer_files + }, + "support_files": { + path.relative_to(SUPPORT).as_posix(): _digest(path) + for path in sorted(SUPPORT.rglob("*")) + if path.is_file() + }, + "promoted": bool(promote and passed), + "cases": results, + "passed": passed, + } + + +def _write_evidence(path: Path, evidence: dict[str, Any]) -> None: + _atomic_write(path, (json.dumps(evidence, indent=2, sort_keys=True) + "\n").encode()) + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--lean-command", type=Path, default=PROJECT_ROOT / ".venv-lean/bin/lean") + parser.add_argument( + "--output", + type=Path, + default=VALIDATION_ROOT / "lean/case_study_evidence.json", + ) + parser.add_argument("--promote", action="store_true") + args = parser.parse_args() + try: + evidence = run(args.lean_command, promote=args.promote) + except (FileNotFoundError, json.JSONDecodeError, OSError, RuntimeError, ValueError) as error: + print(f"LEAN case-study run failed: {error}", file=sys.stderr) + return 2 + if not evidence["passed"]: + candidate = args.output.with_suffix(".candidate.json") + _write_evidence(candidate, evidence) + failed = [case["case"] for case in evidence["cases"] if not case["passed"]] + print(f"LEAN case-study parity differs: {failed}; candidate: {candidate}", file=sys.stderr) + return 1 + _write_evidence(args.output, evidence) + print(f"LEAN case-study parity passed: {len(evidence['cases'])} cases") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 2ae02ff94a82669996be84786dfa05e9a76da126 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 01:07:08 -0400 Subject: [PATCH 08/44] feat(validation): compare complete canonical event surfaces --- docs/user-guide/profiles.md | 12 +- tests/contracts/test_behavior_coverage.py | 87 ++++++ tests/contracts/test_correctness_evidence.py | 37 ++- .../test_exact_validation_comparator.py | 92 +++++- .../test_framework_target_manifest.py | 2 +- .../contracts/test_parity_claim_generation.py | 16 +- .../contracts/test_validation_cli_outcomes.py | 8 +- tests/contracts/test_validation_scenarios.py | 8 +- validation/METHODOLOGY.md | 14 +- validation/README.md | 11 +- validation/behavior_coverage.toml | 266 ++++++++++++++++++ validation/common/canonical_records.py | 92 ++++++ validation/common/capabilities.py | 74 +++++ validation/common/comparator.py | 149 +++++++--- validation/common/correctness_evidence.py | 32 ++- validation/common/data_generators.py | 16 +- validation/common/ml4t_runner.py | 19 ++ validation/common/provenance.py | 18 +- validation/common/types.py | 56 +++- validation/framework_targets.toml | 8 +- validation/frameworks/backtrader.py | 32 ++- validation/frameworks/vectorbt_oss.py | 32 +-- validation/frameworks/vectorbt_pro.py | 31 +- validation/frameworks/zipline.py | 15 +- validation/generate_parity_claims.py | 5 +- validation/release_checks.txt | 2 + validation/run_scenario.py | 23 +- validation/scenarios/definitions.py | 24 +- 28 files changed, 1032 insertions(+), 149 deletions(-) create mode 100644 tests/contracts/test_behavior_coverage.py create mode 100644 validation/behavior_coverage.toml create mode 100644 validation/common/canonical_records.py create mode 100644 validation/common/capabilities.py diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index e3c325e6..360b3ad5 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -84,6 +84,13 @@ Profiles define behavioral defaults. Quote-aware feeds layer on top of them: you ## Profile Comparison +These tables report configured values. A profile value is not automatically an equivalence claim. +The [behavior coverage map](https://github.com/ml4t/backtest/blob/main/validation/behavior_coverage.toml) +identifies which field groups have both a native oracle and a cross-engine comparison. Target +sizing, insufficient-cash boundaries, competing same-session orders, partial fills, missing bars, +and late assets remain excluded from scenario-level equivalence where the map marks them +unpublished. + ### Execution | Setting | default | backtrader | vectorbt | zipline | lean | realistic | @@ -134,8 +141,9 @@ claim stop-order parity. Framework profiles are validated on the workloads each retained artifact declares: -1. **Scenario-level**: Exact trade-by-trade matching on the required synthetic matrix for - VectorBT, Backtrader, and Zipline. +1. **Scenario-level**: Exact ordered trade and fill matching on the required synthetic matrix for + VectorBT, Backtrader, and Zipline. Capability declarations identify reconstructed and + unavailable result surfaces. 2. **Large-scale**: Trade-by-trade comparison on a retained real-data workload. A claim is omitted when no passing artifact is retained for that framework. diff --git a/tests/contracts/test_behavior_coverage.py b/tests/contracts/test_behavior_coverage.py new file mode 100644 index 00000000..6bfba3c1 --- /dev/null +++ b/tests/contracts/test_behavior_coverage.py @@ -0,0 +1,87 @@ +"""Contracts for the profile behavior coverage map.""" + +from __future__ import annotations + +import json +import sys +import tomllib +from pathlib import Path + +_ROOT = Path(__file__).parents[2] +_VALIDATION = _ROOT / "validation" +if str(_VALIDATION) not in sys.path: + sys.path.insert(0, str(_VALIDATION)) + +from scenarios.definitions import SCENARIOS # noqa: E402 + +from ml4t.backtest.profiles import get_profile_config # noqa: E402 + +_COVERAGE = _VALIDATION / "behavior_coverage.toml" +_NATIVE_EVIDENCE = { + "vectorbt": ( + _VALIDATION / "native/evidence/vectorbt_oss-1.1.0.json", + _VALIDATION / "native/evidence/vectorbt_pro-2026.6.27.json", + ), + "backtrader": (_VALIDATION / "native/evidence/backtrader-1.9.78.123.json",), + "zipline": (_VALIDATION / "native/evidence/zipline-3.1.1.json",), + "lean": (_VALIDATION / "native/evidence/lean-18001.json",), +} +_SCENARIO_FRAMEWORKS = { + "vectorbt": {"vectorbt_oss", "vectorbt_pro"}, + "backtrader": {"backtrader"}, + "zipline": {"zipline"}, +} + + +def _native_checks(path: Path) -> set[str]: + payload = json.loads(path.read_text(encoding="utf-8")) + assert payload["passed"] is True + checks = payload["checks"] + if isinstance(checks, list): + return {check["id"] for check in checks} + return set(checks) + + +def test_coverage_map_accounts_for_every_framework_profile_field() -> None: + payload = tomllib.loads(_COVERAGE.read_text(encoding="utf-8")) + assert payload["schema_version"] == 1 + assert set(payload["framework"]) == set(_NATIVE_EVIDENCE) + + for framework, entries in payload["framework"].items(): + expected_fields = { + f"{section}.{field}" + for section, values in get_profile_config(framework).items() + for field in values + } + covered_fields = [field for entry in entries for field in entry["fields"]] + assert len(covered_fields) == len(set(covered_fields)) + assert set(covered_fields) == expected_fields + + +def test_published_dimensions_have_native_and_cross_engine_evidence() -> None: + payload = tomllib.loads(_COVERAGE.read_text(encoding="utf-8")) + lean_cases = { + case["case"] + for case in json.loads( + (_VALIDATION / "lean/case_study_evidence.json").read_text(encoding="utf-8") + )["cases"] + } + + for framework, entries in payload["framework"].items(): + evidence_sets = [_native_checks(path) for path in _NATIVE_EVIDENCE[framework]] + for entry in entries: + assert entry["name"] + assert all(set(entry["native_checks"]) <= checks for checks in evidence_sets) + if entry["published"]: + assert entry["native_checks"] + assert entry["scenarios"] + else: + assert entry["reason"] + for scenario_id in entry["scenarios"]: + if scenario_id.startswith("lean-case:"): + assert scenario_id.removeprefix("lean-case:") in lean_cases + continue + assert scenario_id in SCENARIOS + assert _SCENARIO_FRAMEWORKS[framework] <= set( + SCENARIOS[scenario_id].supported_frameworks + ) diff --git a/tests/contracts/test_correctness_evidence.py b/tests/contracts/test_correctness_evidence.py index c3a3e9bd..4d9d31bf 100644 --- a/tests/contracts/test_correctness_evidence.py +++ b/tests/contracts/test_correctness_evidence.py @@ -14,6 +14,7 @@ if str(_VALIDATION_DIR) not in sys.path: sys.path.insert(0, str(_VALIDATION_DIR)) +from common.capabilities import FRAMEWORK_CAPABILITIES, ML4T_CAPABILITIES # noqa: E402 from common.comparator import compare_results # noqa: E402 from common.correctness_evidence import ( # noqa: E402 build_report, @@ -32,8 +33,22 @@ def _complete_record(framework: str, scenario_id: str) -> ValidationRecord: scenario = SCENARIOS[scenario_id] prices, entries, exits = generate_inputs(scenario, framework) extra = {"total_commission": 0.0, "exit_price": 0.0} - expected = FrameworkResult(target.display_name, 100_000.0, 0.0, 0, extra=extra) - actual = FrameworkResult("ml4t.backtest", 100_000.0, 0.0, 0, extra=extra) + expected = FrameworkResult( + target.display_name, + 100_000.0, + 0.0, + 0, + capabilities=FRAMEWORK_CAPABILITIES[framework], + extra=extra, + ) + actual = FrameworkResult( + "ml4t.backtest", + 100_000.0, + 0.0, + 0, + capabilities=ML4T_CAPABILITIES, + extra=extra, + ) comparison = compare_results(scenario, expected, actual) provenance = { "framework_target": { @@ -49,12 +64,23 @@ def _complete_record(framework: str, scenario_id: str) -> ValidationRecord: }, "digests": static_digests(scenario, framework), "input_digest": input_digest(prices, entries, exits), + "capabilities": { + "framework": FRAMEWORK_CAPABILITIES[framework], + "ml4t": ML4T_CAPABILITIES, + }, "record_counts": { "bars": len(prices), "entry_signals": int(entries.sum()), "exit_signals": int(exits.sum()) if exits is not None else 0, - "framework_trades": 0, - "ml4t_trades": 0, + "framework_intents": int(entries.sum()) + + (int(exits.sum()) if exits is not None else 0), + "ml4t_intents": int(entries.sum()) + (int(exits.sum()) if exits is not None else 0), + "framework_orders": None, + "ml4t_orders": None, + "framework_fills": 0, + "ml4t_fills": 0, + "framework_closed_trades": 0, + "ml4t_closed_trades": 0, }, } return ValidationRecord( @@ -127,6 +153,7 @@ def test_complete_current_matrix_is_acceptable() -> None: ("adapter", "adapter digest"), ("profile", "profile digest"), ("comparator", "comparator digest"), + ("capability", "capability declaration differs"), ("expected", "comparison checks differ"), ("actual", "comparison checks differ"), ("missing", "comparison evidence must be complete"), @@ -141,6 +168,8 @@ def test_evidence_mutations_fail_closed(mutation: str, expected_failure: str) -> record["provenance"]["input_digest"] = "0" * 64 elif mutation in {"adapter", "profile", "comparator"}: record["provenance"]["digests"][mutation] = "0" * 64 + elif mutation == "capability": + record["provenance"]["capabilities"]["framework"]["fills"] = "unavailable" elif mutation in {"expected", "actual"}: record["comparison"]["checks"][0][mutation] = 12345 else: diff --git a/tests/contracts/test_exact_validation_comparator.py b/tests/contracts/test_exact_validation_comparator.py index bfe69873..898b532c 100644 --- a/tests/contracts/test_exact_validation_comparator.py +++ b/tests/contracts/test_exact_validation_comparator.py @@ -36,13 +36,29 @@ def _load_benchmark_suite(): return module -def _trade() -> dict[str, object]: +def _trade(*, offset: int = 0) -> dict[str, object]: + entry_time = pd.Timestamp("2024-01-02") + pd.Timedelta(days=offset) return { + "entry_time": entry_time, + "exit_time": entry_time + pd.Timedelta(days=1), + "asset": "AAPL", "entry_price": 100.0, "exit_price": 101.0, "pnl": 10.0, "size": 10.0, "direction": "Long", + "commission": 0.0, + } + + +def _fill(*, offset: int = 0) -> dict[str, object]: + return { + "timestamp": pd.Timestamp("2024-01-02") + pd.Timedelta(days=offset), + "asset": "AAPL", + "side": "buy" if offset == 0 else "sell", + "quantity": 10.0, + "price": 100.0 + offset, + "commission": 0.0, } @@ -65,10 +81,24 @@ def test_zipline_nine_dollar_difference_fails_despite_diagnostic_tolerance() -> assert "diagnostic_limit=$10.0" in checks["total_pnl"].message -def test_scenario_trade_fields_require_exact_equality() -> None: +@pytest.mark.parametrize( + ("field", "changed"), + [ + ("entry_time", pd.Timestamp("2024-01-03")), + ("exit_time", pd.Timestamp("2024-01-04")), + ("asset", "MSFT"), + ("direction", "short"), + ("size", 10.00000001), + ("entry_price", 100.00000001), + ("exit_price", 101.00000001), + ("pnl", 10.00000001), + ("commission", 0.00000001), + ], +) +def test_scenario_trade_fields_require_exact_equality(field: str, changed: object) -> None: expected = FrameworkResult("Backtrader", 100_010.0, 10.0, 1, trades=[_trade()]) changed_trade = _trade() - changed_trade["exit_price"] = 101.0000001 + changed_trade[field] = changed actual = FrameworkResult( "ml4t.backtest", 100_010.0, @@ -82,7 +112,61 @@ def test_scenario_trade_fields_require_exact_equality() -> None: assert comparison.passed is False trade_check = next(check for check in comparison.checks if check.name == "trade_level_match") assert trade_check.passed is False - assert "exit_price" in trade_check.message + assert field in trade_check.message + + +@pytest.mark.parametrize( + ("field", "changed"), + [ + ("timestamp", pd.Timestamp("2024-01-03")), + ("asset", "MSFT"), + ("side", "sell"), + ("quantity", 10.00000001), + ("price", 100.00000001), + ("commission", 0.00000001), + ], +) +def test_scenario_fill_fields_require_exact_equality(field: str, changed: object) -> None: + expected = FrameworkResult("Backtrader", 100_010.0, 10.0, 1, trades=[_trade()], fills=[_fill()]) + changed_fill = _fill() + changed_fill[field] = changed + actual = FrameworkResult( + "ml4t.backtest", + 100_010.0, + 10.0, + 1, + trades=[_trade()], + fills=[changed_fill], + ) + + comparison = compare_results(SCENARIOS["01"], expected, actual) + fill_check = next(check for check in comparison.checks if check.name == "fill_level_match") + + assert comparison.passed is False + assert fill_check.passed is False + assert field in fill_check.message + + +@pytest.mark.parametrize("mutation", ["missing", "duplicate", "ordering", "malformed"]) +def test_scenario_record_shape_negative_controls(mutation: str) -> None: + expected_trades = [_trade(offset=0), _trade(offset=2)] + actual_trades = copy.deepcopy(expected_trades) + if mutation == "missing": + actual_trades[0].pop("asset") + elif mutation == "duplicate": + actual_trades.append(copy.deepcopy(actual_trades[-1])) + elif mutation == "ordering": + actual_trades.reverse() + else: + actual_trades[0]["pnl"] = float("nan") + expected = FrameworkResult("Backtrader", 100_020.0, 20.0, 2, trades=expected_trades) + actual = FrameworkResult("ml4t.backtest", 100_020.0, 20.0, 2, trades=actual_trades) + + comparison = compare_results(SCENARIOS["01"], expected, actual) + trade_check = next(check for check in comparison.checks if check.name == "trade_level_match") + + assert comparison.passed is False + assert trade_check.passed is False def test_wrong_execution_profile_remains_a_detected_negative_control() -> None: diff --git a/tests/contracts/test_framework_target_manifest.py b/tests/contracts/test_framework_target_manifest.py index d54132fc..5fabf58b 100644 --- a/tests/contracts/test_framework_target_manifest.py +++ b/tests/contracts/test_framework_target_manifest.py @@ -60,7 +60,7 @@ def test_scenario_targets_define_reproducible_interpreters() -> None: target = manifest.targets[framework_id] assert target.environment assert target.python_env_var.startswith("ML4T_") - assert target.required_scenarios + target.unsupported_scenarios == 16 + assert target.required_scenarios + target.unsupported_scenarios == 17 def test_benchmark_runner_uses_frozen_target_environments() -> None: diff --git a/tests/contracts/test_parity_claim_generation.py b/tests/contracts/test_parity_claim_generation.py index 74f80c8d..af24ff56 100644 --- a/tests/contracts/test_parity_claim_generation.py +++ b/tests/contracts/test_parity_claim_generation.py @@ -41,6 +41,18 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( monkeypatch: pytest.MonkeyPatch, ) -> None: correctness = generate_parity_claims._load_json(generate_parity_claims.CORRECTNESS_EVIDENCE) + correctness = copy.deepcopy(correctness) + for framework in generate_parity_claims.SCENARIO_FRAMEWORKS: + framework_records = [ + record for record in correctness["records"] if record["framework"] == framework + ] + if len(framework_records) < len(generate_parity_claims.SCENARIOS): + added = copy.deepcopy(framework_records[-1]) + added["scenario_id"] = "17" + added["scenario_name"] = "High Event Count" + added["required"] = True + added["status"] = "pass" + correctness["records"].append(added) large_scale = generate_parity_claims._load_json(generate_parity_claims.LARGE_SCALE_EVIDENCE) monkeypatch.setattr(generate_parity_claims, "correctness_report_failures", lambda _: []) @@ -50,7 +62,7 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( assert pin["version"] in claims assert pin["source"] in claims assert f"`{pin['profile']}`" in claims - assert "15/15 exact" in claims + assert "16/16 exact" in claims assert "225,844 trades" in claims assert "No large-scale claim is published for Backtrader" in claims @@ -62,4 +74,4 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( ) failed_record["status"] = "comparison_failure" failed_claims = generate_parity_claims.render_claims(failed_correctness, large_scale) - assert "14/15 pass; blocked by scenario 15" in failed_claims + assert "15/16 pass; blocked by scenario 15" in failed_claims diff --git a/tests/contracts/test_validation_cli_outcomes.py b/tests/contracts/test_validation_cli_outcomes.py index aa28d0a2..30dd1b24 100644 --- a/tests/contracts/test_validation_cli_outcomes.py +++ b/tests/contracts/test_validation_cli_outcomes.py @@ -195,7 +195,7 @@ def test_release_gate_fails_for_every_non_optional_nonpass_status() -> None: assert run_all_correctness.release_gate_passed(records[:1]) is False -def test_unavailable_vectorbt_pro_matrix_cannot_report_sixteen_passes( +def test_unavailable_vectorbt_pro_matrix_cannot_report_all_passes( monkeypatch: pytest.MonkeyPatch, ) -> None: def unavailable(framework: str, scenario_id: str, **_kwargs) -> ValidationRecord: @@ -212,9 +212,9 @@ def unavailable(framework: str, scenario_id: str, **_kwargs) -> ValidationRecord records = run_all_correctness.run_all_validations(frameworks=["vectorbt_pro"]) summary = run_all_correctness.summarize(records) - assert len(records) == 16 + assert len(records) == 17 assert summary["pass"] == 0 - assert summary["unavailable"] == 16 + assert summary["unavailable"] == 17 assert run_all_correctness.release_gate_passed(records) is False @@ -240,7 +240,7 @@ def test_report_retains_framework_pins(tmp_path: Path) -> None: run_all_correctness.write_report(report_path, records) report = json.loads(report_path.read_text(encoding="utf-8")) - assert report["schema_version"] == 2 + assert report["schema_version"] == 3 assert report["frameworks"] == run_all_correctness.FRAMEWORK_PINS diff --git a/tests/contracts/test_validation_scenarios.py b/tests/contracts/test_validation_scenarios.py index 1090cb3f..d9c455fc 100644 --- a/tests/contracts/test_validation_scenarios.py +++ b/tests/contracts/test_validation_scenarios.py @@ -1,12 +1,12 @@ """Validation scenarios bridged into pytest CI. -Runs the 16 cross-framework validation scenarios through ml4t only +Runs the cross-framework validation scenarios through ml4t only (no external framework venvs required) and checks: 1. Each scenario runs without error and produces trades 2. Each scenario passes all accounting invariants 3. Smoke: final value is positive -This does NOT compare against external frameworks — that's the separate +This does NOT compare against external frameworks; that is the separate validation suite. This ensures ml4t scenarios don't regress. """ @@ -28,6 +28,7 @@ try: from common.data_generators import ( # noqa: E402 generate_bracket_data, + generate_high_event_data, generate_random_walk, generate_rule_combo_data, generate_short_signals, @@ -63,6 +64,7 @@ "generate_short_trending_data": generate_short_trending_data, "generate_rule_combo_data": generate_rule_combo_data, "generate_stress_data": generate_stress_data, + "generate_high_event_data": generate_high_event_data, } @@ -212,7 +214,7 @@ def on_data(self, timestamp, data, context, broker): return engine.run(), config -# Parameterize over all 16 scenarios +# Parameterize over all scenarios _SCENARIO_PARAMS = list(SCENARIOS.items()) if _HAS_VALIDATION else [] diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index eafbabf3..4047d376 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -225,6 +225,13 @@ trade records in `provenance.comparison_protocol`. `278fcb3d1b815b63ccadba68d7ae54422e34b792`, CLI 1.0.228, `DefaultBrokerageModel`, a margin account, daily adjusted US equities, and 2x security leverage. +The tables below describe configured profile values. They are not all cross-engine equivalence +claims. `behavior_coverage.toml` maps every profile field to its native checks and cross-engine +scenarios. A dimension is publishable only when both references are present. The current scenario +matrix does not publish equivalence for target-percent sizing, insufficient-cash boundaries, +competing same-session orders, partial fills, missing bars, or late assets. Those settings remain +available profile choices backed by native evidence where the map identifies it. + ### Execution Timing | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | @@ -338,9 +345,9 @@ No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN ## Validation Harness -### Scenario Tests (16 scenarios x 4 frameworks) +### Scenario Tests (17 scenarios x 4 frameworks) -The validation suite tests 16 scenarios against 4 external frameworks: +The validation suite tests 17 scenarios against 4 external frameworks: | ID | Scenario | What It Tests | |----|----------|---------------| @@ -359,7 +366,8 @@ The validation suite tests 16 scenarios against 4 external frameworks: | 13 | TSL + TP Combo | Rule chain evaluation order | | 14 | TSL + SL Combo | Rule chain evaluation order | | 15 | Triple Rule | Three-rule chain with priority | -| 16 | Stress Test | 1500 bars, 9 market regimes | +| 16 | Regime Path Coverage | 1500 bars, 9 market regimes and sparse entries | +| 17 | High Event Count | 1800 bars, up to 600 completed round trips | ### Large-Scale Validation (250 assets x 20 years) diff --git a/validation/README.md b/validation/README.md index f0372988..6e0a4cb0 100644 --- a/validation/README.md +++ b/validation/README.md @@ -61,6 +61,12 @@ The command returns nonzero when a required framework or scenario does not execu `--result-json PATH` to retain machine-readable terminal records. An explicitly unsupported pair is reported as `unsupported`; it is visible in the matrix and does not count as a pass. +Each passing record includes exact ordered closed-trade and fill comparisons. The trade surface +contains session, symbol, direction, quantity, entry and exit prices, P&L, and commission. The fill +surface contains session, symbol, side, quantity, price, and commission. Capability declarations +identify native, reconstructed, aggregate-only, input-only, and unavailable surfaces. See +`behavior_coverage.toml` for the profile-field evidence map. + ### Isolated release-gate runner ```bash @@ -111,7 +117,7 @@ python validation/build_framework_env.py --framework lean The target versions, artifact hashes, source commits, interpreter paths, and expected matrix counts are defined in `framework_targets.toml`. Each lock is under `validation/environments/`. CI builds -those locks and executes all 16 declared pairs for each public framework; an omitted pair fails. +those locks and executes all 17 declared pairs for each public framework; an omitted pair fails. The release workflow separately requires licensed VectorBT Pro execution and fresh LEAN native and Chapter 16 execution against the frozen image. Repository workflows never store licensed credentials. @@ -122,8 +128,9 @@ credentials. validation/ ├── README.md # This file ├── METHODOLOGY.md # Validation philosophy and behavioral matrix +├── behavior_coverage.toml # Profile fields mapped to native and cross-engine evidence ├── common/ # Shared infrastructure (types, data generators, comparator) -├── scenarios/ # Declarative scenario definitions (16 configs) +├── scenarios/ # Declarative scenario definitions (17 configs) ├── frameworks/ # Parameterized framework drivers (4 modules) ├── run_scenario.py # Unified CLI runner ├── run_all_correctness.py # Isolated release-gate correctness runner diff --git a/validation/behavior_coverage.toml b/validation/behavior_coverage.toml new file mode 100644 index 00000000..e94db7ab --- /dev/null +++ b/validation/behavior_coverage.toml @@ -0,0 +1,266 @@ +schema_version = 1 + +[[framework.vectorbt]] +name = "execution" +fields = ["execution.execution_price", "execution.execution_mode"] +native_checks = ["signal_timing_and_default_fill", "explicit_fill_price"] +scenarios = ["01", "17"] +published = true + +[[framework.vectorbt]] +name = "direction" +fields = ["account.allow_short_selling", "account.short_cash_policy"] +native_checks = ["short_cash"] +scenarios = ["02", "11", "12"] +published = true + +[[framework.vectorbt]] +name = "stops" +fields = ["stops.stop_fill_mode", "stops.stop_level_basis", "stops.trail_hwm_source", "stops.initial_hwm_source", "stops.trail_stop_timing"] +native_checks = ["stop_fill", "trailing_stop_extreme_and_intrabar_fill"] +scenarios = ["03", "04", "09", "10", "12", "13", "14", "15"] +published = true + +[[framework.vectorbt]] +name = "costs" +fields = ["commission.model", "commission.rate", "slippage.model", "slippage.rate"] +native_checks = ["fees_and_slippage"] +scenarios = ["05", "07", "08"] +published = true + +[[framework.vectorbt]] +name = "sizing" +fields = ["position_sizing.share_type"] +native_checks = ["target_percent_sizing"] +scenarios = [] +published = false +reason = "The scenario matrix submits fixed integer quantities and does not test fractional target sizing." + +[[framework.vectorbt]] +name = "buying_power" +fields = ["account.allow_leverage", "orders.reject_on_insufficient_cash", "orders.partial_fills_allowed"] +native_checks = ["insufficient_cash_partial_fill"] +scenarios = [] +published = false +reason = "No cross-engine scenario currently reaches an insufficient-cash boundary." + +[[framework.vectorbt]] +name = "order_processing" +fields = ["orders.fill_ordering", "orders.entry_order_priority", "orders.immediate_fill", "orders.rebalance_mode"] +native_checks = ["cash_sharing_and_call_sequence", "accumulation", "long_signal_conflict"] +scenarios = [] +published = false +reason = "The single-asset scenario strategy does not submit competing same-session orders or targets." + +[[framework.vectorbt]] +name = "cash_and_target_headroom" +fields = ["cash.initial", "cash.buffer_pct", "orders.rebalance_headroom_pct"] +native_checks = ["target_percent_sizing"] +scenarios = [] +published = false +reason = "Initial cash is an explicit scenario input and target headroom is not exercised." + +[[framework.vectorbt]] +name = "data_continuity" +fields = ["orders.missing_price_policy", "orders.late_asset_policy", "orders.late_asset_min_bars"] +native_checks = ["missing_order_price"] +scenarios = [] +published = false +reason = "The scenario matrix has one complete asset history and cannot test late assets." + +[[framework.backtrader]] +name = "execution" +fields = ["execution.execution_price", "execution.execution_mode"] +native_checks = ["next_bar_open_and_gap", "final_bar_market_order"] +scenarios = ["01", "17"] +published = true + +[[framework.backtrader]] +name = "direction" +fields = ["account.allow_short_selling", "account.short_cash_policy"] +native_checks = ["short_cash"] +scenarios = ["02", "11", "12"] +published = true + +[[framework.backtrader]] +name = "stops" +fields = ["stops.stop_fill_mode", "stops.stop_level_basis", "stops.trail_hwm_source", "stops.initial_hwm_source", "stops.trail_stop_timing"] +native_checks = ["signal_price_stop_basis", "trailing_stop_signal_close_and_lagged"] +scenarios = ["03", "04", "09", "10", "12", "13", "14", "15"] +published = true + +[[framework.backtrader]] +name = "costs" +fields = ["commission.model", "commission.rate", "slippage.model", "slippage.rate"] +native_checks = ["defaults", "commission_headroom"] +scenarios = ["05", "06", "07", "08"] +published = true + +[[framework.backtrader]] +name = "sizing" +fields = ["position_sizing.share_type"] +native_checks = ["integer_target_percent"] +scenarios = [] +published = false +reason = "The scenario matrix submits fixed integer quantities and does not test target-percent sizing." + +[[framework.backtrader]] +name = "buying_power" +fields = ["account.allow_leverage", "orders.reject_on_insufficient_cash", "orders.partial_fills_allowed"] +native_checks = ["cash_rejection_and_configured_leverage"] +scenarios = [] +published = false +reason = "No cross-engine scenario currently reaches an insufficient-cash boundary." + +[[framework.backtrader]] +name = "order_processing" +fields = ["orders.fill_ordering", "orders.entry_order_priority", "orders.rebalance_mode"] +native_checks = ["submission_sequence"] +scenarios = [] +published = false +reason = "The single-asset scenario strategy does not submit competing same-session orders or targets." + +[[framework.backtrader]] +name = "cash_and_target_headroom" +fields = ["cash.initial", "cash.buffer_pct", "orders.rebalance_headroom_pct"] +native_checks = ["commission_headroom"] +scenarios = [] +published = false +reason = "Initial cash is an explicit scenario input and target headroom is not exercised." + +[[framework.backtrader]] +name = "data_continuity" +fields = ["orders.missing_price_policy", "orders.late_asset_policy", "orders.late_asset_min_bars"] +native_checks = ["missing_bar_uses_last_value", "late_feed_start"] +scenarios = [] +published = false +reason = "The scenario matrix has one complete asset history and cannot test late assets." + +[[framework.zipline]] +name = "execution" +fields = ["execution.execution_price", "execution.execution_mode"] +native_checks = ["configured_next_bar_open_fill", "final_bar_market_order"] +scenarios = ["01", "17"] +published = true + +[[framework.zipline]] +name = "direction" +fields = ["account.allow_short_selling", "account.short_cash_policy"] +native_checks = ["cash_and_short_proceeds"] +scenarios = ["02", "11", "12"] +published = true + +[[framework.zipline]] +name = "risk_adapter" +fields = ["stops.stop_fill_mode", "stops.stop_level_basis", "stops.trail_hwm_source", "stops.trail_stop_timing"] +native_checks = ["configured_next_bar_open_fill"] +scenarios = ["03", "04", "09", "12", "13", "14", "15"] +published = true + +[[framework.zipline]] +name = "costs" +fields = ["commission.model", "commission.rate", "commission.per_share", "commission.minimum", "slippage.model", "slippage.rate"] +native_checks = ["defaults", "explicit_minimum_commission"] +scenarios = ["05", "06", "07", "08"] +published = true + +[[framework.zipline]] +name = "sizing" +fields = ["position_sizing.share_type", "orders.rebalance_mode"] +native_checks = ["integer_target_percent", "target_percent_snapshot"] +scenarios = [] +published = false +reason = "The scenario matrix submits fixed quantities and does not call target-percent APIs." + +[[framework.zipline]] +name = "buying_power" +fields = ["account.allow_leverage", "orders.reject_on_insufficient_cash", "orders.skip_cash_validation", "orders.partial_fills_allowed"] +native_checks = ["cash_and_short_proceeds", "volume_share_partial_fills"] +scenarios = [] +published = false +reason = "The comparison protocol overrides cash validation and fill volume, but no boundary scenario tests either behavior." + +[[framework.zipline]] +name = "order_processing" +fields = ["orders.fill_ordering", "orders.entry_order_priority", "orders.next_bar_queue_shadow_validation"] +native_checks = ["submission_sequence"] +scenarios = [] +published = false +reason = "The single-asset scenario strategy does not submit competing same-session orders." + +[[framework.zipline]] +name = "cash_and_target_headroom" +fields = ["cash.initial", "cash.buffer_pct", "orders.rebalance_headroom_pct"] +native_checks = ["integer_target_percent"] +scenarios = [] +published = false +reason = "Initial cash is explicit and target headroom is not exercised." + +[[framework.zipline]] +name = "data_continuity" +fields = ["orders.missing_price_policy", "orders.late_asset_policy", "orders.late_asset_min_bars"] +native_checks = ["session_calendar", "missing_bar"] +scenarios = [] +published = false +reason = "The scenario matrix has one complete asset history and cannot test late assets." + +[[framework.lean]] +name = "execution" +fields = ["execution.execution_price", "execution.execution_mode"] +native_checks = ["timing", "final_bar_order"] +scenarios = ["lean-case:chapter16_etfs", "lean-case:chapter16_sp500_equity_option_analytics", "lean-case:chapter16_us_equities_panel"] +published = true + +[[framework.lean]] +name = "account" +fields = ["account.allow_short_selling", "account.allow_leverage", "account.initial_margin", "account.long_maintenance_margin", "account.short_maintenance_margin", "account.short_cash_policy"] +native_checks = ["default_models", "buying_power_allowed", "buying_power_rejected"] +scenarios = ["lean-case:chapter16_etfs", "lean-case:chapter16_sp500_equity_option_analytics", "lean-case:chapter16_us_equities_panel"] +published = true + +[[framework.lean]] +name = "target_sizing" +fields = ["position_sizing.share_type", "orders.rebalance_mode", "orders.rebalance_headroom_pct"] +native_checks = ["target_sizing"] +scenarios = ["lean-case:chapter16_etfs", "lean-case:chapter16_sp500_equity_option_analytics", "lean-case:chapter16_us_equities_panel"] +published = true + +[[framework.lean]] +name = "costs" +fields = ["commission.model", "commission.rate", "commission.per_share", "commission.minimum", "slippage.model", "slippage.rate"] +native_checks = ["default_models", "explicit_costs"] +scenarios = [] +published = false +reason = "Chapter 16 uses a custom percentage fee model, not the profile's default brokerage fee model." + +[[framework.lean]] +name = "stops" +fields = ["stops.stop_fill_mode", "stops.stop_level_basis", "stops.trail_hwm_source", "stops.trail_stop_timing"] +native_checks = [] +scenarios = [] +published = false +reason = "The current LEAN oracle and case studies do not test stop-order semantics." + +[[framework.lean]] +name = "buying_power_and_ordering" +fields = ["orders.reject_on_insufficient_cash", "orders.partial_fills_allowed", "orders.fill_ordering", "orders.entry_order_priority", "orders.buying_power_reservation", "orders.next_bar_queue_shadow_validation"] +native_checks = ["submission_sequence", "buying_power_sequence", "default_full_fill"] +scenarios = [] +published = false +reason = "The Chapter 16 projects do not isolate rejection, competing-order, or partial-fill boundaries." + +[[framework.lean]] +name = "cash" +fields = ["cash.initial", "cash.buffer_pct"] +native_checks = ["target_sizing"] +scenarios = [] +published = false +reason = "Initial cash is an explicit project input, not an engine-default equivalence claim." + +[[framework.lean]] +name = "data_continuity" +fields = ["orders.missing_price_policy", "orders.late_asset_policy", "orders.late_asset_min_bars"] +native_checks = ["fill_forward"] +scenarios = [] +published = false +reason = "The Chapter 16 projects do not contain a controlled missing-bar or late-asset case." diff --git a/validation/common/canonical_records.py b/validation/common/canonical_records.py new file mode 100644 index 00000000..f4f20388 --- /dev/null +++ b/validation/common/canonical_records.py @@ -0,0 +1,92 @@ +"""Canonical record extraction shared by scenario adapters.""" + +from __future__ import annotations + +from typing import Any + +import pandas as pd + + +def _first(record: dict[str, Any], *names: str) -> Any: + for name in names: + if name in record: + return record[name] + raise KeyError(f"Record lacks all expected fields: {names}") + + +def vectorbt_fills(order_records: list[dict[str, Any]], *, asset: str) -> list[dict[str, Any]]: + """Convert VectorBT's native filled-order records to the canonical fill surface.""" + return [ + { + "timestamp": _first(record, "Fill Index", "Timestamp"), + "asset": asset, + "side": str(record["Side"]).lower(), + "quantity": abs(float(record["Size"])), + "price": float(record["Price"]), + "commission": abs(float(record.get("Fees", 0.0))), + } + for record in order_records + ] + + +def vectorbt_trades( + trade_records: list[dict[str, Any]], + *, + asset: str, +) -> list[dict[str, Any]]: + """Convert VectorBT's native closed-trade records to the canonical trade surface.""" + normalized: list[dict[str, Any]] = [] + for record in trade_records: + status = str(record.get("Status", "Closed")).lower() + if status != "closed": + continue + entry_price = float(_first(record, "Avg Entry Price", "Entry Price")) + exit_price = float(_first(record, "Avg Exit Price", "Exit Price")) + size = abs(float(record.get("Size", 0.0))) + direction = str(record.get("Direction", "Long")) + commission = abs(float(record.get("Entry Fees", 0.0))) + abs( + float(record.get("Exit Fees", 0.0)) + ) + direction_sign = -1.0 if direction.lower() == "short" else 1.0 + normalized.append( + { + "entry_time": _first(record, "Entry Index", "Entry Timestamp"), + "exit_time": _first(record, "Exit Index", "Exit Timestamp"), + "asset": asset, + "entry_price": entry_price, + "exit_price": exit_price, + "pnl": (exit_price - entry_price) * size * direction_sign - commission, + "size": size, + "direction": direction, + "commission": commission, + } + ) + return normalized + + +def zipline_fills( + transactions: pd.DataFrame, + *, + asset: str, + commission_rate: float = 0.0, + per_share_rate: float = 0.0, +) -> list[dict[str, Any]]: + """Convert Zipline transactions and the configured fee model to canonical fills.""" + if transactions.empty: + return [] + records: list[dict[str, Any]] = [] + for _, transaction in transactions.sort_values("dt").iterrows(): + amount = float(transaction["amount"]) + price = float(transaction["price"]) + commission = abs(amount) * (price * commission_rate + per_share_rate) + records.append( + { + "timestamp": transaction["dt"], + "asset": asset, + "side": "buy" if amount > 0 else "sell", + "quantity": abs(amount), + "price": price, + "commission": commission, + } + ) + return records diff --git a/validation/common/capabilities.py b/validation/common/capabilities.py new file mode 100644 index 00000000..39b53ee1 --- /dev/null +++ b/validation/common/capabilities.py @@ -0,0 +1,74 @@ +"""Declared result surfaces for the scenario comparison adapters.""" + +from __future__ import annotations + +from common.types import CAPABILITY_KEYS + +ML4T_CAPABILITIES = { + "intents": "input_only", + "orders": "unavailable", + "rejections": "unavailable", + "fills": "native", + "positions": "unavailable", + "cash_flows": "aggregate_only", + "open_trades": "unavailable", + "closed_trades": "native", + "exit_reason": "native", + "terminal": "native", +} + +FRAMEWORK_CAPABILITIES = { + "vectorbt_pro": { + "intents": "input_only", + "orders": "native_filled_only", + "rejections": "unavailable", + "fills": "native", + "positions": "unavailable", + "cash_flows": "aggregate_only", + "open_trades": "unavailable", + "closed_trades": "native", + "exit_reason": "unavailable", + "terminal": "native", + }, + "vectorbt_oss": { + "intents": "input_only", + "orders": "native_filled_only", + "rejections": "unavailable", + "fills": "native", + "positions": "unavailable", + "cash_flows": "aggregate_only", + "open_trades": "unavailable", + "closed_trades": "native", + "exit_reason": "unavailable", + "terminal": "native", + }, + "backtrader": { + "intents": "input_only", + "orders": "native_filled_only", + "rejections": "unavailable", + "fills": "native", + "positions": "unavailable", + "cash_flows": "aggregate_only", + "open_trades": "unavailable", + "closed_trades": "native", + "exit_reason": "unavailable", + "terminal": "native", + }, + "zipline": { + "intents": "input_only", + "orders": "native_filled_only", + "rejections": "unavailable", + "fills": "reconstructed", + "positions": "unavailable", + "cash_flows": "aggregate_only", + "open_trades": "unavailable", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "terminal": "native", + }, +} + +assert set(ML4T_CAPABILITIES) == set(CAPABILITY_KEYS) +assert all( + set(capabilities) == set(CAPABILITY_KEYS) for capabilities in FRAMEWORK_CAPABILITIES.values() +) diff --git a/validation/common/comparator.py b/validation/common/comparator.py index 1d37ff04..f61cf295 100644 --- a/validation/common/comparator.py +++ b/validation/common/comparator.py @@ -2,12 +2,29 @@ from __future__ import annotations +from datetime import date, datetime from decimal import ROUND_HALF_EVEN, Decimal +from typing import Any from .types import CheckResult, ComparisonResult, FrameworkResult, ScenarioConfig, Tolerance CANONICAL_QUANTUM = Decimal("0.00000001") CANONICAL_QUANTUM_TEXT = format(CANONICAL_QUANTUM, "f") +TRADE_FIELDS = ( + "entry_time", + "exit_time", + "asset", + "direction", + "size", + "entry_price", + "exit_price", + "pnl", + "commission", +) +FILL_FIELDS = ("timestamp", "asset", "side", "quantity", "price", "commission") +_TIMESTAMP_FIELDS = {"entry_time", "exit_time", "timestamp"} +_CASE_INSENSITIVE_FIELDS = {"direction", "side"} +_STRING_FIELDS = {"asset", *_CASE_INSENSITIVE_FIELDS} def _canonical_number(value: int | float) -> Decimal: @@ -15,6 +32,83 @@ def _canonical_number(value: int | float) -> Decimal: return Decimal(str(value)).quantize(CANONICAL_QUANTUM, rounding=ROUND_HALF_EVEN) +def _canonical_session(value: object) -> str: + """Normalize a daily event timestamp to its ISO session date.""" + if isinstance(value, datetime): + return value.date().isoformat() + if isinstance(value, date): + return value.isoformat() + if isinstance(value, str): + session = value[:10] + date.fromisoformat(session) + return session + isoformat = getattr(value, "isoformat", None) + if callable(isoformat): + session = str(isoformat())[:10] + date.fromisoformat(session) + return session + raise TypeError(f"unsupported timestamp type {type(value).__name__}") + + +def _canonical_field(field: str, value: Any) -> Decimal | str: + if field in _TIMESTAMP_FIELDS: + return _canonical_session(value) + if field in _STRING_FIELDS: + if not isinstance(value, str) or not value: + raise TypeError("must be a nonempty string") + return value.lower() if field in _CASE_INSENSITIVE_FIELDS else value + if not isinstance(value, (int, float)) or isinstance(value, bool): + raise TypeError("must be numeric") + return _canonical_number(value) + + +def _compare_records( + *, + name: str, + expected_records: list[dict[str, Any]], + actual_records: list[dict[str, Any]], + fields: tuple[str, ...], +) -> CheckResult: + detail = "exact ordered match" + passed = len(expected_records) == len(actual_records) + if not passed: + detail = f"record_count expected={len(expected_records)}, actual={len(actual_records)}" + else: + for index, (expected_record, actual_record) in enumerate( + zip(expected_records, actual_records, strict=True) + ): + for field in fields: + if field not in expected_record or field not in actual_record: + passed = False + detail = f"record {index} missing required field {field}" + break + try: + expected = _canonical_field(field, expected_record[field]) + actual = _canonical_field(field, actual_record[field]) + except (ArithmeticError, TypeError, ValueError) as error: + passed = False + detail = f"record {index} field {field} is malformed: {error}" + break + if expected != actual: + passed = False + detail = ( + f"record {index} field {field}: expected={expected!r}, actual={actual!r}" + ) + break + if not passed: + break + return CheckResult( + name=name, + passed=passed, + message=detail, + expected=expected_records, + actual=actual_records, + difference=None if passed else detail, + canonical_quantum=CANONICAL_QUANTUM_TEXT, + diagnostic_limit=None, + ) + + def compare_results( scenario: ScenarioConfig, framework_result: FrameworkResult, @@ -176,51 +270,20 @@ def compare_results( ) ) - # Exact trade-by-trade release surface. Timestamps are excluded until every adapter exposes - # them consistently; prices, size, direction, and PnL are mandatory for every reported trade. - required_trade_fields = ("entry_price", "exit_price", "pnl", "size", "direction") - trade_detail = "exact match" - trade_level_passed = len(framework_result.trades) == len(ml4t_result.trades) - if trade_level_passed: - for index, (fw_trade, ml4t_trade) in enumerate( - zip(framework_result.trades, ml4t_result.trades, strict=True) - ): - for field in required_trade_fields: - if field not in fw_trade or field not in ml4t_trade: - trade_level_passed = False - trade_detail = f"trade {index} missing required field {field}" - break - expected = fw_trade[field] - actual = ml4t_trade[field] - if field == "direction": - expected = str(expected).lower() - actual = str(actual).lower() - else: - expected = _canonical_number(expected) - actual = _canonical_number(actual) - if expected != actual: - trade_level_passed = False - trade_detail = ( - f"trade {index} field {field}: expected={expected!r}, actual={actual!r}" - ) - break - if not trade_level_passed: - break - else: - trade_detail = ( - f"record_count expected={len(framework_result.trades)}, " - f"actual={len(ml4t_result.trades)}" - ) checks.append( - CheckResult( + _compare_records( name="trade_level_match", - passed=trade_level_passed, - message=trade_detail, - expected=framework_result.trades, - actual=ml4t_result.trades, - difference=None if trade_level_passed else trade_detail, - canonical_quantum=CANONICAL_QUANTUM_TEXT, - diagnostic_limit=None, + expected_records=framework_result.trades, + actual_records=ml4t_result.trades, + fields=TRADE_FIELDS, + ) + ) + checks.append( + _compare_records( + name="fill_level_match", + expected_records=framework_result.fills, + actual_records=ml4t_result.fills, + fields=FILL_FIELDS, ) ) diff --git a/validation/common/correctness_evidence.py b/validation/common/correctness_evidence.py index 2ff7f4e6..88b19c98 100644 --- a/validation/common/correctness_evidence.py +++ b/validation/common/correctness_evidence.py @@ -12,12 +12,13 @@ from scenarios.definitions import SCENARIOS +from common.capabilities import FRAMEWORK_CAPABILITIES, ML4T_CAPABILITIES from common.comparator import CANONICAL_QUANTUM_TEXT, compare_results from common.framework_registry import FrameworkManifest, load_framework_manifest from common.provenance import generate_inputs, input_digest, static_digests from common.types import ValidationRecord, ValidationStatus -SCHEMA_VERSION = 2 +SCHEMA_VERSION = 3 def _framework_metadata(manifest: FrameworkManifest) -> dict[str, dict[str, object]]: @@ -44,6 +45,9 @@ def build_report( "canonical_quantum": CANONICAL_QUANTUM_TEXT, "rounding": "ROUND_HALF_EVEN", "meaning": "equality after canonical quantization, not bit identity", + "record_order": "significant", + "timestamp_domain": "daily session date", + "surfaces": ["terminal", "closed_trades", "fills"], }, "frameworks": _framework_metadata(target_manifest), "release_gate_passed": release_passed, @@ -101,6 +105,9 @@ def _record_evidence_failures( counts = _mapping( provenance.get("record_counts"), label=f"{identity} record_counts", failures=failures ) + capabilities = _mapping( + provenance.get("capabilities"), label=f"{identity} capabilities", failures=failures + ) if framework_target is not None: expected_target = { "version": target.version, @@ -126,6 +133,16 @@ def _record_evidence_failures( } if adapter is not None and adapter != expected_adapter: failures.append(f"{identity} adapter identity differs") + expected_capabilities = { + "framework": FRAMEWORK_CAPABILITIES[record.framework], + "ml4t": ML4T_CAPABILITIES, + } + if capabilities != expected_capabilities: + failures.append(f"{identity} capability declaration differs") + if record.framework_result.capabilities != FRAMEWORK_CAPABILITIES[record.framework]: + failures.append(f"{identity} framework result capabilities differ") + if record.ml4t_result.capabilities != ML4T_CAPABILITIES: + failures.append(f"{identity} ML4T result capabilities differ") expected_digests = static_digests(scenario, record.framework) if digests is not None: @@ -142,8 +159,14 @@ def _record_evidence_failures( "bars": len(prices), "entry_signals": int(entries.sum()), "exit_signals": int(exits.sum()) if exits is not None else 0, - "framework_trades": record.framework_result.num_trades, - "ml4t_trades": record.ml4t_result.num_trades, + "framework_intents": int(entries.sum()) + (int(exits.sum()) if exits is not None else 0), + "ml4t_intents": int(entries.sum()) + (int(exits.sum()) if exits is not None else 0), + "framework_orders": None, + "ml4t_orders": None, + "framework_fills": len(record.framework_result.fills), + "ml4t_fills": len(record.ml4t_result.fills), + "framework_closed_trades": record.framework_result.num_trades, + "ml4t_closed_trades": record.ml4t_result.num_trades, } if counts is not None and counts != expected_counts: failures.append(f"{identity} record counts differ from retained inputs or outputs") @@ -178,6 +201,9 @@ def correctness_report_failures( "canonical_quantum": CANONICAL_QUANTUM_TEXT, "rounding": "ROUND_HALF_EVEN", "meaning": "equality after canonical quantization, not bit identity", + "record_order": "significant", + "timestamp_domain": "daily session date", + "surfaces": ["terminal", "closed_trades", "fills"], } if report.get("comparison_policy") != expected_policy: failures.append("Correctness comparison policy differs") diff --git a/validation/common/data_generators.py b/validation/common/data_generators.py index 85a7f557..9c8b7b9f 100644 --- a/validation/common/data_generators.py +++ b/validation/common/data_generators.py @@ -459,7 +459,7 @@ def generate_stress_data( n_bars: int = 1500, seed: int = 42, ) -> tuple[pd.DataFrame, np.ndarray]: - """Extended market with multiple regimes for stress testing. + """Extended market with multiple regimes for sparse path coverage. Used by: scenario 16. 9 regime transitions, 9 entry signals. @@ -515,3 +515,17 @@ def generate_stress_data( entries[b] = True return df, entries + + +def generate_high_event_data( + n_bars: int = 1800, + seed: int = 7, +) -> tuple[pd.DataFrame, np.ndarray, np.ndarray]: + """Generate hundreds of completed round trips for event-surface validation.""" + return generate_random_walk( + n_bars=n_bars, + seed=seed, + hold_bars=1, + trade_spacing=3, + daily_vol=0.002, + ) diff --git a/validation/common/ml4t_runner.py b/validation/common/ml4t_runner.py index 403fa995..59cbc040 100644 --- a/validation/common/ml4t_runner.py +++ b/validation/common/ml4t_runner.py @@ -16,6 +16,7 @@ PROJECT_ROOT = Path(__file__).parent.parent.parent sys.path.insert(0, str(PROJECT_ROOT / "src")) +from common.capabilities import ML4T_CAPABILITIES # noqa: E402 from common.types import FrameworkResult, ScenarioConfig # noqa: E402 @@ -110,9 +111,12 @@ def run_ml4t( trade_dict: dict[str, Any] = { "entry_time": t.entry_time, "exit_time": t.exit_time, + "asset": t.symbol, "entry_price": t.entry_price, "exit_price": t.exit_price, "pnl": t.pnl, + "commission": t.commission, + "exit_reason": t.exit_reason, } if hasattr(t, "quantity"): trade_dict["size"] = abs(t.quantity) @@ -121,6 +125,19 @@ def run_ml4t( trade_dict["commission"] = t.commission trade_list.append(trade_dict) + fill_list = [ + { + "timestamp": fill.timestamp, + "asset": fill.asset, + "side": fill.side.value, + "quantity": abs(fill.quantity), + "price": fill.price, + "commission": fill.commission, + "exit_reason": fill.exit_reason, + } + for fill in results["fills"] + ] + extra = {} if "commission" in scenario.extra_checks: extra["total_commission"] = sum(f.commission for f in results["fills"]) @@ -133,6 +150,8 @@ def run_ml4t( total_pnl=results["final_value"] - scenario.initial_cash, num_trades=results["num_trades"], trades=trade_list, + fills=fill_list, + capabilities=ML4T_CAPABILITIES, extra=extra, ) diff --git a/validation/common/provenance.py b/validation/common/provenance.py index 9bafee80..4b275c80 100644 --- a/validation/common/provenance.py +++ b/validation/common/provenance.py @@ -123,6 +123,8 @@ def static_digests(scenario: ScenarioConfig, framework: str) -> dict[str, str]: } return { "adapter": file_digest(adapter_path), + "canonical_records": file_digest(VALIDATION_DIR / "common" / "canonical_records.py"), + "capabilities": file_digest(VALIDATION_DIR / "common" / "capabilities.py"), "comparator": file_digest(VALIDATION_DIR / "common" / "comparator.py"), "engine": _tree_digest(SOURCE_DIR), "manifest": file_digest(DEFAULT_MANIFEST_PATH), @@ -162,6 +164,7 @@ def comparison_protocol_metadata(scenario: ScenarioConfig, framework: str) -> di return { "commission": "explicit scenario model or NoCommission", "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", "risk_rules": "adapter_emulated_daily_ohlc" if scenario.risk_rules else "none", "trade_records": "adapter_reconstructed_from_native_transactions", } @@ -196,13 +199,24 @@ def build_record_provenance( "path": adapter_path.relative_to(PROJECT_ROOT).as_posix(), }, "comparison_protocol": comparison_protocol_metadata(scenario, framework), + "capabilities": { + "framework": framework_result.capabilities, + "ml4t": ml4t_result.capabilities, + }, "digests": static_digests(scenario, framework), "input_digest": input_digest(prices, entries, exits), "record_counts": { "bars": len(prices), "entry_signals": int(entries.sum()), "exit_signals": int(exits.sum()) if exits is not None else 0, - "framework_trades": framework_result.num_trades, - "ml4t_trades": ml4t_result.num_trades, + "framework_intents": int(entries.sum()) + + (int(exits.sum()) if exits is not None else 0), + "ml4t_intents": int(entries.sum()) + (int(exits.sum()) if exits is not None else 0), + "framework_orders": None, + "ml4t_orders": None, + "framework_fills": len(framework_result.fills), + "ml4t_fills": len(ml4t_result.fills), + "framework_closed_trades": framework_result.num_trades, + "ml4t_closed_trades": ml4t_result.num_trades, }, } diff --git a/validation/common/types.py b/validation/common/types.py index 1c590543..f02cd2a2 100644 --- a/validation/common/types.py +++ b/validation/common/types.py @@ -195,11 +195,38 @@ class ValidationSkipped(RuntimeError): """Raised by an adapter that elects not to execute a required scenario.""" +CAPABILITY_KEYS = ( + "intents", + "orders", + "rejections", + "fills", + "positions", + "cash_flows", + "open_trades", + "closed_trades", + "exit_reason", + "terminal", +) +CAPABILITY_VALUES = { + "native", + "native_filled_only", + "reconstructed", + "input_only", + "aggregate_only", + "unavailable", +} + + +def unavailable_capabilities() -> dict[str, str]: + """Return an explicit declaration that no optional result surface is available.""" + return dict.fromkeys(CAPABILITY_KEYS, "unavailable") + + @dataclass class ScenarioConfig: """Declarative definition of a validation scenario.""" - id: str # "01", "02", ..., "16" + id: str # "01", "02", ..., "17" name: str # Human-readable name description: str @@ -264,6 +291,8 @@ class FrameworkResult: total_pnl: float num_trades: int trades: list[dict[str, Any]] = field(default_factory=list) + fills: list[dict[str, Any]] = field(default_factory=list) + capabilities: dict[str, str] = field(default_factory=unavailable_capabilities) extra: dict[str, Any] = field(default_factory=dict) def to_dict(self) -> dict[str, Any]: @@ -273,20 +302,41 @@ def to_dict(self) -> dict[str, Any]: "total_pnl": self.total_pnl, "num_trades": self.num_trades, "trades": _json_value(self.trades), + "fills": _json_value(self.fills), + "capabilities": _json_value(self.capabilities), "extra": _json_value(self.extra), } @classmethod def from_dict(cls, payload: dict[str, Any]) -> FrameworkResult: - required = {"framework", "final_value", "total_pnl", "num_trades", "trades", "extra"} + required = { + "framework", + "final_value", + "total_pnl", + "num_trades", + "trades", + "fills", + "capabilities", + "extra", + } missing = sorted(required - payload.keys()) if missing: raise ValueError(f"Framework result missing fields: {', '.join(missing)}") trades = payload["trades"] + fills = payload["fills"] + capabilities = payload["capabilities"] extra = payload["extra"] num_trades = payload["num_trades"] if not isinstance(trades, list) or not all(isinstance(trade, dict) for trade in trades): raise TypeError("Framework result trades must be an object array") + if not isinstance(fills, list) or not all(isinstance(fill, dict) for fill in fills): + raise TypeError("Framework result fills must be an object array") + if not isinstance(capabilities, dict) or set(capabilities) != set(CAPABILITY_KEYS): + raise TypeError("Framework result capabilities must declare every canonical surface") + if not all( + isinstance(value, str) and value in CAPABILITY_VALUES for value in capabilities.values() + ): + raise ValueError("Framework result capabilities contain an unsupported declaration") if not isinstance(extra, dict): raise TypeError("Framework result trades and extra have invalid types") if not isinstance(num_trades, int) or isinstance(num_trades, bool) or num_trades < 0: @@ -297,6 +347,8 @@ def from_dict(cls, payload: dict[str, Any]) -> FrameworkResult: total_pnl=_required_number(payload["total_pnl"], "Framework result total_pnl"), num_trades=num_trades, trades=trades, + fills=fills, + capabilities=capabilities, extra=extra, ) diff --git a/validation/framework_targets.toml b/validation/framework_targets.toml index 762d12ec..18b813c2 100644 --- a/validation/framework_targets.toml +++ b/validation/framework_targets.toml @@ -17,7 +17,7 @@ immutable_id = "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4" environment = ".venv-vectorbt-pro" python_env_var = "ML4T_VECTORBT_PRO_PYTHON" scenario_matrix = true -required_scenarios = 16 +required_scenarios = 17 unsupported_scenarios = 0 [framework.vectorbt_oss] @@ -35,7 +35,7 @@ artifact = "vectorbt-1.1.0.tar.gz" environment = ".venv-vectorbt-oss" python_env_var = "ML4T_VECTORBT_OSS_PYTHON" scenario_matrix = true -required_scenarios = 15 +required_scenarios = 16 unsupported_scenarios = 1 [framework.backtrader] @@ -52,7 +52,7 @@ artifact = "backtrader-1.9.78.123-py2.py3-none-any.whl" environment = ".venv-backtrader" python_env_var = "ML4T_BACKTRADER_PYTHON" scenario_matrix = true -required_scenarios = 16 +required_scenarios = 17 unsupported_scenarios = 0 [framework.zipline] @@ -70,7 +70,7 @@ artifact = "zipline_reloaded-3.1.1.tar.gz" environment = ".venv-zipline" python_env_var = "ML4T_ZIPLINE_PYTHON" scenario_matrix = true -required_scenarios = 15 +required_scenarios = 16 unsupported_scenarios = 1 [framework.lean] diff --git a/validation/frameworks/backtrader.py b/validation/frameworks/backtrader.py index 55069414..32c19ffa 100644 --- a/validation/frameworks/backtrader.py +++ b/validation/frameworks/backtrader.py @@ -1,6 +1,6 @@ """Backtrader framework driver for validation scenarios. -Consolidates 16 run_backtrader() functions into a single parameterized driver. +Provides one parameterized driver for the scenario matrix. Backtrader always uses next-bar execution (orders placed on bar N fill at bar N+1's open). """ @@ -16,9 +16,21 @@ import pandas as pd sys.path.insert(0, str(Path(__file__).parent.parent)) +from common.capabilities import FRAMEWORK_CAPABILITIES from common.types import FrameworkResult, ScenarioConfig +def _completed_fill(order: Any, bt: Any) -> dict[str, object]: + return { + "timestamp": bt.num2date(order.executed.dt), + "asset": "TEST", + "side": "buy" if order.isbuy() else "sell", + "quantity": abs(float(order.executed.size)), + "price": float(order.executed.price), + "commission": abs(float(order.executed.comm)), + } + + def run( scenario: ScenarioConfig, prices_df: pd.DataFrame, @@ -102,6 +114,7 @@ class PandasData(bt.feeds.PandasData): trade_list = [] if hasattr(strategy, "trade_log"): trade_list = sorted(strategy.trade_log, key=lambda t: t.get("entry_time", 0)) + fill_list = getattr(strategy, "fill_log", []) extra = {} if hasattr(strategy, "total_commission"): @@ -125,6 +138,8 @@ class PandasData(bt.feeds.PandasData): total_pnl=final_value - scenario.initial_cash, num_trades=len(trade_list), trades=trade_list, + fills=fill_list, + capabilities=FRAMEWORK_CAPABILITIES["backtrader"], extra=extra, ) @@ -152,6 +167,7 @@ class SignalStrategy(bt.Strategy): def __init__(self): self.bar_count = 0 self.trade_log = [] + self.fill_log = [] self.total_commission = 0.0 self.pending_trade = None @@ -186,6 +202,7 @@ def notify_trade(self, trade): { "entry_time": self.pending_trade["entry_time"], "exit_time": bt.num2date(trade.dtclose), + "asset": "TEST", "entry_price": self.pending_trade["entry_price"], "exit_price": exit_price, "gross_pnl": trade.pnl, @@ -200,6 +217,7 @@ def notify_trade(self, trade): def notify_order(self, order): if order.status == order.Completed: + self.fill_log.append(_completed_fill(order, bt)) self.total_commission += order.executed.comm return SignalStrategy @@ -215,6 +233,7 @@ class ShortStrategy(bt.Strategy): def __init__(self): self.bar_count = 0 self.trade_log = [] + self.fill_log = [] self.pending_trade = None def next(self): @@ -255,16 +274,22 @@ def notify_trade(self, trade): { "entry_time": self.pending_trade["entry_time"], "exit_time": bt.num2date(trade.dtclose), + "asset": "TEST", "entry_price": self.pending_trade["entry_price"], "exit_price": exit_price, "size": abs(entry_size), "gross_pnl": trade.pnl, "pnl": trade.pnlcomm, "direction": "Short" if entry_size < 0 else "Long", + "commission": trade.commission, } ) self.pending_trade = None + def notify_order(self, order): + if order.status == order.Completed: + self.fill_log.append(_completed_fill(order, bt)) + return ShortStrategy @@ -297,6 +322,7 @@ class RiskEntryStrategy(bt.Strategy): def __init__(self): self.bar_count = 0 self.trade_log = [] + self.fill_log = [] self.entered_once = False self.entry_order = None self.exit_orders = [] @@ -423,18 +449,22 @@ def notify_trade(self, trade): { "entry_time": self.pending_trade["entry_time"], "exit_time": bt.num2date(trade.dtclose), + "asset": "TEST", "entry_price": self.pending_trade["entry_price"], "exit_price": exit_price, "size": abs(entry_size), "gross_pnl": trade.pnl, "pnl": trade.pnlcomm, "direction": "Short" if entry_size < 0 else "Long", + "commission": trade.commission, } ) self.pending_trade = None self.exit_orders = [] def notify_order(self, order): + if order.status == order.Completed: + self.fill_log.append(_completed_fill(order, bt)) if order.status == order.Completed and order == self.entry_order: # Entry filled — now submit deferred trailing stop self.entry_order = None diff --git a/validation/frameworks/vectorbt_oss.py b/validation/frameworks/vectorbt_oss.py index 4a23da01..9e4cfcd4 100644 --- a/validation/frameworks/vectorbt_oss.py +++ b/validation/frameworks/vectorbt_oss.py @@ -1,6 +1,6 @@ """VectorBT OSS framework driver for validation scenarios. -Consolidates 16 run_vectorbt_oss() functions into a single parameterized driver. +Provides one parameterized driver for the scenario matrix. VectorBT OSS uses same-bar execution with close fills by default. """ @@ -14,6 +14,8 @@ import pandas as pd sys.path.insert(0, str(Path(__file__).parent.parent)) +from common.canonical_records import vectorbt_fills, vectorbt_trades +from common.capabilities import FRAMEWORK_CAPABILITIES from common.types import FrameworkResult, ScenarioConfig @@ -119,29 +121,9 @@ def run( trade_list = trades.to_dict("records") if len(trades) > 0 else [] order_list = pf.orders.records_readable.to_dict("records") - # Normalize trade dict keys for comparison - normalized_trades = [] - for index, t in enumerate(trade_list): - entry_order = order_list[index * 2] if index * 2 < len(order_list) else {} - exit_order = order_list[index * 2 + 1] if index * 2 + 1 < len(order_list) else {} - size = float(t.get("Size", scenario.shares)) - direction = t.get("Direction", "Long") - entry_price = float( - entry_order.get("Price", t.get("Avg Entry Price", t.get("Entry Price", 0))) - ) - exit_price = float(exit_order.get("Price", t.get("Avg Exit Price", t.get("Exit Price", 0)))) - direction_sign = -1.0 if str(direction).lower() == "short" else 1.0 - fees = abs(float(entry_order.get("Fees", t.get("Entry Fees", 0)))) + abs( - float(exit_order.get("Fees", t.get("Exit Fees", 0))) - ) - normalized = { - "entry_price": entry_price, - "exit_price": exit_price, - "pnl": (exit_price - entry_price) * size * direction_sign - fees, - "size": size, - "direction": direction, - } - normalized_trades.append(normalized) + asset = str(scenario.constants.get("asset", "TEST")) + normalized_trades = vectorbt_trades(trade_list, asset=asset) + normalized_fills = vectorbt_fills(order_list, asset=asset) extra = {} if "commission" in scenario.extra_checks: @@ -157,5 +139,7 @@ def run( total_pnl=final_value - scenario.initial_cash, num_trades=len(trades), trades=normalized_trades, + fills=normalized_fills, + capabilities=FRAMEWORK_CAPABILITIES["vectorbt_oss"], extra=extra, ) diff --git a/validation/frameworks/vectorbt_pro.py b/validation/frameworks/vectorbt_pro.py index a8a4d8c8..b1d0e61a 100644 --- a/validation/frameworks/vectorbt_pro.py +++ b/validation/frameworks/vectorbt_pro.py @@ -1,6 +1,6 @@ """VectorBT Pro framework driver for validation scenarios. -Consolidates 17 run_vectorbt_pro() functions into a single parameterized driver. +Provides one parameterized driver for the scenario matrix. VectorBT Pro uses same-bar execution with close fills by default. Licensed software; guarded by try/except ImportError. @@ -16,6 +16,8 @@ import pandas as pd sys.path.insert(0, str(Path(__file__).parent.parent)) +from common.canonical_records import vectorbt_fills, vectorbt_trades +from common.capabilities import FRAMEWORK_CAPABILITIES from common.types import FrameworkResult, ScenarioConfig SUPPORTED_VECTORBT_PRO_VERSION = "2026.6.27" @@ -125,28 +127,9 @@ def run( trade_list = trades.to_dict("records") if len(trades) > 0 else [] order_list = pf.orders.records_readable.to_dict("records") - normalized_trades = [] - for index, t in enumerate(trade_list): - entry_order = order_list[index * 2] if index * 2 < len(order_list) else {} - exit_order = order_list[index * 2 + 1] if index * 2 + 1 < len(order_list) else {} - size = float(t.get("Size", scenario.shares)) - direction = t.get("Direction", "Long") - entry_price = float( - entry_order.get("Price", t.get("Avg Entry Price", t.get("Entry Price", 0))) - ) - exit_price = float(exit_order.get("Price", t.get("Avg Exit Price", t.get("Exit Price", 0)))) - direction_sign = -1.0 if str(direction).lower() == "short" else 1.0 - fees = abs(float(entry_order.get("Fees", t.get("Entry Fees", 0)))) + abs( - float(exit_order.get("Fees", t.get("Exit Fees", 0))) - ) - normalized = { - "entry_price": entry_price, - "exit_price": exit_price, - "pnl": (exit_price - entry_price) * size * direction_sign - fees, - "size": size, - "direction": direction, - } - normalized_trades.append(normalized) + asset = str(scenario.constants.get("asset", "TEST")) + normalized_trades = vectorbt_trades(trade_list, asset=asset) + normalized_fills = vectorbt_fills(order_list, asset=asset) extra = {} if "commission" in scenario.extra_checks: @@ -161,5 +144,7 @@ def run( total_pnl=final_value - scenario.initial_cash, num_trades=len(trades), trades=normalized_trades, + fills=normalized_fills, + capabilities=FRAMEWORK_CAPABILITIES["vectorbt_pro"], extra=extra, ) diff --git a/validation/frameworks/zipline.py b/validation/frameworks/zipline.py index 089eeb3c..6d1552aa 100644 --- a/validation/frameworks/zipline.py +++ b/validation/frameworks/zipline.py @@ -1,6 +1,6 @@ """Zipline framework driver for validation scenarios. -Consolidates 15 run_zipline() functions into a single parameterized driver. +Provides one parameterized driver for the scenario matrix. Zipline uses next-bar execution with open fills. Requires: - exchange_calendars for NYSE trading calendar dates @@ -17,6 +17,8 @@ import pandas as pd sys.path.insert(0, str(Path(__file__).parent.parent)) +from common.canonical_records import zipline_fills +from common.capabilities import FRAMEWORK_CAPABILITIES from common.types import FrameworkResult, ScenarioConfig from ml4t.backtest._validation.zipline_runner import ( @@ -221,8 +223,10 @@ def analyze(context, perf): for trade in trade_list: trade["entry_time"] = trade.pop("entry_date") trade["exit_time"] = trade.pop("exit_date") + trade["asset"] = "TEST" trade["size"] = trade.pop("quantity") trade["direction"] = str(trade.pop("side")).title() + trade_commission = 0.0 if "commission_rate" in constants: trade_commission = ( constants["commission_rate"] @@ -235,7 +239,14 @@ def analyze(context, perf): trade_commission = constants["per_share_rate"] * float(trade["size"]) * 2 total_commission += trade_commission trade["pnl"] = float(trade["pnl"]) - trade_commission + trade["commission"] = trade_commission num_trades = len(trade_list) + fill_list = zipline_fills( + transactions, + asset="TEST", + commission_rate=float(constants.get("commission_rate", 0.0)), + per_share_rate=float(constants.get("per_share_rate", 0.0)), + ) extra = {} if "commission" in scenario.extra_checks: @@ -249,6 +260,8 @@ def analyze(context, perf): total_pnl=final_value - scenario.initial_cash, num_trades=num_trades, trades=trade_list, + fills=fill_list, + capabilities=FRAMEWORK_CAPABILITIES["zipline"], extra=extra, ) diff --git a/validation/generate_parity_claims.py b/validation/generate_parity_claims.py index 4c61a86c..e06714aa 100644 --- a/validation/generate_parity_claims.py +++ b/validation/generate_parity_claims.py @@ -10,6 +10,7 @@ from common.correctness_evidence import correctness_report_failures from common.framework_registry import load_framework_manifest +from scenarios.definitions import SCENARIOS PROJECT_ROOT = Path(__file__).parent.parent CORRECTNESS_EVIDENCE = PROJECT_ROOT / "validation" / "CORRECTNESS_RESULTS.json" @@ -47,8 +48,8 @@ def _validate_evidence(correctness: dict[str, Any], large_scale: dict[str, Any]) raise ValueError("Correctness evidence does not cover the required framework matrix") for framework in expected: framework_records = [record for record in records if record.get("framework") == framework] - if len(framework_records) != 16: - raise ValueError(f"Expected 16 retained records for {framework}") + if len(framework_records) != len(SCENARIOS): + raise ValueError(f"Expected {len(SCENARIOS)} retained records for {framework}") if large_scale.get("exact_comparison", {}).get("passed") is not True: raise ValueError("Large-scale evidence is not an exact canonical pass") diff --git a/validation/release_checks.txt b/validation/release_checks.txt index f2635fb8..269e43f3 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -10,6 +10,8 @@ validation/performance_baseline.py validation/release_candidate.py validation/run_all_correctness.py validation/run_lean_case_studies.py +validation/common/canonical_records.py +validation/common/capabilities.py validation/common/comparator.py validation/common/correctness_evidence.py validation/common/data_generators.py diff --git a/validation/run_scenario.py b/validation/run_scenario.py index 0b9de24f..4f25b560 100644 --- a/validation/run_scenario.py +++ b/validation/run_scenario.py @@ -23,7 +23,6 @@ import argparse import importlib import json -import math import sys import time from pathlib import Path @@ -90,19 +89,15 @@ def _record( def _malformed_result_detail(result: object) -> str | None: if not isinstance(result, FrameworkResult): return f"Adapter returned {type(result).__name__}, expected FrameworkResult" - if not isinstance(result.framework, str) or not result.framework: - return "FrameworkResult.framework must be a nonempty string" - if not isinstance(result.num_trades, int) or isinstance(result.num_trades, bool): - return "FrameworkResult.num_trades must be an integer" - if result.num_trades < 0: - return "FrameworkResult.num_trades cannot be negative" - for name, value in (("final_value", result.final_value), ("total_pnl", result.total_pnl)): - if not isinstance(value, (int, float)) or isinstance(value, bool): - return f"FrameworkResult.{name} must be numeric" - if not math.isfinite(float(value)): - return f"FrameworkResult.{name} must be finite" - if not isinstance(result.trades, list): - return "FrameworkResult.trades must be a list" + try: + FrameworkResult.from_dict(result.to_dict()) + except (TypeError, ValueError) as error: + return str(error) + if result.num_trades != len(result.trades): + return ( + "FrameworkResult.num_trades must equal the retained closed-trade count: " + f"{result.num_trades} != {len(result.trades)}" + ) return None diff --git a/validation/scenarios/definitions.py b/validation/scenarios/definitions.py index 4021ba02..0706a222 100644 --- a/validation/scenarios/definitions.py +++ b/validation/scenarios/definitions.py @@ -1,4 +1,4 @@ -"""All 16 validation scenarios as declarative configs. +"""All cross-framework validation scenarios as declarative configs. Each scenario is a ScenarioConfig that fully describes: - What data to generate @@ -488,13 +488,13 @@ def _fw_tolerances() -> dict[str, Tolerance]: ) # ============================================================================ -# Scenario 16: Stress Test (1500 bars) +# Scenario 16: Regime Path Coverage (1500 bars) # ============================================================================ SCENARIO_16 = ScenarioConfig( id="16", - name="Stress Test", - description="1500-bar stress test with 9 market regimes.", + name="Regime Path Coverage", + description="1500-bar path with 9 market regimes and sparse re-entry signals.", data_generator="generate_stress_data", data_kwargs={"n_bars": 1500, "seed": 42}, signal_columns=["entry"], @@ -523,6 +523,21 @@ def _fw_tolerances() -> dict[str, Tolerance]: }, ) +# ============================================================================ +# Scenario 17: High Event Count +# ============================================================================ + +SCENARIO_17 = ScenarioConfig( + id="17", + name="High Event Count", + description="1800-bar lifecycle workload with up to 600 completed round trips.", + data_generator="generate_high_event_data", + data_kwargs={"n_bars": 1800, "seed": 7}, + signal_columns=["entry", "exit"], + strategy_type="long_signal", + tolerances=_fw_tolerances(), +) + # ============================================================================ # Registry # ============================================================================ @@ -544,6 +559,7 @@ def _fw_tolerances() -> dict[str, Tolerance]: "14": SCENARIO_14, "15": SCENARIO_15, "16": SCENARIO_16, + "17": SCENARIO_17, } SCENARIO_NAMES: dict[str, str] = {s.id: s.name for s in SCENARIOS.values()} From a40b5c246eedd918ac052475d505b4795e600eb5 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 01:12:44 -0400 Subject: [PATCH 09/44] fix(validation): make input provenance version independent --- tests/contracts/test_correctness_evidence.py | 17 ++++++++++++ validation/common/provenance.py | 27 +++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/tests/contracts/test_correctness_evidence.py b/tests/contracts/test_correctness_evidence.py index 4d9d31bf..5f857430 100644 --- a/tests/contracts/test_correctness_evidence.py +++ b/tests/contracts/test_correctness_evidence.py @@ -8,6 +8,7 @@ from pathlib import Path from typing import Any, cast +import pandas as pd import pytest _VALIDATION_DIR = Path(__file__).parents[2] / "validation" @@ -141,6 +142,22 @@ def test_complete_record_retains_outputs_checks_runtime_and_provenance() -> None ) +def test_input_digest_uses_values_not_pandas_index_metadata() -> None: + scenario = SCENARIOS["01"] + prices, entries, exits = generate_inputs(scenario, "backtrader") + assert exits is not None + expected = input_digest(prices, entries, exits) + + same_values = prices.copy() + same_values.index = pd.DatetimeIndex(same_values.index.to_numpy()) + assert same_values.index.freq is None + assert input_digest(same_values, entries.copy(), exits.copy()) == expected + + changed_values = prices.copy() + changed_values.iloc[0, 0] += 0.01 + assert input_digest(changed_values, entries, exits) != expected + + def test_complete_current_matrix_is_acceptable() -> None: assert correctness_report_failures(_full_report()) == [] diff --git a/validation/common/provenance.py b/validation/common/provenance.py index 4b275c80..82fc12a4 100644 --- a/validation/common/provenance.py +++ b/validation/common/provenance.py @@ -86,16 +86,37 @@ def input_digest( entries: np.ndarray, exits: np.ndarray | None, ) -> str: - """Hash generated prices and signals without depending on display formatting.""" + """Hash generated prices and signals independently of pandas hashing internals.""" + if not isinstance(prices.index, pd.DatetimeIndex): + raise TypeError("validation prices must use a DatetimeIndex") + digest = hashlib.sha256() frame_identity = { "columns": [str(column) for column in prices.columns], "dtypes": [str(dtype) for dtype in prices.dtypes], - "index_dtype": str(prices.index.dtype), + "index": { + "dtype": "datetime64[ns]", + "name": prices.index.name, + "timezone": str(prices.index.tz) if prices.index.tz is not None else None, + }, "shape": prices.shape, } digest.update(json.dumps(frame_identity, sort_keys=True).encode("utf-8")) - digest.update(pd.util.hash_pandas_object(prices, index=True).values.tobytes()) + normalized_index = ( + prices.index.tz_convert("UTC").tz_localize(None) + if prices.index.tz is not None + else prices.index + ) + index_values = np.ascontiguousarray( + normalized_index.to_numpy(dtype="datetime64[ns]").view(" Date: Fri, 14 Aug 2026 01:16:32 -0400 Subject: [PATCH 10/44] docs(validation): publish complete current parity evidence --- README.md | 10 +- docs/index.md | 10 +- docs/user-guide/profiles.md | 10 +- .../contracts/test_parity_claim_generation.py | 12 +- validation/CORRECTNESS_RESULTS.json | 294219 ++++++++++++++- validation/METHODOLOGY.md | 10 +- validation/README.md | 10 +- validation/generate_parity_claims.py | 5 +- 8 files changed, 294245 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 426ce09e..517dee5d 100644 --- a/README.md +++ b/README.md @@ -282,14 +282,14 @@ claims supported by the retained release-candidate evidence. -Scenario claims use the retained release-candidate matrix. "Exact" appears only when every required scenario has zero canonical gap. +Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| -| `vectorbt_strict` | [VectorBT Pro 2025.12.31](https://github.com/polakowo/vectorbt.pro) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 0.28.2](https://pypi.org/project/vectorbt/0.28.2/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | Large-scale claims are published only when a retained workload has zero canonical gap. diff --git a/docs/index.md b/docs/index.md index 1a58b096..106f0281 100644 --- a/docs/index.md +++ b/docs/index.md @@ -103,14 +103,14 @@ claims additionally require a retained workload with canonical record hashes and -Scenario claims use the retained release-candidate matrix. "Exact" appears only when every required scenario has zero canonical gap. +Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| -| `vectorbt_strict` | [VectorBT Pro 2025.12.31](https://github.com/polakowo/vectorbt.pro) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 0.28.2](https://pypi.org/project/vectorbt/0.28.2/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | Large-scale claims are published only when a retained workload has zero canonical gap. diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index 360b3ad5..6e2b44e9 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -156,14 +156,14 @@ at the declared $0.0001 quantum. See `validation/native/evidence/lean-18001.json -Scenario claims use the retained release-candidate matrix. "Exact" appears only when every required scenario has zero canonical gap. +Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| -| `vectorbt_strict` | [VectorBT Pro 2025.12.31](https://github.com/polakowo/vectorbt.pro) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 0.28.2](https://pypi.org/project/vectorbt/0.28.2/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | Large-scale claims are published only when a retained workload has zero canonical gap. diff --git a/tests/contracts/test_parity_claim_generation.py b/tests/contracts/test_parity_claim_generation.py index af24ff56..c852ef1f 100644 --- a/tests/contracts/test_parity_claim_generation.py +++ b/tests/contracts/test_parity_claim_generation.py @@ -16,12 +16,18 @@ def test_legacy_accepted_evidence_cannot_generate_current_claims() -> None: - before = {path: path.read_bytes() for path in generate_parity_claims.TARGETS} + correctness = copy.deepcopy( + generate_parity_claims._load_json(generate_parity_claims.CORRECTNESS_EVIDENCE) + ) + large_scale = generate_parity_claims._load_json(generate_parity_claims.LARGE_SCALE_EVIDENCE) + correctness["schema_version"] = 1 with pytest.raises(ValueError, match="Unsupported correctness schema: 1"): - generate_parity_claims.synchronize(check=False) + generate_parity_claims._validate_evidence(correctness, large_scale) + - assert {path: path.read_bytes() for path in generate_parity_claims.TARGETS} == before +def test_generated_claims_are_current() -> None: + assert generate_parity_claims.synchronize(check=True) == [] def test_every_claim_target_uses_the_same_generated_block() -> None: diff --git a/validation/CORRECTNESS_RESULTS.json b/validation/CORRECTNESS_RESULTS.json index d5f14833..908b48e9 100644 --- a/validation/CORRECTNESS_RESULTS.json +++ b/validation/CORRECTNESS_RESULTS.json @@ -1,40 +1,1394 @@ { + "comparison_policy": { + "canonical_quantum": "0.00000001", + "meaning": "equality after canonical quantization, not bit identity", + "record_order": "significant", + "rounding": "ROUND_HALF_EVEN", + "surfaces": [ + "terminal", + "closed_trades", + "fills" + ], + "timestamp_domain": "daily session date" + }, "frameworks": { "backtrader": { + "access": "public", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", "package": "backtrader", "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", "source": "https://pypi.org/project/backtrader/1.9.78.123/", "version": "1.9.78.123" }, "vectorbt_oss": { + "access": "public", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", "package": "vectorbt", "profile": "vectorbt", - "source": "https://pypi.org/project/vectorbt/0.28.2/", - "version": "0.28.2" + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" }, "vectorbt_pro": { - "commit": "1305a1e1974325db9382eaeacc6452e9b075ca71", + "access": "licensed", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", "package": "vectorbtpro", "profile": "vectorbt_strict", + "python": ">=3.11", "source": "https://github.com/polakowo/vectorbt.pro", - "version": "2025.12.31" + "version": "2026.6.27" }, "zipline": { + "access": "public", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", "package": "zipline-reloaded", "profile": "zipline_strict", + "python": ">=3.10", "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", "version": "3.1.1" } }, - "generated_at": "2026-08-08T12:20:05.088761+00:00", + "generated_at": "2026-08-14T05:15:38.885810+00:00", "records": [ { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98778.90186467487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 98778.90186467487, + "message": "VectorBT Pro=$98,778.9018646749, ML4T=$98,778.9018646749 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1221.0981353251263, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -1221.0981353251263, + "message": "VectorBT Pro=$-1,221.0981353251, ML4T=$-1,221.0981353251 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "01" + }, "detail": null, + "duration_seconds": 2.3022239189594984, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "01", @@ -42,8 +1396,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98778.90186467487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 98778.90186467487, + "message": "VectorBT Pro=$98,778.9018646749, ML4T=$98,778.9018646749 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1221.0981353251263, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -1221.0981353251263, + "message": "VectorBT Pro=$-1,221.0981353251, ML4T=$-1,221.0981353251 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "02" + }, "detail": null, + "duration_seconds": 2.3081350419670343, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "02", @@ -51,8 +2726,317 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT Pro=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99500.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99500.0, + "message": "VectorBT Pro=$99,500.0000000000, ML4T=$99,500.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -500.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": -500.0, + "message": "VectorBT Pro=$-500.0000000000, ML4T=$-500.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 95.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 95.0, + "message": "VectorBT Pro=$95.0000000000, ML4T=$95.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "03" + }, "detail": null, + "duration_seconds": 2.3090186859481037, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 95.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99500.0, + "framework": "VectorBT Pro", + "num_trades": 1, + "total_pnl": -500.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 95.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99500.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -500.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 20, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "03", @@ -60,8 +3044,317 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT Pro=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 101050.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 101050.0, + "message": "VectorBT Pro=$101,050.0000000000, ML4T=$101,050.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1050.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 1050.0, + "message": "VectorBT Pro=$1,050.0000000000, ML4T=$1,050.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 110.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 110.5, + "message": "VectorBT Pro=$110.5000000000, ML4T=$110.5000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "04" + }, "detail": null, + "duration_seconds": 2.297614884097129, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 110.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 101050.0, + "framework": "VectorBT Pro", + "num_trades": 1, + "total_pnl": 1050.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 110.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 101050.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 1050.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 20, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "04", @@ -69,8 +3362,1343 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98602.0173051621, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 2.9103830456733704e-11, + "expected": 98602.01730516207, + "message": "VectorBT Pro=$98,602.0173051621, ML4T=$98,602.0173051621 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1397.982694837905, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 2.9103830456733704e-11, + "expected": -1397.982694837934, + "message": "VectorBT Pro=$-1,397.9826948379, ML4T=$-1,397.9826948379 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 176.8845595128108, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 176.8845595128108, + "message": "VectorBT Pro=$176.8845595128, ML4T=$176.8845595128 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.104291559917314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.0483236286091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688687495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442486, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663618, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258533, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.3155341196167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688291, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442485, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "05" + }, "detail": null, + "duration_seconds": 2.3087035389617085, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 176.8845595128108 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.01730516207, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": -1397.982694837934, + "trades": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663618, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258533, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.3155341196167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688291, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442485, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 176.8845595128108 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.0173051621, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1397.982694837905, + "trades": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.104291559917314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.0483236286091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688687495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442486, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "05", @@ -78,8 +4706,1343 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98768.90186467487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 98768.90186467487, + "message": "VectorBT Pro=$98,768.9018646749, ML4T=$98,768.9018646749 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1231.0981353251263, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -1231.0981353251263, + "message": "VectorBT Pro=$-1,231.0981353251, ML4T=$-1,231.0981353251 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 10.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 10.0, + "message": "VectorBT Pro=$10.0000000000, ML4T=$10.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 319.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -918.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -381.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 66.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -407.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 245.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -53.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 213.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 0.059393907875346486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -316.418378739706, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 319.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -918.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -381.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 66.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -407.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 245.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -53.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 213.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 0.05939390787455068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -316.41837873970593, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.5, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "06" + }, "detail": null, + "duration_seconds": 2.3084055720828474, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 10.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.5, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98768.90186467487, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": -1231.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 319.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -918.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -381.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 66.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -407.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 245.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -53.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 213.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 0.05939390787455068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -316.41837873970593, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 10.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98768.90186467487, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1231.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 319.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -918.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -381.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 66.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -407.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 245.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -53.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 213.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 0.059393907875346486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -316.418378739706, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "523af2137e8233ef65d03ffb841e91525f65f7c3057b3111e86aedbf0a973fb7" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "06", @@ -87,8 +6050,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98758.88423767696, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 98758.88423767698, + "message": "VectorBT Pro=$98,758.8842376770, ML4T=$98,758.8842376770 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1241.1157623230392, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 1.4551915228366852e-11, + "expected": -1241.1157623230247, + "message": "VectorBT Pro=$-1,241.1157623230, ML4T=$-1,241.1157623230 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0098089448947, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969144, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.37822753298649, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583236, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1660993670657, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.344064639912, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.20347271536775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.26653798999779, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618961, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.2120800319358, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.29669089980507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600282, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120857, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096519439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516977, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.00980894489471, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.3782275329865, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.16609936706568, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.34406463991202, + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.2034727153664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.2665379899978, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618963, + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.21208003193583, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.2966908998074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600283, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096516597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516981, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.0098089448947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.37822753298649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.344064639912, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.26653798999779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.92471989618961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.2120800319358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.42218168600282, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.00980894489471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.3782275329865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34406463991202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.2665379899978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.92471989618963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.21208003193581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.42218168600283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "07" + }, "detail": null, + "duration_seconds": 2.3003372810781, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.00980894489471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.3782275329865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34406463991202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.2665379899978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.92471989618963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.21208003193581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.42218168600283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98758.88423767698, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": -1241.1157623230247, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.00980894489471, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.3782275329865, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.16609936706568, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.34406463991202, + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.2034727153664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.2665379899978, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618963, + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.21208003193583, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.2966908998074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600283, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096516597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516981, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.0098089448947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.37822753298649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.344064639912, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.26653798999779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.92471989618961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.2120800319358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.42218168600282, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98758.88423767696, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1241.1157623230392, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0098089448947, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969144, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.37822753298649, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583236, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1660993670657, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.344064639912, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.20347271536775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.26653798999779, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618961, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.2120800319358, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.29669089980507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600282, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120857, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096519439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516977, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "07", @@ -96,8 +7380,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98602.01730516205, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 98602.01730516207, + "message": "VectorBT Pro=$98,602.0173051621, ML4T=$98,602.0173051621 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1397.9826948379487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 1.4551915228366852e-11, + "expected": -1397.982694837934, + "message": "VectorBT Pro=$-1,397.9826948379, ML4T=$-1,397.9826948379 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.09937756510391, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503983, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.433350266363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.92112392585113, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528986, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.287640301907, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700879, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499065, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007963, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600575, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.74723658428812, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442473, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0993775651039, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503981, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528984, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.28764030190699, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700877, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499063, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600574, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.7472365842881, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.27477968868709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442476, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.09937756510391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.47432996503983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.34480674528986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.287640301907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.41312912700879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.35182203499065, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.49615479600575, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74723658428812, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.0993775651039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.47432996503981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.34480674528984, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.28764030190699, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.41312912700877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.35182203499063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.49615479600574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.7472365842881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "08" + }, "detail": null, + "duration_seconds": 2.3101020380854607, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.0993775651039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.47432996503981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.34480674528984, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.28764030190699, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.41312912700877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.35182203499063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.49615479600574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.7472365842881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.01730516207, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": -1397.982694837934, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0993775651039, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503981, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528984, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.28764030190699, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700877, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499063, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600574, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.7472365842881, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.27477968868709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442476, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.09937756510391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.47432996503983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.34480674528986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.287640301907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.41312912700879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.35182203499065, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.49615479600575, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74723658428812, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.01730516205, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1397.9826948379487, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.09937756510391, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503983, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.433350266363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.92112392585113, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528986, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.287640301907, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700879, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499065, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007963, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600575, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.74723658428812, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442473, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "08", @@ -105,8 +8710,417 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "VectorBT Pro=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100363.84268834148, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.5, + "difference": 0.0, + "expected": 100363.84268834148, + "message": "VectorBT Pro=$100,363.8426883415, ML4T=$100,363.8426883415 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.5%)", + "name": "final_value", + "passed": true + }, + { + "actual": 363.8426883414795, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 50.0, + "difference": 0.0, + "expected": 363.8426883414795, + "message": "VectorBT Pro=$363.8426883415, ML4T=$363.8426883415 (exact_diff=$0.0000000000; diagnostic_limit=$50.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.85822292976627, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.01553458828494, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.8582229297665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.0155345882842, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "09" + }, "detail": null, + "duration_seconds": 2.311944976914674, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 100363.84268834148, + "framework": "VectorBT Pro", + "num_trades": 2, + "total_pnl": 363.8426883414795, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.8582229297665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.0155345882842, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 100363.84268834148, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 363.8426883414795, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.85822292976627, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.01553458828494, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "09", @@ -114,8 +9128,531 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 3, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 3, + "message": "VectorBT Pro=3, ML4T=3, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99854.35332614176, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.5, + "difference": 1.4551915228366852e-11, + "expected": 99854.35332614178, + "message": "VectorBT Pro=$99,854.3533261418, ML4T=$99,854.3533261418 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.5%)", + "name": "final_value", + "passed": true + }, + { + "actual": -145.6466738582385, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 50.0, + "difference": 1.4551915228366852e-11, + "expected": -145.64667385822395, + "message": "VectorBT Pro=$-145.6466738582, ML4T=$-145.6466738582 (exact_diff=$0.0000000000; diagnostic_limit=$50.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_reason": "take_profit", + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_reason": "stop_loss", + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.274411914932, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.2744119149315, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "10" + }, "detail": null, + "duration_seconds": 2.320407192921266, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "final_value": 99854.35332614178, + "framework": "VectorBT Pro", + "num_trades": 3, + "total_pnl": -145.64667385822395, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.2744119149315, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "final_value": 99854.35332614176, + "framework": "ml4t.backtest", + "num_trades": 3, + "total_pnl": -145.6466738582385, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_reason": "take_profit", + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_reason": "stop_loss", + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.274411914932, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "23ed56800f308478a89f083eb8c33c3d0aa5bd6475dbcdc2092bb3b975c5eb45", + "scenario": "ca329113ef7eae6ef6cb075659587a244d4808ab35df74a891dcea2db9151f0e" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 3, + "exit_signals": 0, + "framework_closed_trades": 3, + "framework_fills": 6, + "framework_intents": 3, + "framework_orders": null, + "ml4t_closed_trades": 3, + "ml4t_fills": 6, + "ml4t_intents": 3, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "10", @@ -123,8 +9660,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT Pro=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1000951.8554526691, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 2.3283064365386963e-10, + "expected": 1000951.8554526689, + "message": "VectorBT Pro=$1,000,951.8554526689, ML4T=$1,000,951.8554526691 (exact_diff=$0.0000000002, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 951.8554526690859, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 2.3283064365386963e-10, + "expected": 951.8554526688531, + "message": "VectorBT Pro=$951.8554526689, ML4T=$951.8554526691 (exact_diff=$0.0000000002; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.8693728948256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.12381097977595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392333, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_reason": "signal", + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.7783612659923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.79208184900017, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_reason": "signal", + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227825, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.869372894825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.1238109797756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346261, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.77836126599277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.792081849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227814, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "11" + }, "detail": null, + "duration_seconds": 2.378596806200221, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "final_value": 1000951.8554526689, + "framework": "VectorBT Pro", + "num_trades": 10, + "total_pnl": 951.8554526688531, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.869372894825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.1238109797756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346261, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.77836126599277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.792081849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227814, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "final_value": 1000951.8554526691, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": 951.8554526690859, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.8693728948256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.12381097977595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392333, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_reason": "signal", + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.7783612659923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.79208184900017, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_reason": "signal", + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227825, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 200, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "11", @@ -132,8 +10990,417 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "VectorBT Pro=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1001485.7011748579, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.5, + "difference": 0.0, + "expected": 1001485.7011748579, + "message": "VectorBT Pro=$1,001,485.7011748579, ML4T=$1,001,485.7011748579 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.5%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1485.7011748579098, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 50.0, + "difference": 0.0, + "expected": 1485.7011748579098, + "message": "VectorBT Pro=$1,485.7011748579, ML4T=$1,485.7011748579 (exact_diff=$0.0000000000; diagnostic_limit=$50.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725157, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383595, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725158, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383737, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "12" + }, "detail": null, + "duration_seconds": 3.7011152170598507, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 1001485.7011748579, + "framework": "VectorBT Pro", + "num_trades": 2, + "total_pnl": 1485.7011748579098, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725158, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383737, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 1001485.7011748579, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 1485.7011748579098, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725157, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383595, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "2f85fd2bb26ba7275d3a5ffb9eaf57ef5895665282032aabb7672ae871a8df34", + "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "12", @@ -141,8 +11408,303 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT Pro=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100800.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 100800.0, + "message": "VectorBT Pro=$100,800.0000000000, ML4T=$100,800.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 800.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 800.0, + "message": "VectorBT Pro=$800.0000000000, ML4T=$800.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_reason": "take_profit", + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "13" + }, "detail": null, + "duration_seconds": 2.309941826155409, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "final_value": 100800.0, + "framework": "VectorBT Pro", + "num_trades": 1, + "total_pnl": 800.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "final_value": 100800.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 800.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_reason": "take_profit", + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "13", @@ -150,8 +11712,303 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT Pro=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99889.95449782923, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99889.95449782923, + "message": "VectorBT Pro=$99,889.9544978292, ML4T=$99,889.9544978292 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -110.04550217077485, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -110.04550217077485, + "message": "VectorBT Pro=$-110.0455021708, ML4T=$-110.0455021708 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077121, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077167, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "14" + }, "detail": null, + "duration_seconds": 3.0959273409098387, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "final_value": 99889.95449782923, + "framework": "VectorBT Pro", + "num_trades": 1, + "total_pnl": -110.04550217077485, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077167, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "final_value": 99889.95449782923, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -110.04550217077485, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077121, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "14", @@ -159,8 +12016,303 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT Pro=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99670.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99670.0, + "message": "VectorBT Pro=$99,670.0000000000, ML4T=$99,670.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -330.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -330.0, + "message": "VectorBT Pro=$-330.0000000000, ML4T=$-330.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-03T00:00:00", + "pnl": -330.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_time": "2020-01-03T00:00:00", + "pnl": -329.9999999999997, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "15" + }, "detail": null, + "duration_seconds": 4.586802172008902, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "final_value": 99670.0, + "framework": "VectorBT Pro", + "num_trades": 1, + "total_pnl": -330.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_time": "2020-01-03T00:00:00", + "pnl": -329.9999999999997, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "final_value": 99670.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -330.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-03T00:00:00", + "pnl": -330.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "15", @@ -168,17 +12320,71135 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 9, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 9, + "message": "VectorBT Pro=9, ML4T=9, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 104005.39557457357, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 2.9103830456733704e-11, + "expected": 104005.3955745736, + "message": "VectorBT Pro=$104,005.3955745736, ML4T=$104,005.3955745736 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=1.0%)", + "name": "final_value", + "passed": true + }, + { + "actual": 4005.395574573573, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 200.0, + "difference": 2.9103830456733704e-11, + "expected": 4005.395574573602, + "message": "VectorBT Pro=$4,005.3955745736, ML4T=$4,005.3955745736 (exact_diff=$0.0000000000; diagnostic_limit=$200.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641157, + "exit_reason": "trailing_stop", + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904412, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.0707718760177, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.2924352735281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.2468713643689, + "exit_reason": "trailing_stop", + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672089, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.8491078479456, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_reason": "trailing_stop", + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.70076277915071, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.44698444994174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_reason": "trailing_stop", + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.38168930537722, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367938, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641158, + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904414, + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.070771876018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.29243527352696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.24687136436893, + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672092, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.849107847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.7007627791507, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.4469844499416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.3816893053778, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 103.42819240641157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 85.73788226904412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 163.2468713643689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 103.42819240641158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.73788226904414, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 163.24687136436893, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "16" + }, "detail": null, + "duration_seconds": 2.371119718067348, "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 103.42819240641158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.73788226904414, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 163.24687136436893, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "final_value": 104005.3955745736, + "framework": "VectorBT Pro", + "num_trades": 9, + "total_pnl": 4005.395574573602, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367938, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641158, + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904414, + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.070771876018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.29243527352696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.24687136436893, + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672092, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.849107847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.7007627791507, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.4469844499416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.3816893053778, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 103.42819240641157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 85.73788226904412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 163.2468713643689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "final_value": 104005.39557457357, + "framework": "ml4t.backtest", + "num_trades": 9, + "total_pnl": 4005.395574573573, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641157, + "exit_reason": "trailing_stop", + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904412, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.0707718760177, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.2924352735281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.2468713643689, + "exit_reason": "trailing_stop", + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672089, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.8491078479456, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_reason": "trailing_stop", + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.70076277915071, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.44698444994174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_reason": "trailing_stop", + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.38168930537722, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 1500, + "entry_signals": 9, + "exit_signals": 0, + "framework_closed_trades": 9, + "framework_fills": 18, + "framework_intents": 9, + "framework_orders": null, + "ml4t_closed_trades": 9, + "ml4t_fills": 18, + "ml4t_intents": 9, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "16", - "scenario_name": "Stress Test", + "scenario_name": "Regime Path Coverage", + "status": "pass" + }, + { + "comparison": { + "checks": [ + { + "actual": 600, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 600, + "message": "VectorBT Pro=600, ML4T=600, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99082.81840069593, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 3.2014213502407074e-10, + "expected": 99082.81840069561, + "message": "VectorBT Pro=$99,082.8184006956, ML4T=$99,082.8184006959 (exact_diff=$0.0000000003, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -917.1815993040655, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 3.2014213502407074e-10, + "expected": -917.1815993043856, + "message": "VectorBT Pro=$-917.1815993044, ML4T=$-917.1815993041 (exact_diff=$0.0000000003; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_reason": "signal", + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593714173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_reason": "signal", + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.818605100987043, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_reason": "signal", + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.094491136524084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_reason": "signal", + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586200102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_reason": "signal", + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218801145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.06433008222848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_reason": "signal", + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086653, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_reason": "signal", + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680638855, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741877003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_reason": "signal", + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684178083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_reason": "signal", + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.346779314319065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_reason": "signal", + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_reason": "signal", + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_reason": "signal", + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.694397571409354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_reason": "signal", + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.96197214105996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.558125592699071, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_reason": "signal", + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214677402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_reason": "signal", + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934980273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.159232215391967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_reason": "signal", + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853665932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43920860251751, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_reason": "signal", + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.84139686416711, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_reason": "signal", + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871567, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_reason": "signal", + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385939875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_reason": "signal", + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.514731714896698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_reason": "signal", + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.41755988945988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.1907166501479, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_reason": "signal", + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.271444044707096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_reason": "signal", + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.256873912370793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.71147617965471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_reason": "signal", + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.411611225090383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_reason": "signal", + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_reason": "signal", + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534164, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_reason": "signal", + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.436010484158032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_reason": "signal", + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.31659762711024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_reason": "signal", + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.8847571184524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_reason": "signal", + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.551277113443575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579693, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_reason": "signal", + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658736, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_reason": "signal", + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.244563725602347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.6794133043149486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_reason": "signal", + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691421134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.66423065390151, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_reason": "signal", + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_reason": "signal", + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_reason": "signal", + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_reason": "signal", + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299107568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_reason": "signal", + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.233553610009039, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_reason": "signal", + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779575956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_reason": "signal", + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904841, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632265, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_reason": "signal", + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552286926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_reason": "signal", + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243633828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_reason": "signal", + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060870859, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473834, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_reason": "signal", + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.27435094678003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_reason": "signal", + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_reason": "signal", + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_reason": "signal", + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_reason": "signal", + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828939593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_reason": "signal", + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.83390508796765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_reason": "signal", + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.0899776971346, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390373, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_reason": "signal", + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503891584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_reason": "signal", + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.221431138130356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_reason": "signal", + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967262, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_reason": "signal", + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.314194464974207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_reason": "signal", + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.43536536485044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_reason": "signal", + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957024068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_reason": "signal", + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605265767, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_reason": "signal", + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222878, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_reason": "signal", + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933833377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_reason": "signal", + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.43108275249142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_reason": "signal", + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232703194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_reason": "signal", + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.736746809110628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_reason": "signal", + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870249869, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_reason": "signal", + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_reason": "signal", + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.767928866775037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_reason": "signal", + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.499046203607577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.4442900442657, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_reason": "signal", + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.4733285004258505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_reason": "signal", + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.41985975424359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_reason": "signal", + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131527593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_reason": "signal", + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.12874559926604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_reason": "signal", + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_reason": "signal", + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055832713, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_reason": "signal", + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.46850096455091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_reason": "signal", + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_reason": "signal", + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_reason": "signal", + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.2860554086219054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_reason": "signal", + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.62622492499031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_reason": "signal", + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_reason": "signal", + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_reason": "signal", + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.8392652928469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_reason": "signal", + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057535155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_reason": "signal", + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190440912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_reason": "signal", + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.57925581127165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_reason": "signal", + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_reason": "signal", + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803505642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.916410701528, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_reason": "signal", + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245994729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_reason": "signal", + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.370378005640305, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_reason": "signal", + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_reason": "signal", + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.328749896181762, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_reason": "signal", + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580978493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_reason": "signal", + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.13393585817721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_reason": "signal", + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314274366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_reason": "signal", + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.435014304764991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_reason": "signal", + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_reason": "signal", + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840375183, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508901, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_reason": "signal", + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_reason": "signal", + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534470988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_reason": "signal", + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.279537798676756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_reason": "signal", + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988052733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_reason": "signal", + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_reason": "signal", + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648283211, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_reason": "signal", + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.23956958396775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738782, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_reason": "signal", + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.54950419017041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_reason": "signal", + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.3170582707898575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_reason": "signal", + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958929473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_reason": "signal", + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.799287939786154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_reason": "signal", + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.566110234804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_reason": "signal", + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580273526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_reason": "signal", + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_reason": "signal", + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.99451954396136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_reason": "signal", + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360714424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359947, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_reason": "signal", + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251026673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_reason": "signal", + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.55524721888287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349607, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_reason": "signal", + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151735998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_reason": "signal", + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.16380493579527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_reason": "signal", + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.324330426270535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_reason": "signal", + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446389, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_reason": "signal", + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_reason": "signal", + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_reason": "signal", + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_reason": "signal", + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_reason": "signal", + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.71778229872325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309691, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_reason": "signal", + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.085012296938658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_reason": "signal", + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118006887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_reason": "signal", + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.358103555914568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670386, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_reason": "signal", + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937580086, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.939646337063, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_reason": "signal", + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463671638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_reason": "signal", + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.64107989219883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_reason": "signal", + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978554927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_reason": "signal", + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461125902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_reason": "signal", + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.29187006162101, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_reason": "signal", + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_reason": "signal", + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198639, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_reason": "signal", + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_reason": "signal", + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.247732215164433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_reason": "signal", + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.498636898822951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_reason": "signal", + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_reason": "signal", + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615309366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_reason": "signal", + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4607924127623, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_reason": "signal", + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155382, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_reason": "signal", + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.942910425748778, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_reason": "signal", + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.159607901468917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_reason": "signal", + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.665720246286583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329608, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_reason": "signal", + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375868318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_reason": "signal", + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.25433549778063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_reason": "signal", + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251336331, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_reason": "signal", + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.651066015805554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_reason": "signal", + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288788485, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7509399436349, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_reason": "signal", + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_reason": "signal", + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.6613055010057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_reason": "signal", + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.351515279440719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_reason": "signal", + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763889453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_reason": "signal", + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.972436242504045, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544105, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_reason": "signal", + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616735905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.78182814117551, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_reason": "signal", + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.6414770862847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_reason": "signal", + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.52202640160067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_reason": "signal", + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004907486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_reason": "signal", + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.36504877182051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6600503714477, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_reason": "signal", + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430941865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_reason": "signal", + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253732356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.51475031329109, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_reason": "signal", + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865565558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_reason": "signal", + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911403636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201514, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_reason": "signal", + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702404, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_reason": "signal", + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.67990156245469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510083, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_reason": "signal", + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588427, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_reason": "signal", + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.615865477519037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_reason": "signal", + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983330013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644765, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_reason": "signal", + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.47155236267281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_reason": "signal", + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035865418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_reason": "signal", + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.4763061822523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29424834791328, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_reason": "signal", + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.820916103664786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_reason": "signal", + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.929103047956232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_reason": "signal", + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437553964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_reason": "signal", + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.25348107968057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367423, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_reason": "signal", + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695449437, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_reason": "signal", + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075543615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368549, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_reason": "signal", + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.213038607964336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_reason": "signal", + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543946172, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_reason": "signal", + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.3119127778427355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_reason": "signal", + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109606473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831216, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_reason": "signal", + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498263729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861235, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_reason": "signal", + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.112939943153833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_reason": "signal", + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352885, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_reason": "signal", + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828477266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_reason": "signal", + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_reason": "signal", + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.193972490449596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_reason": "signal", + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.634815022258408, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_reason": "signal", + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495900064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_reason": "signal", + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_reason": "signal", + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_reason": "signal", + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200341314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_reason": "signal", + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.708906925368865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_reason": "signal", + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937353803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_reason": "signal", + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823867046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178705, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_reason": "signal", + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.51189970753876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831386, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_reason": "signal", + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.2537923861618765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318698, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_reason": "signal", + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467449975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_reason": "signal", + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287143015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_reason": "signal", + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_reason": "signal", + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_reason": "signal", + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_reason": "signal", + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.89955729355279, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_reason": "signal", + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540020673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_reason": "signal", + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.301836282287695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715277, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_reason": "signal", + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089780547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_reason": "signal", + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.204835787799311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551608, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_reason": "signal", + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801757812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_reason": "signal", + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714099, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_reason": "signal", + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578473054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_reason": "signal", + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.046466530036923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_reason": "signal", + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716468106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_reason": "signal", + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.062989705174914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_reason": "signal", + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.846550115415084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_reason": "signal", + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669813805, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_reason": "signal", + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.148929313827466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_reason": "signal", + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.67007162115442, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_reason": "signal", + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417203755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3692642985158, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_reason": "signal", + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996231617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_reason": "signal", + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259348306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96384685743692, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_reason": "signal", + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.492351047065313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_reason": "signal", + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.6960470240283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_reason": "signal", + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767725106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60924422208079, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_reason": "signal", + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152243435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842418, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_reason": "signal", + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_reason": "signal", + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066539056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286363, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_reason": "signal", + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703182832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_reason": "signal", + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.26658756026336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_reason": "signal", + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979885537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939167, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_reason": "signal", + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.958284267167983, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_reason": "signal", + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.67518695522449, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_reason": "signal", + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953632, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563325, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_reason": "signal", + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011503856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635457, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_reason": "signal", + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.20190875498156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144556, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_reason": "signal", + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.188786913549848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_reason": "signal", + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_reason": "signal", + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_reason": "signal", + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266028649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_reason": "signal", + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_reason": "signal", + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.7508117158831737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_reason": "signal", + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39339911911829, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_reason": "signal", + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_reason": "signal", + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.83820052784904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_reason": "signal", + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_reason": "signal", + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_reason": "signal", + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_reason": "signal", + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.807707795838724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_reason": "signal", + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_reason": "signal", + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.58063831637992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_reason": "signal", + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.70807407659231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_reason": "signal", + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.9131983498464251, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109037, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_reason": "signal", + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607728587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654936, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_reason": "signal", + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964951458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_reason": "signal", + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_reason": "signal", + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.30218492307904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_reason": "signal", + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.116009860519625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_reason": "signal", + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721801443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_reason": "signal", + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.377991396690049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_reason": "signal", + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.790425754843454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_reason": "signal", + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_reason": "signal", + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_reason": "signal", + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083497363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963446, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_reason": "signal", + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.120684905507005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_reason": "signal", + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.6299880079695868, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_reason": "signal", + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389961, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_reason": "signal", + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_reason": "signal", + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494619593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668627, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_reason": "signal", + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_reason": "signal", + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314586615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206744, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_reason": "signal", + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419836, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_reason": "signal", + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268385658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_reason": "signal", + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131592115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_reason": "signal", + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986418441, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_reason": "signal", + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514739937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274801, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_reason": "signal", + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480843964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030802, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_reason": "signal", + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_reason": "signal", + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500957513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2390830156373, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_reason": "signal", + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.983005044510719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_reason": "signal", + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.059187856133576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_reason": "signal", + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937459276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_reason": "signal", + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502062724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_reason": "signal", + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357511, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_reason": "signal", + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876403, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_reason": "signal", + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.72051069276088, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_reason": "signal", + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462060562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_reason": "signal", + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_reason": "signal", + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_reason": "signal", + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384409952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_reason": "signal", + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.18510442104889, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_reason": "signal", + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.96776738101289, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510016, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_reason": "signal", + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.77971502472792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_reason": "signal", + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.589018842509176, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.36326200776878, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_reason": "signal", + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.82181711128942, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_reason": "signal", + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280912579, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_reason": "signal", + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.144737039050597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_reason": "signal", + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.050167947418231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_reason": "signal", + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.498634401668824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_reason": "signal", + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648757951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_reason": "signal", + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837725266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_reason": "signal", + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669457794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_reason": "signal", + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173419166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_reason": "signal", + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475651559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155105, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_reason": "signal", + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9967936460588, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_reason": "signal", + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.879597588107572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293297, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_reason": "signal", + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.39663846745316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247865, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_reason": "signal", + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199741096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_reason": "signal", + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_reason": "signal", + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_reason": "signal", + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856305258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766983, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_reason": "signal", + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424424916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_reason": "signal", + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.510255062170472, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081938, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_reason": "signal", + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049091452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_reason": "signal", + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5662997648947, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_reason": "signal", + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261796, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_reason": "signal", + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503895997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_reason": "signal", + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444195, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_reason": "signal", + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972195496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_reason": "signal", + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382659098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_reason": "signal", + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541605, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_reason": "signal", + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.80543916802344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_reason": "signal", + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958812864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_reason": "signal", + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.04892056146127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_reason": "signal", + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.5288142035115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824345, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_reason": "signal", + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_reason": "signal", + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996872107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_reason": "signal", + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.256980572848988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_reason": "signal", + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.732835568323935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_reason": "signal", + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941460843, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_reason": "signal", + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.71804376395994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_reason": "signal", + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_reason": "signal", + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2927331361965, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_reason": "signal", + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.989778988454418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_reason": "signal", + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.617776328117543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_reason": "signal", + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.679745846106016, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_reason": "signal", + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.557537143758964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_reason": "signal", + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262508637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785213, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_reason": "signal", + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.27452639938383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_reason": "signal", + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.48328085916728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_reason": "signal", + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557967, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_reason": "signal", + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171538733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654837, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_reason": "signal", + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536163, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_reason": "signal", + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660378, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_reason": "signal", + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213550338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_reason": "signal", + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.49689680980373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962727, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_reason": "signal", + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.33077462199799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_reason": "signal", + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_reason": "signal", + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.49465844311635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_reason": "signal", + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.55570058979538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_reason": "signal", + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.022673051784295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_reason": "signal", + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927238294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_reason": "signal", + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.544461104454967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_reason": "signal", + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476298851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_reason": "signal", + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.02937136700166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9434543592522, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_reason": "signal", + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.0379112064129, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258927, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_reason": "signal", + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.262967547514563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170635, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_reason": "signal", + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918275248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734213, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_reason": "signal", + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.440692419269908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693204, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_reason": "signal", + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569969245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586935, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_reason": "signal", + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767296782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_reason": "signal", + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535180358, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_reason": "signal", + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.0953791114861815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_reason": "signal", + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.031376806777189, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_reason": "signal", + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.199383891174875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_reason": "signal", + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661953512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_reason": "signal", + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.0670859707206546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_reason": "signal", + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.32002349353752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_reason": "signal", + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.832583851371965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_reason": "signal", + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_reason": "signal", + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_reason": "signal", + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_reason": "signal", + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361717, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_reason": "signal", + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.98923316949731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_reason": "signal", + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521374553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_reason": "signal", + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977465634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_reason": "signal", + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.01771977784665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562022, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_reason": "signal", + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788157, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_reason": "signal", + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.9690817196897115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_reason": "signal", + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.6298475393559784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_reason": "signal", + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_reason": "signal", + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.4965979569497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_reason": "signal", + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.73558672362924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_reason": "signal", + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397877962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219035, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_reason": "signal", + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_reason": "signal", + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_reason": "signal", + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_reason": "signal", + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.538085337755547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_reason": "signal", + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136735038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_reason": "signal", + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.660219079667513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1634420410312, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_reason": "signal", + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_reason": "signal", + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.51073701711539, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_reason": "signal", + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.039291318245887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_reason": "signal", + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.5455469724420254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_reason": "signal", + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.684106013008204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_reason": "signal", + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.175185654492452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_reason": "signal", + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.000169986198671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_reason": "signal", + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903136995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_reason": "signal", + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296161414, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_reason": "signal", + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_reason": "signal", + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.346592844440238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_reason": "signal", + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.27825226889581245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_reason": "signal", + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816992817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_reason": "signal", + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.206471919769683, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_reason": "signal", + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256222904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_reason": "signal", + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193162, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_reason": "signal", + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723484808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_reason": "signal", + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_reason": "signal", + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.4286277387273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_reason": "signal", + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.386696350815328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_reason": "signal", + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.9423728518268035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_reason": "signal", + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449517, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4719110379968, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_reason": "signal", + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.8619685868870874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_reason": "signal", + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_reason": "signal", + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_reason": "signal", + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_reason": "signal", + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780962, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_reason": "signal", + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214942092, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_reason": "signal", + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.300406506135914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_reason": "signal", + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606662, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915469, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_reason": "signal", + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.78203732486145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_reason": "signal", + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389963782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605427, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_reason": "signal", + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_reason": "signal", + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882171274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1123342756572, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_reason": "signal", + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_reason": "signal", + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_reason": "signal", + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576041515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_reason": "signal", + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057154, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_reason": "signal", + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599363, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_reason": "signal", + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304649466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_reason": "signal", + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.0243068697091076, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_reason": "signal", + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630663075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_reason": "signal", + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171904594, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212905, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_reason": "signal", + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.850532277363527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_reason": "signal", + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.208127806416087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886634, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_reason": "signal", + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_reason": "signal", + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.950291361366908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_reason": "signal", + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_reason": "signal", + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345987, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_reason": "signal", + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.703008452692302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_reason": "signal", + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006990936, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_reason": "signal", + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.755139693985257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67881964988702, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_reason": "signal", + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394165908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690371, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_reason": "signal", + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_reason": "signal", + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.28591441390381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_reason": "signal", + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026074566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561574, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_reason": "signal", + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.64246364351311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_reason": "signal", + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288754246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_reason": "signal", + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.0540723384710873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_reason": "signal", + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.18906961320863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948878, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_reason": "signal", + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422677416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_reason": "signal", + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312482, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_reason": "signal", + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.51815315062595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10919349920911, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_reason": "signal", + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.339955484278107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_reason": "signal", + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119754955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_reason": "signal", + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.683561533820466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_reason": "signal", + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_reason": "signal", + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_reason": "signal", + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_reason": "signal", + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.17253493285352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864644, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_reason": "signal", + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_reason": "signal", + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113402725, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_reason": "signal", + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.95124871613007, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_reason": "signal", + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.58713017559967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_reason": "signal", + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_reason": "signal", + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_reason": "signal", + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481157424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921617, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_reason": "signal", + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541040057375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_reason": "signal", + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_reason": "signal", + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.424006679009835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_reason": "signal", + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.55566499742599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92441725059159, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_reason": "signal", + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.9925168828794995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979755, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_reason": "signal", + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.49772748038413, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4263959037515, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_reason": "signal", + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.573757603870035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_reason": "signal", + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617475, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_reason": "signal", + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.5347405117991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_reason": "signal", + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184013, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_reason": "signal", + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.120229511472644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_reason": "signal", + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.931582189943583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_reason": "signal", + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039717881, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_reason": "signal", + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.94435838649406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_reason": "signal", + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.171329489941854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573187, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_reason": "signal", + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_reason": "signal", + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.71964497666886, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_reason": "signal", + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.165661585799171, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_reason": "signal", + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742489865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_reason": "signal", + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_reason": "signal", + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.758516862899342, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_reason": "signal", + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_reason": "signal", + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.03123755209526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681195, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_reason": "signal", + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460924718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624199, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_reason": "signal", + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.89429108366494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_reason": "signal", + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.5829205531154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164757, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_reason": "signal", + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035269526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_reason": "signal", + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928536, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_reason": "signal", + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525051872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_reason": "signal", + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.180241042491616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_reason": "signal", + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748758578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_reason": "signal", + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359858, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_reason": "signal", + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.830548398671453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_reason": "signal", + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931773471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_reason": "signal", + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367004184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_reason": "signal", + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_reason": "signal", + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.53076817370311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_reason": "signal", + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.2863786863108544, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_reason": "signal", + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.314075352951477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_reason": "signal", + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.316709206214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433928, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_reason": "signal", + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.97443094036862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_reason": "signal", + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_reason": "signal", + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_reason": "signal", + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.03336817440686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_reason": "signal", + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_reason": "signal", + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_reason": "signal", + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.8860584383674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_reason": "signal", + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_reason": "signal", + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.79934479523763, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_reason": "signal", + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.0413638643822196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_reason": "signal", + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180531315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_reason": "signal", + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.43210846053444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_reason": "signal", + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.300869738231995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_reason": "signal", + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391500386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_reason": "signal", + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026382292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477344, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_reason": "signal", + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247105955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_reason": "signal", + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.901509342811551, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_reason": "signal", + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529459737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_reason": "signal", + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.00368736967721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_reason": "signal", + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.375219865520194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_reason": "signal", + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323621, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_reason": "signal", + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845515494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_reason": "signal", + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_reason": "signal", + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_reason": "signal", + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.3732195255815896, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_reason": "signal", + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_reason": "signal", + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.2638775310661, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_reason": "signal", + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237786932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033825, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_reason": "signal", + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.1141954973609245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_reason": "signal", + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_reason": "signal", + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.651363355676949, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_reason": "signal", + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6866778828559, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_reason": "signal", + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.24383423575091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_reason": "signal", + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956909315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646611, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_reason": "signal", + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.2936113286014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_reason": "signal", + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.0873836587798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_reason": "signal", + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_reason": "signal", + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049990543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696184, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_reason": "signal", + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.82028992037158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_reason": "signal", + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588521321, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_reason": "signal", + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_reason": "signal", + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712217965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_reason": "signal", + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.086274334578775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_reason": "signal", + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246019599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_reason": "signal", + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691247669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76765880138052, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_reason": "signal", + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001033899, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_reason": "signal", + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_reason": "signal", + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.9401548163259577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_reason": "signal", + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446485, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_reason": "signal", + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.909642827453354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_reason": "signal", + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_reason": "signal", + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986613527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896145, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_reason": "signal", + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663786834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06360781499562, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_reason": "signal", + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.74492273900978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_reason": "signal", + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.95281060565685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_reason": "signal", + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223034003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_reason": "signal", + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_reason": "signal", + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_reason": "signal", + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612556, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_reason": "signal", + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573970061, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_reason": "signal", + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811706, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_reason": "signal", + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804038503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_reason": "signal", + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250840212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_reason": "signal", + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.9806272595615155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_reason": "signal", + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_reason": "signal", + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_reason": "signal", + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.4772455717266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_reason": "signal", + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.3364267550241493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_reason": "signal", + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.593823999966844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_reason": "signal", + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117042512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_reason": "signal", + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762062426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_reason": "signal", + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.12496866238871, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783007, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_reason": "signal", + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.90006374215409, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_reason": "signal", + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742123469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_reason": "signal", + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777529, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_reason": "signal", + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.375818066228021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_reason": "signal", + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.35110392900242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_reason": "signal", + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265306867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_reason": "signal", + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_reason": "signal", + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228018244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_reason": "signal", + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_reason": "signal", + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.800617803228306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_reason": "signal", + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_reason": "signal", + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112129376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.15663810787721, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_reason": "signal", + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.30461443963577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_reason": "signal", + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.238123677778276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_reason": "signal", + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_reason": "signal", + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484375832, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593713491, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.81860510098636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.09449113652465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586199989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218804555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.064330082228935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680639082, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741875695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684177912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.3467793143181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.69439757140907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.961972141060187, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.5581255926977065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214676265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934972884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.1592322153927626, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853679574, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.4392086025175, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.841396864166654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385940273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.51473171489596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.4175598894592, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.19071665014789, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.27144404470732, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.25687391237011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.711476179654312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.41161122508953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670451, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534162, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.43601048415826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.316597627110752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.884757118451887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.55127711344352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579691, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658735, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.24456372560246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.679413304314494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691420111, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.6642306539015, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299106602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.2335536100097215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779573114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904898, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632264, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552285619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243634283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060871371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473835, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.2743509467814, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828940503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.833905087967935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.089977697134827, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390374, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503897269, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.22143113813138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967261, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.3141944649751167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.435365364850838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957022704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605266392, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222901, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933831103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.431082752491932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232704445, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.73674680911023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870250381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.7679288667759465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.4990462036063263, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.44429004426568, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.473328500425566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.419859754243646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131526797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.128745599266495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055833565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.468500964550344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.28605540862128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.626224924989856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.83926529284673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057534757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190439832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.579255811271253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803504164, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91641070152801, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245995752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.3703780056404185, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.32874989618125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580977754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.133935858177665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314275276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.4350143047646498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840374387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508903, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534469624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.27953779867738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988053244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648288327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.239569583967238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738783, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.549504190170239, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.317058270789744, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958931008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.79928793978644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.56611023480474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580274436, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.9945195439614167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360713287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359948, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251027355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.555247218882243, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349606, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151736169, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.163804935794474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.32433042627099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250585, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.717782298722398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309693, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.08501229693735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118005978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.35810355591542, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670384, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937577812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.93964633706301, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463670786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.641079892197638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978555268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461124708, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.291870061621694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198622, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.24773221516340982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.49863689882369, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594623, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615308684, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46079241276229, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.94291042574946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.1596079014692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.66572024628681, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329607, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375867295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.2543354977804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251330647, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.65106601580584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288785643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75093994363492, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.661305501004904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.35151527944123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763888885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.97243624250433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544106, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616736985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7818281411755, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.641477086284283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.522026401600272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004906804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.365048771821193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66005037144768, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430943286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253733095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5147503132911, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865564705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911404432, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201515, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.679901562454347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510082, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.61586547751955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983329274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644767, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.471552362672355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035864679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.476306182251733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2942483479133, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.82091610366541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.92910304795663, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437557943, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.253481079680625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367425, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695443184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075542535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368548, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.21303860796337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543945262, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.31191277784302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109608747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831217, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498262705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861234, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.11293994315355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352883, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828476811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.1939724904498803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.6348150222575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495899722, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200340973, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.70890692536892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937354712, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823866421, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178704, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.511899707539044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831385, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.253792386163013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318696, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467450657, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287142276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027726, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.899557293554153, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540016694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.30183628228707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715279, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089781514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.2048357877988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551607, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801756562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714097, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578466232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.04646653003698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716465832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.06298970517565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.84655011541605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669814658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.1489293138273524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.670071621155728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417196933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36926429851582, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996232754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259347965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9638468574369, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.49235104706537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.696047024026996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767726584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6092442220808, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152244459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842416, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066538374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286364, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703183287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.266587560263304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979886787, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939166, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.95828426716946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.675186955224547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563327, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011504254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635458, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.201908754982924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144558, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.18878691354837, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266030013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.750811715883117, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.3933991191183, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.838200527849381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.80770779583844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.580638316379293, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.708074076593277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.913198349846823, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109036, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607730122, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654935, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964952197, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.302184923080063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.11600986051951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721812812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.37799139669022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.79042575484317, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083496794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963444, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.1206849055072325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.629988007969075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389506, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494614477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668626, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288771, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314585705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206742, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268389069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131595526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986426967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514740676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274803, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480821227, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030803, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500958707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23908301563729, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.98300504451015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.05918785613318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937458367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502063861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876404, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.7205106927609, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462061642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384410861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.185104421049573, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.967767381012948, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510017, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.779715024729455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.5890188425102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.3632620077688, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.821817111289988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280913204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.14473703905088, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.0501679474180605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.49863440166962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648758065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837724982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669464616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173420587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475652127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155103, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99679364605882, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.8795975881067193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293296, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.396638467454352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247866, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199740925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302750862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856306395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766984, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424431737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.51025506216996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081939, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049092987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56629976489471, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503894917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444197, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972196576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382658984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541603, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.805439168024463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958813773, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.0489205614611, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.528814203511274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824344, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537079, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996870856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.25698057284876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.73283556832388, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941466527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.718043763959486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015783, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29273313619652, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.98977898845419, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.61777632811817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.67974584610613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.5575371437582817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262513753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785215, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.274526399382864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.483280859167849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557965, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171537597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654839, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276665996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536164, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646894, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660377, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213548803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.496896809804014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962726, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.330774621999012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.494658443117316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.555700589794412, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.02267305178509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927239374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.54446110445582, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476299988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.029371367001545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94345435925221, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.03791120641415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258926, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.26296754751479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170637, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918274964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734212, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.44069241927093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693206, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569968848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586936, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767297123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535178994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.095379111485897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.0313768067774731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.19938389117391, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661952603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.067085970720939, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.320023493537292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.83258385137094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397329, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.989233169496913, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521375633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977460518, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.017719777847503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562024, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788384, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.969081719690394, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.629847539355069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.49659795694981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.735586723630547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397876825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219033, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.53808533775606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136738448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.66021907966808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16344204103119, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.5107370171159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.03929131824566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.545546972441116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.68410601300798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.1751856544923953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.0001699861983866, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903137052, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296160107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.3465928444404085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.2782522688960398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816993954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.2064719197691716, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256224041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193163, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723470597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.428627738727357, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.3866963508151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.942372851825951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449521, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.47191103799679, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.861968586886519, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780961, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214940785, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.30040650613597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915468, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.782037324861676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389962986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605429, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882170364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11233427565722, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576048336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057153, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599362, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304654013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.024306869708937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630673876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171903798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212904, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.8505322773634703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.20812780641586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886635, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.9502913613674195, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345986, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.70300845269179, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006991675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.75513969398537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.678819649887, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394166022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690373, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.285914413903527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026075532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561572, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.642463643513338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288755156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.054072338471258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.189069613209085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948876, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422676904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.518153150624926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1091934992091, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.33995548427822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119755012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.68356153382166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.172534932854376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864645, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173468, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113401304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.951248716128646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.587130175600862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481150603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921618, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541039966425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.4240066790108, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.5556649974252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9244172505916, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.992516882881091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979754, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.497727480383617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42639590375148, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.57375760387049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.534740511800294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854323, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184015, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.1202295114724166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.93158218994381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039718051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.944358386493093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.17132948994271, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573185, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.719644976669997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.16566158579883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742488558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.75851686290008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.031237552095206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681193, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460925514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624197, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.894291083664882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.582920553113979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164759, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035270776, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525052554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.18024104249116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748757328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359801, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.83054839867026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931774438, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367003217, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.530768173702654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.286378686309831, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.3140753529508515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.31670920621434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433926, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.974430940369984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999607, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.033368174406121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.886058438367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537678, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.799344795237516, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.041363864381651, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180530235, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.432108460534664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.30086973823245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391499477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026383202, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477345, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247107376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.90150934281246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529460192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.003687369676925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.37521986551968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323622, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845518905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.373219525581476, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734781, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.26387753106695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237787046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033824, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.114195497361095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.6513633556779723, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68667788285592, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.2438342357504, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956910566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646612, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.29361132859998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.087383658779345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049989406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696185, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.820289920370556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588520867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712225355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.08627433457974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246020054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691248635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7676588013805, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001034069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.940154816325503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446483, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.90964282745455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986612731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896144, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663785526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0636078149956, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.744922739010008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.952810605657078, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223033548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031401, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612557, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573968924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811708, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804039526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250839758, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.980627259560833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378213, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.477245571726257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.336426755023524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.5938239999666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117041659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762066405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.124968662388824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783006, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.900063742154032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742117216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.3758180662279074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.351103929002534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265297204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228017619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.8006178032281355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112130058, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1566381078772, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.304614439634463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.2381236777780487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484376741, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT Pro", + "passed": true, + "scenario_id": "17" + }, + "detail": null, + "duration_seconds": 2.414606736972928, + "framework": "vectorbt_pro", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "final_value": 99082.81840069561, + "framework": "VectorBT Pro", + "num_trades": 600, + "total_pnl": -917.1815993043856, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593713491, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.81860510098636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.09449113652465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586199989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218804555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.064330082228935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680639082, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741875695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684177912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.3467793143181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.69439757140907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.961972141060187, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.5581255926977065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214676265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934972884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.1592322153927626, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853679574, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.4392086025175, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.841396864166654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385940273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.51473171489596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.4175598894592, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.19071665014789, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.27144404470732, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.25687391237011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.711476179654312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.41161122508953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670451, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534162, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.43601048415826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.316597627110752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.884757118451887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.55127711344352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579691, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658735, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.24456372560246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.679413304314494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691420111, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.6642306539015, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299106602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.2335536100097215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779573114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904898, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632264, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552285619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243634283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060871371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473835, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.2743509467814, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828940503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.833905087967935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.089977697134827, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390374, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503897269, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.22143113813138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967261, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.3141944649751167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.435365364850838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957022704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605266392, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222901, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933831103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.431082752491932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232704445, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.73674680911023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870250381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.7679288667759465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.4990462036063263, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.44429004426568, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.473328500425566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.419859754243646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131526797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.128745599266495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055833565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.468500964550344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.28605540862128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.626224924989856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.83926529284673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057534757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190439832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.579255811271253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803504164, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91641070152801, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245995752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.3703780056404185, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.32874989618125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580977754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.133935858177665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314275276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.4350143047646498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840374387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508903, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534469624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.27953779867738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988053244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648288327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.239569583967238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738783, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.549504190170239, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.317058270789744, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958931008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.79928793978644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.56611023480474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580274436, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.9945195439614167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360713287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359948, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251027355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.555247218882243, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349606, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151736169, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.163804935794474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.32433042627099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250585, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.717782298722398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309693, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.08501229693735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118005978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.35810355591542, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670384, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937577812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.93964633706301, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463670786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.641079892197638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978555268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461124708, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.291870061621694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198622, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.24773221516340982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.49863689882369, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594623, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615308684, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46079241276229, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.94291042574946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.1596079014692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.66572024628681, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329607, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375867295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.2543354977804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251330647, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.65106601580584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288785643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75093994363492, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.661305501004904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.35151527944123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763888885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.97243624250433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544106, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616736985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7818281411755, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.641477086284283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.522026401600272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004906804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.365048771821193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66005037144768, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430943286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253733095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5147503132911, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865564705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911404432, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201515, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.679901562454347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510082, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.61586547751955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983329274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644767, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.471552362672355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035864679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.476306182251733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2942483479133, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.82091610366541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.92910304795663, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437557943, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.253481079680625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367425, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695443184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075542535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368548, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.21303860796337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543945262, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.31191277784302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109608747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831217, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498262705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861234, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.11293994315355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352883, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828476811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.1939724904498803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.6348150222575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495899722, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200340973, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.70890692536892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937354712, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823866421, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178704, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.511899707539044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831385, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.253792386163013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318696, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467450657, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287142276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027726, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.899557293554153, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540016694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.30183628228707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715279, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089781514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.2048357877988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551607, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801756562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714097, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578466232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.04646653003698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716465832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.06298970517565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.84655011541605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669814658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.1489293138273524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.670071621155728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417196933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36926429851582, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996232754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259347965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9638468574369, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.49235104706537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.696047024026996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767726584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6092442220808, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152244459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842416, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066538374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286364, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703183287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.266587560263304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979886787, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939166, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.95828426716946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.675186955224547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563327, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011504254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635458, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.201908754982924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144558, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.18878691354837, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266030013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.750811715883117, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.3933991191183, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.838200527849381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.80770779583844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.580638316379293, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.708074076593277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.913198349846823, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109036, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607730122, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654935, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964952197, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.302184923080063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.11600986051951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721812812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.37799139669022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.79042575484317, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083496794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963444, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.1206849055072325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.629988007969075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389506, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494614477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668626, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288771, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314585705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206742, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268389069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131595526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986426967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514740676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274803, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480821227, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030803, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500958707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23908301563729, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.98300504451015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.05918785613318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937458367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502063861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876404, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.7205106927609, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462061642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384410861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.185104421049573, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.967767381012948, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510017, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.779715024729455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.5890188425102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.3632620077688, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.821817111289988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280913204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.14473703905088, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.0501679474180605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.49863440166962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648758065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837724982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669464616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173420587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475652127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155103, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99679364605882, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.8795975881067193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293296, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.396638467454352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247866, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199740925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302750862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856306395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766984, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424431737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.51025506216996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081939, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049092987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56629976489471, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503894917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444197, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972196576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382658984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541603, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.805439168024463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958813773, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.0489205614611, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.528814203511274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824344, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537079, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996870856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.25698057284876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.73283556832388, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941466527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.718043763959486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015783, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29273313619652, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.98977898845419, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.61777632811817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.67974584610613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.5575371437582817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262513753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785215, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.274526399382864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.483280859167849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557965, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171537597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654839, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276665996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536164, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646894, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660377, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213548803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.496896809804014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962726, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.330774621999012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.494658443117316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.555700589794412, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.02267305178509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927239374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.54446110445582, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476299988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.029371367001545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94345435925221, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.03791120641415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258926, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.26296754751479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170637, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918274964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734212, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.44069241927093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693206, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569968848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586936, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767297123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535178994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.095379111485897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.0313768067774731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.19938389117391, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661952603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.067085970720939, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.320023493537292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.83258385137094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397329, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.989233169496913, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521375633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977460518, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.017719777847503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562024, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788384, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.969081719690394, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.629847539355069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.49659795694981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.735586723630547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397876825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219033, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.53808533775606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136738448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.66021907966808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16344204103119, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.5107370171159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.03929131824566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.545546972441116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.68410601300798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.1751856544923953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.0001699861983866, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903137052, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296160107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.3465928444404085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.2782522688960398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816993954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.2064719197691716, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256224041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193163, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723470597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.428627738727357, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.3866963508151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.942372851825951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449521, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.47191103799679, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.861968586886519, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780961, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214940785, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.30040650613597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915468, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.782037324861676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389962986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605429, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882170364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11233427565722, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576048336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057153, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599362, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304654013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.024306869708937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630673876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171903798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212904, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.8505322773634703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.20812780641586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886635, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.9502913613674195, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345986, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.70300845269179, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006991675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.75513969398537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.678819649887, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394166022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690373, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.285914413903527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026075532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561572, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.642463643513338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288755156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.054072338471258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.189069613209085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948876, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422676904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.518153150624926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1091934992091, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.33995548427822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119755012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.68356153382166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.172534932854376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864645, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173468, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113401304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.951248716128646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.587130175600862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481150603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921618, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541039966425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.4240066790108, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.5556649974252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9244172505916, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.992516882881091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979754, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.497727480383617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42639590375148, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.57375760387049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.534740511800294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854323, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184015, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.1202295114724166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.93158218994381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039718051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.944358386493093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.17132948994271, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573185, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.719644976669997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.16566158579883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742488558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.75851686290008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.031237552095206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681193, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460925514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624197, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.894291083664882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.582920553113979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164759, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035270776, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525052554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.18024104249116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748757328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359801, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.83054839867026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931774438, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367003217, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.530768173702654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.286378686309831, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.3140753529508515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.31670920621434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433926, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.974430940369984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999607, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.033368174406121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.886058438367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537678, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.799344795237516, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.041363864381651, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180530235, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.432108460534664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.30086973823245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391499477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026383202, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477345, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247107376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.90150934281246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529460192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.003687369676925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.37521986551968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323622, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845518905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.373219525581476, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734781, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.26387753106695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237787046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033824, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.114195497361095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.6513633556779723, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68667788285592, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.2438342357504, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956910566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646612, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.29361132859998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.087383658779345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049989406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696185, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.820289920370556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588520867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712225355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.08627433457974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246020054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691248635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7676588013805, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001034069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.940154816325503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446483, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.90964282745455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986612731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896144, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663785526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0636078149956, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.744922739010008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.952810605657078, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223033548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031401, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612557, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573968924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811708, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804039526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250839758, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.980627259560833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378213, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.477245571726257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.336426755023524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.5938239999666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117041659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762066405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.124968662388824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783006, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.900063742154032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742117216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.3758180662279074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.351103929002534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265297204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228017619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.8006178032281355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112130058, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1566381078772, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.304614439634463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.2381236777780487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484376741, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "final_value": 99082.81840069593, + "framework": "ml4t.backtest", + "num_trades": 600, + "total_pnl": -917.1815993040655, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_reason": "signal", + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593714173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_reason": "signal", + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.818605100987043, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_reason": "signal", + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.094491136524084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_reason": "signal", + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586200102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_reason": "signal", + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218801145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.06433008222848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_reason": "signal", + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086653, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_reason": "signal", + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680638855, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741877003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_reason": "signal", + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684178083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_reason": "signal", + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.346779314319065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_reason": "signal", + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_reason": "signal", + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_reason": "signal", + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.694397571409354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_reason": "signal", + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.96197214105996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.558125592699071, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_reason": "signal", + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214677402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_reason": "signal", + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934980273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.159232215391967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_reason": "signal", + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853665932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43920860251751, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_reason": "signal", + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.84139686416711, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_reason": "signal", + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871567, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_reason": "signal", + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385939875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_reason": "signal", + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.514731714896698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_reason": "signal", + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.41755988945988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.1907166501479, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_reason": "signal", + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.271444044707096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_reason": "signal", + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.256873912370793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.71147617965471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_reason": "signal", + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.411611225090383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_reason": "signal", + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_reason": "signal", + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534164, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_reason": "signal", + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.436010484158032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_reason": "signal", + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.31659762711024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_reason": "signal", + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.8847571184524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_reason": "signal", + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.551277113443575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579693, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_reason": "signal", + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658736, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_reason": "signal", + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.244563725602347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.6794133043149486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_reason": "signal", + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691421134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.66423065390151, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_reason": "signal", + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_reason": "signal", + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_reason": "signal", + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_reason": "signal", + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299107568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_reason": "signal", + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.233553610009039, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_reason": "signal", + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779575956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_reason": "signal", + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904841, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632265, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_reason": "signal", + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552286926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_reason": "signal", + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243633828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_reason": "signal", + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060870859, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473834, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_reason": "signal", + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.27435094678003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_reason": "signal", + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_reason": "signal", + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_reason": "signal", + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_reason": "signal", + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828939593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_reason": "signal", + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.83390508796765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_reason": "signal", + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.0899776971346, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390373, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_reason": "signal", + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503891584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_reason": "signal", + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.221431138130356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_reason": "signal", + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967262, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_reason": "signal", + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.314194464974207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_reason": "signal", + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.43536536485044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_reason": "signal", + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957024068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_reason": "signal", + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605265767, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_reason": "signal", + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222878, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_reason": "signal", + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933833377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_reason": "signal", + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.43108275249142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_reason": "signal", + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232703194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_reason": "signal", + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.736746809110628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_reason": "signal", + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870249869, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_reason": "signal", + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_reason": "signal", + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.767928866775037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_reason": "signal", + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.499046203607577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.4442900442657, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_reason": "signal", + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.4733285004258505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_reason": "signal", + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.41985975424359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_reason": "signal", + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131527593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_reason": "signal", + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.12874559926604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_reason": "signal", + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_reason": "signal", + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055832713, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_reason": "signal", + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.46850096455091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_reason": "signal", + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_reason": "signal", + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_reason": "signal", + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.2860554086219054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_reason": "signal", + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.62622492499031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_reason": "signal", + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_reason": "signal", + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_reason": "signal", + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.8392652928469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_reason": "signal", + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057535155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_reason": "signal", + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190440912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_reason": "signal", + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.57925581127165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_reason": "signal", + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_reason": "signal", + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803505642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.916410701528, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_reason": "signal", + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245994729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_reason": "signal", + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.370378005640305, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_reason": "signal", + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_reason": "signal", + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.328749896181762, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_reason": "signal", + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580978493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_reason": "signal", + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.13393585817721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_reason": "signal", + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314274366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_reason": "signal", + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.435014304764991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_reason": "signal", + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_reason": "signal", + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840375183, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508901, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_reason": "signal", + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_reason": "signal", + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534470988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_reason": "signal", + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.279537798676756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_reason": "signal", + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988052733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_reason": "signal", + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_reason": "signal", + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648283211, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_reason": "signal", + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.23956958396775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738782, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_reason": "signal", + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.54950419017041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_reason": "signal", + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.3170582707898575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_reason": "signal", + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958929473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_reason": "signal", + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.799287939786154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_reason": "signal", + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.566110234804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_reason": "signal", + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580273526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_reason": "signal", + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_reason": "signal", + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.99451954396136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_reason": "signal", + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360714424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359947, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_reason": "signal", + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251026673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_reason": "signal", + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.55524721888287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349607, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_reason": "signal", + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151735998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_reason": "signal", + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.16380493579527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_reason": "signal", + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.324330426270535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_reason": "signal", + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446389, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_reason": "signal", + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_reason": "signal", + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_reason": "signal", + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_reason": "signal", + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_reason": "signal", + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.71778229872325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309691, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_reason": "signal", + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.085012296938658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_reason": "signal", + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118006887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_reason": "signal", + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.358103555914568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670386, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_reason": "signal", + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937580086, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.939646337063, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_reason": "signal", + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463671638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_reason": "signal", + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.64107989219883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_reason": "signal", + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978554927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_reason": "signal", + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461125902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_reason": "signal", + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.29187006162101, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_reason": "signal", + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_reason": "signal", + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198639, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_reason": "signal", + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_reason": "signal", + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.247732215164433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_reason": "signal", + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.498636898822951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_reason": "signal", + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_reason": "signal", + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615309366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_reason": "signal", + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4607924127623, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_reason": "signal", + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155382, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_reason": "signal", + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.942910425748778, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_reason": "signal", + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.159607901468917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_reason": "signal", + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.665720246286583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329608, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_reason": "signal", + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375868318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_reason": "signal", + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.25433549778063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_reason": "signal", + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251336331, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_reason": "signal", + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.651066015805554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_reason": "signal", + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288788485, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7509399436349, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_reason": "signal", + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_reason": "signal", + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.6613055010057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_reason": "signal", + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.351515279440719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_reason": "signal", + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763889453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_reason": "signal", + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.972436242504045, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544105, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_reason": "signal", + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616735905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.78182814117551, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_reason": "signal", + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.6414770862847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_reason": "signal", + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.52202640160067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_reason": "signal", + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004907486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_reason": "signal", + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.36504877182051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6600503714477, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_reason": "signal", + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430941865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_reason": "signal", + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253732356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.51475031329109, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_reason": "signal", + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865565558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_reason": "signal", + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911403636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201514, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_reason": "signal", + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702404, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_reason": "signal", + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.67990156245469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510083, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_reason": "signal", + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588427, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_reason": "signal", + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.615865477519037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_reason": "signal", + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983330013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644765, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_reason": "signal", + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.47155236267281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_reason": "signal", + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035865418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_reason": "signal", + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.4763061822523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29424834791328, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_reason": "signal", + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.820916103664786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_reason": "signal", + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.929103047956232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_reason": "signal", + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437553964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_reason": "signal", + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.25348107968057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367423, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_reason": "signal", + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695449437, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_reason": "signal", + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075543615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368549, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_reason": "signal", + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.213038607964336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_reason": "signal", + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543946172, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_reason": "signal", + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.3119127778427355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_reason": "signal", + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109606473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831216, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_reason": "signal", + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498263729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861235, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_reason": "signal", + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.112939943153833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_reason": "signal", + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352885, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_reason": "signal", + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828477266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_reason": "signal", + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_reason": "signal", + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.193972490449596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_reason": "signal", + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.634815022258408, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_reason": "signal", + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495900064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_reason": "signal", + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_reason": "signal", + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_reason": "signal", + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200341314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_reason": "signal", + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.708906925368865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_reason": "signal", + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937353803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_reason": "signal", + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823867046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178705, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_reason": "signal", + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.51189970753876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831386, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_reason": "signal", + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.2537923861618765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318698, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_reason": "signal", + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467449975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_reason": "signal", + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287143015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_reason": "signal", + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_reason": "signal", + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_reason": "signal", + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_reason": "signal", + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.89955729355279, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_reason": "signal", + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540020673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_reason": "signal", + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.301836282287695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715277, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_reason": "signal", + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089780547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_reason": "signal", + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.204835787799311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551608, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_reason": "signal", + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801757812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_reason": "signal", + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714099, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_reason": "signal", + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578473054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_reason": "signal", + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.046466530036923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_reason": "signal", + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716468106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_reason": "signal", + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.062989705174914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_reason": "signal", + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.846550115415084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_reason": "signal", + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669813805, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_reason": "signal", + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.148929313827466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_reason": "signal", + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.67007162115442, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_reason": "signal", + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417203755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3692642985158, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_reason": "signal", + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996231617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_reason": "signal", + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259348306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96384685743692, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_reason": "signal", + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.492351047065313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_reason": "signal", + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.6960470240283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_reason": "signal", + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767725106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60924422208079, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_reason": "signal", + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152243435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842418, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_reason": "signal", + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_reason": "signal", + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066539056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286363, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_reason": "signal", + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703182832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_reason": "signal", + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.26658756026336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_reason": "signal", + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979885537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939167, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_reason": "signal", + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.958284267167983, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_reason": "signal", + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.67518695522449, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_reason": "signal", + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953632, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563325, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_reason": "signal", + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011503856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635457, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_reason": "signal", + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.20190875498156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144556, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_reason": "signal", + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.188786913549848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_reason": "signal", + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_reason": "signal", + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_reason": "signal", + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266028649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_reason": "signal", + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_reason": "signal", + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.7508117158831737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_reason": "signal", + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39339911911829, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_reason": "signal", + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_reason": "signal", + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.83820052784904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_reason": "signal", + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_reason": "signal", + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_reason": "signal", + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_reason": "signal", + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.807707795838724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_reason": "signal", + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_reason": "signal", + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.58063831637992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_reason": "signal", + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.70807407659231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_reason": "signal", + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.9131983498464251, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109037, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_reason": "signal", + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607728587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654936, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_reason": "signal", + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964951458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_reason": "signal", + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_reason": "signal", + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.30218492307904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_reason": "signal", + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.116009860519625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_reason": "signal", + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721801443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_reason": "signal", + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.377991396690049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_reason": "signal", + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.790425754843454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_reason": "signal", + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_reason": "signal", + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_reason": "signal", + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083497363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963446, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_reason": "signal", + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.120684905507005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_reason": "signal", + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.6299880079695868, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_reason": "signal", + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389961, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_reason": "signal", + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_reason": "signal", + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494619593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668627, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_reason": "signal", + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_reason": "signal", + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314586615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206744, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_reason": "signal", + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419836, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_reason": "signal", + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268385658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_reason": "signal", + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131592115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_reason": "signal", + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986418441, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_reason": "signal", + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514739937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274801, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_reason": "signal", + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480843964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030802, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_reason": "signal", + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_reason": "signal", + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500957513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2390830156373, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_reason": "signal", + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.983005044510719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_reason": "signal", + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.059187856133576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_reason": "signal", + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937459276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_reason": "signal", + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502062724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_reason": "signal", + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357511, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_reason": "signal", + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876403, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_reason": "signal", + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.72051069276088, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_reason": "signal", + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462060562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_reason": "signal", + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_reason": "signal", + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_reason": "signal", + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384409952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_reason": "signal", + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.18510442104889, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_reason": "signal", + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.96776738101289, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510016, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_reason": "signal", + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.77971502472792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_reason": "signal", + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.589018842509176, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.36326200776878, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_reason": "signal", + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.82181711128942, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_reason": "signal", + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280912579, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_reason": "signal", + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.144737039050597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_reason": "signal", + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.050167947418231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_reason": "signal", + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.498634401668824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_reason": "signal", + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648757951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_reason": "signal", + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837725266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_reason": "signal", + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669457794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_reason": "signal", + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173419166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_reason": "signal", + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475651559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155105, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_reason": "signal", + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9967936460588, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_reason": "signal", + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.879597588107572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293297, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_reason": "signal", + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.39663846745316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247865, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_reason": "signal", + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199741096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_reason": "signal", + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_reason": "signal", + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_reason": "signal", + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856305258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766983, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_reason": "signal", + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424424916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_reason": "signal", + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.510255062170472, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081938, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_reason": "signal", + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049091452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_reason": "signal", + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5662997648947, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_reason": "signal", + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261796, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_reason": "signal", + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503895997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_reason": "signal", + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444195, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_reason": "signal", + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972195496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_reason": "signal", + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382659098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_reason": "signal", + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541605, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_reason": "signal", + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.80543916802344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_reason": "signal", + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958812864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_reason": "signal", + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.04892056146127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_reason": "signal", + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.5288142035115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824345, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_reason": "signal", + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_reason": "signal", + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996872107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_reason": "signal", + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.256980572848988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_reason": "signal", + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.732835568323935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_reason": "signal", + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941460843, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_reason": "signal", + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.71804376395994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_reason": "signal", + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_reason": "signal", + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2927331361965, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_reason": "signal", + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.989778988454418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_reason": "signal", + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.617776328117543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_reason": "signal", + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.679745846106016, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_reason": "signal", + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.557537143758964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_reason": "signal", + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262508637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785213, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_reason": "signal", + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.27452639938383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_reason": "signal", + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.48328085916728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_reason": "signal", + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557967, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_reason": "signal", + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171538733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654837, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_reason": "signal", + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536163, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_reason": "signal", + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660378, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_reason": "signal", + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213550338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_reason": "signal", + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.49689680980373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962727, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_reason": "signal", + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.33077462199799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_reason": "signal", + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_reason": "signal", + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.49465844311635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_reason": "signal", + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.55570058979538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_reason": "signal", + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.022673051784295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_reason": "signal", + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927238294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_reason": "signal", + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.544461104454967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_reason": "signal", + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476298851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_reason": "signal", + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.02937136700166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9434543592522, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_reason": "signal", + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.0379112064129, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258927, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_reason": "signal", + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.262967547514563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170635, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_reason": "signal", + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918275248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734213, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_reason": "signal", + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.440692419269908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693204, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_reason": "signal", + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569969245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586935, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_reason": "signal", + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767296782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_reason": "signal", + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535180358, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_reason": "signal", + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.0953791114861815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_reason": "signal", + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.031376806777189, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_reason": "signal", + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.199383891174875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_reason": "signal", + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661953512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_reason": "signal", + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.0670859707206546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_reason": "signal", + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.32002349353752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_reason": "signal", + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.832583851371965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_reason": "signal", + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_reason": "signal", + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_reason": "signal", + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_reason": "signal", + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361717, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_reason": "signal", + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.98923316949731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_reason": "signal", + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521374553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_reason": "signal", + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977465634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_reason": "signal", + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.01771977784665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562022, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_reason": "signal", + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788157, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_reason": "signal", + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.9690817196897115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_reason": "signal", + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.6298475393559784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_reason": "signal", + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_reason": "signal", + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.4965979569497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_reason": "signal", + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.73558672362924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_reason": "signal", + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397877962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219035, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_reason": "signal", + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_reason": "signal", + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_reason": "signal", + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_reason": "signal", + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.538085337755547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_reason": "signal", + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136735038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_reason": "signal", + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.660219079667513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1634420410312, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_reason": "signal", + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_reason": "signal", + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.51073701711539, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_reason": "signal", + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.039291318245887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_reason": "signal", + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.5455469724420254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_reason": "signal", + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.684106013008204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_reason": "signal", + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.175185654492452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_reason": "signal", + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.000169986198671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_reason": "signal", + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903136995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_reason": "signal", + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296161414, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_reason": "signal", + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_reason": "signal", + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.346592844440238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_reason": "signal", + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.27825226889581245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_reason": "signal", + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816992817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_reason": "signal", + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.206471919769683, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_reason": "signal", + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256222904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_reason": "signal", + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193162, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_reason": "signal", + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723484808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_reason": "signal", + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_reason": "signal", + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.4286277387273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_reason": "signal", + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.386696350815328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_reason": "signal", + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.9423728518268035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_reason": "signal", + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449517, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4719110379968, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_reason": "signal", + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.8619685868870874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_reason": "signal", + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_reason": "signal", + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_reason": "signal", + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_reason": "signal", + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780962, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_reason": "signal", + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214942092, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_reason": "signal", + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.300406506135914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_reason": "signal", + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606662, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915469, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_reason": "signal", + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.78203732486145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_reason": "signal", + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389963782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605427, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_reason": "signal", + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_reason": "signal", + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882171274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1123342756572, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_reason": "signal", + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_reason": "signal", + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_reason": "signal", + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576041515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_reason": "signal", + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057154, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_reason": "signal", + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599363, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_reason": "signal", + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304649466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_reason": "signal", + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.0243068697091076, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_reason": "signal", + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630663075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_reason": "signal", + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171904594, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212905, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_reason": "signal", + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.850532277363527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_reason": "signal", + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.208127806416087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886634, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_reason": "signal", + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_reason": "signal", + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.950291361366908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_reason": "signal", + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_reason": "signal", + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345987, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_reason": "signal", + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.703008452692302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_reason": "signal", + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006990936, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_reason": "signal", + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.755139693985257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67881964988702, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_reason": "signal", + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394165908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690371, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_reason": "signal", + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_reason": "signal", + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.28591441390381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_reason": "signal", + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026074566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561574, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_reason": "signal", + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.64246364351311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_reason": "signal", + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288754246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_reason": "signal", + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.0540723384710873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_reason": "signal", + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.18906961320863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948878, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_reason": "signal", + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422677416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_reason": "signal", + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312482, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_reason": "signal", + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.51815315062595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10919349920911, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_reason": "signal", + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.339955484278107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_reason": "signal", + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119754955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_reason": "signal", + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.683561533820466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_reason": "signal", + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_reason": "signal", + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_reason": "signal", + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_reason": "signal", + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.17253493285352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864644, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_reason": "signal", + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_reason": "signal", + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113402725, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_reason": "signal", + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.95124871613007, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_reason": "signal", + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.58713017559967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_reason": "signal", + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_reason": "signal", + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_reason": "signal", + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481157424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921617, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_reason": "signal", + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541040057375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_reason": "signal", + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_reason": "signal", + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.424006679009835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_reason": "signal", + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.55566499742599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92441725059159, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_reason": "signal", + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.9925168828794995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979755, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_reason": "signal", + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.49772748038413, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4263959037515, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_reason": "signal", + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.573757603870035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_reason": "signal", + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617475, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_reason": "signal", + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.5347405117991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_reason": "signal", + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184013, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_reason": "signal", + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.120229511472644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_reason": "signal", + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.931582189943583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_reason": "signal", + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039717881, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_reason": "signal", + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.94435838649406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_reason": "signal", + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.171329489941854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573187, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_reason": "signal", + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_reason": "signal", + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.71964497666886, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_reason": "signal", + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.165661585799171, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_reason": "signal", + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742489865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_reason": "signal", + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_reason": "signal", + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.758516862899342, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_reason": "signal", + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_reason": "signal", + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.03123755209526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681195, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_reason": "signal", + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460924718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624199, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_reason": "signal", + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.89429108366494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_reason": "signal", + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.5829205531154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164757, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_reason": "signal", + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035269526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_reason": "signal", + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928536, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_reason": "signal", + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525051872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_reason": "signal", + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.180241042491616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_reason": "signal", + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748758578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_reason": "signal", + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359858, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_reason": "signal", + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.830548398671453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_reason": "signal", + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931773471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_reason": "signal", + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367004184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_reason": "signal", + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_reason": "signal", + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.53076817370311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_reason": "signal", + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.2863786863108544, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_reason": "signal", + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.314075352951477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_reason": "signal", + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.316709206214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433928, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_reason": "signal", + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.97443094036862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_reason": "signal", + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_reason": "signal", + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_reason": "signal", + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.03336817440686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_reason": "signal", + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_reason": "signal", + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_reason": "signal", + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.8860584383674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_reason": "signal", + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_reason": "signal", + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.79934479523763, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_reason": "signal", + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.0413638643822196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_reason": "signal", + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180531315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_reason": "signal", + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.43210846053444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_reason": "signal", + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.300869738231995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_reason": "signal", + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391500386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_reason": "signal", + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026382292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477344, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_reason": "signal", + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247105955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_reason": "signal", + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.901509342811551, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_reason": "signal", + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529459737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_reason": "signal", + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.00368736967721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_reason": "signal", + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.375219865520194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_reason": "signal", + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323621, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_reason": "signal", + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845515494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_reason": "signal", + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_reason": "signal", + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_reason": "signal", + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.3732195255815896, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_reason": "signal", + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_reason": "signal", + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.2638775310661, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_reason": "signal", + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237786932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033825, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_reason": "signal", + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.1141954973609245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_reason": "signal", + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_reason": "signal", + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.651363355676949, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_reason": "signal", + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6866778828559, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_reason": "signal", + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.24383423575091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_reason": "signal", + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956909315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646611, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_reason": "signal", + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.2936113286014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_reason": "signal", + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.0873836587798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_reason": "signal", + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_reason": "signal", + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049990543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696184, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_reason": "signal", + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.82028992037158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_reason": "signal", + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588521321, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_reason": "signal", + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_reason": "signal", + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712217965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_reason": "signal", + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.086274334578775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_reason": "signal", + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246019599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_reason": "signal", + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691247669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76765880138052, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_reason": "signal", + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001033899, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_reason": "signal", + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_reason": "signal", + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.9401548163259577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_reason": "signal", + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446485, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_reason": "signal", + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.909642827453354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_reason": "signal", + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_reason": "signal", + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986613527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896145, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_reason": "signal", + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663786834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06360781499562, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_reason": "signal", + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.74492273900978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_reason": "signal", + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.95281060565685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_reason": "signal", + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223034003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_reason": "signal", + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_reason": "signal", + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_reason": "signal", + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612556, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_reason": "signal", + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573970061, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_reason": "signal", + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811706, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_reason": "signal", + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804038503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_reason": "signal", + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250840212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_reason": "signal", + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.9806272595615155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_reason": "signal", + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_reason": "signal", + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_reason": "signal", + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.4772455717266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_reason": "signal", + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.3364267550241493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_reason": "signal", + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.593823999966844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_reason": "signal", + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117042512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_reason": "signal", + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762062426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_reason": "signal", + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.12496866238871, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783007, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_reason": "signal", + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.90006374215409, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_reason": "signal", + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742123469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_reason": "signal", + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777529, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_reason": "signal", + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.375818066228021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_reason": "signal", + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.35110392900242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_reason": "signal", + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265306867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_reason": "signal", + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_reason": "signal", + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228018244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_reason": "signal", + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_reason": "signal", + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.800617803228306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_reason": "signal", + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_reason": "signal", + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112129376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.15663810787721, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_reason": "signal", + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.30461443963577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_reason": "signal", + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.238123677778276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_reason": "signal", + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_reason": "signal", + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484375832, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_pro", + "path": "validation/frameworks/vectorbt_pro.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "77c6dc83a02c7665eea21f7cedd0df1c4630ac15b7d284a21e96a849d1d8df74", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" + }, + "framework_target": { + "actual_version": "2026.6.27", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "version": "2026.6.27" + }, + "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 1800, + "entry_signals": 600, + "exit_signals": 600, + "framework_closed_trades": 600, + "framework_fills": 1200, + "framework_intents": 1200, + "framework_orders": null, + "ml4t_closed_trades": 600, + "ml4t_fills": 1200, + "ml4t_intents": 1200, + "ml4t_orders": null + } + }, + "release_blocking": false, + "required": true, + "scenario_id": "17", + "scenario_name": "High Event Count", "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT OSS=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98778.90186467487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 98778.90186467487, + "message": "VectorBT OSS=$98,778.9018646749, ML4T=$98,778.9018646749 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1221.0981353251263, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -1221.0981353251263, + "message": "VectorBT OSS=$-1,221.0981353251, ML4T=$-1,221.0981353251 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "01" + }, "detail": null, + "duration_seconds": 3.2742884571198374, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "VectorBT OSS", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "01", @@ -186,8 +83456,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT OSS=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98778.90186467487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 98778.90186467487, + "message": "VectorBT OSS=$98,778.9018646749, ML4T=$98,778.9018646749 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1221.0981353251263, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -1221.0981353251263, + "message": "VectorBT OSS=$-1,221.0981353251, ML4T=$-1,221.0981353251 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "02" + }, "detail": null, + "duration_seconds": 3.3379638779442757, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "VectorBT OSS", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.9500191054502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.070150536838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502395977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.41425030610634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.6287221078602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.39196721078798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078745507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.41837873970593, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98778.90186467487, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1221.0981353251263, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 320.95001910545034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -917.6778353014561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -380.0701505368379, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 67.82342502396023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -406.4142503061066, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 246.62872210785918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -52.3919672107877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 214.41288662462102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": 1.0593939078753465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -315.418378739706, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "02", @@ -195,8 +84786,317 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT OSS=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99500.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99500.0, + "message": "VectorBT OSS=$99,500.0000000000, ML4T=$99,500.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -500.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": -500.0, + "message": "VectorBT OSS=$-500.0000000000, ML4T=$-500.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 95.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 95.0, + "message": "VectorBT OSS=$95.0000000000, ML4T=$95.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "03" + }, "detail": null, + "duration_seconds": 3.266716612968594, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 95.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99500.0, + "framework": "VectorBT OSS", + "num_trades": 1, + "total_pnl": -500.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 95.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99500.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -500.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-07T00:00:00", + "pnl": -500.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 20, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "03", @@ -204,8 +85104,317 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT OSS=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 101050.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 101050.0, + "message": "VectorBT OSS=$101,050.0000000000, ML4T=$101,050.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1050.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 1050.0, + "message": "VectorBT OSS=$1,050.0000000000, ML4T=$1,050.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 110.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 110.5, + "message": "VectorBT OSS=$110.5000000000, ML4T=$110.5000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "04" + }, "detail": null, + "duration_seconds": 3.2450743049848825, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 110.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 101050.0, + "framework": "VectorBT OSS", + "num_trades": 1, + "total_pnl": 1050.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 110.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 101050.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 1050.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 110.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-08T00:00:00", + "pnl": 1050.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 20, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "04", @@ -213,8 +85422,1343 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT OSS=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98602.0173051621, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 2.9103830456733704e-11, + "expected": 98602.01730516207, + "message": "VectorBT OSS=$98,602.0173051621, ML4T=$98,602.0173051621 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1397.982694837905, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 2.9103830456733704e-11, + "expected": -1397.982694837934, + "message": "VectorBT OSS=$-1,397.9826948379, ML4T=$-1,397.9826948379 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 176.8845595128108, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 176.8845595128108, + "message": "VectorBT OSS=$176.8845595128, ML4T=$176.8845595128 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.104291559917314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.0483236286091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688687495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442486, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663618, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258533, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.3155341196167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688291, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442485, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "05" + }, "detail": null, + "duration_seconds": 3.236978525063023, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 176.8845595128108 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.01730516207, + "framework": "VectorBT OSS", + "num_trades": 10, + "total_pnl": -1397.982694837934, + "trades": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663618, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776073, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258533, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509477, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.3155341196167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688291, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442485, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 176.8845595128108 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.099837918591799, + "exit_reason": "", + "price": 100.99837918591798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.420787937697249, + "exit_reason": "signal", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.836596400103879, + "exit_reason": "", + "price": 108.36596400103879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.918918564802423, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.615521769776073, + "exit_reason": "", + "price": 96.15521769776072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.235451619239235, + "exit_reason": "signal", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.825655019509478, + "exit_reason": "", + "price": 88.25655019509476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.893478444533438, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.520243786404297, + "exit_reason": "", + "price": 85.20243786404296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.11382953609819, + "exit_reason": "signal", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.033279633067812, + "exit_reason": "", + "price": 80.33279633067811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.279908355175671, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.226955248250814, + "exit_reason": "", + "price": 82.26955248250813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.174563281040026, + "exit_reason": "signal", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.34127420539518, + "exit_reason": "", + "price": 83.4127420539518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.555687092019802, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.166557101327484, + "exit_reason": "", + "price": 81.66557101327484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.16761649523536, + "exit_reason": "signal", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.386907741641142, + "exit_reason": "", + "price": 83.86907741641141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.071489362901437, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.0173051621, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1397.982694837905, + "trades": [ + { + "asset": "TEST", + "commission": 20.520625856289048, + "direction": "Long", + "entry_price": 100.99837918591798, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.20787937697249, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.4293932491613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.755514964906304, + "direction": "Long", + "entry_price": 108.36596400103879, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.85097338901531, + "direction": "Long", + "entry_price": 96.15521769776072, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.35451619239235, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.719133464042915, + "direction": "Long", + "entry_price": 88.25655019509476, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.104291559917314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.634073322502488, + "direction": "Long", + "entry_price": 85.20243786404296, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.1382953609819, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.0483236286091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.313187988243484, + "direction": "Long", + "entry_price": 80.33279633067811, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.40151852929084, + "direction": "Long", + "entry_price": 82.26955248250813, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.74563281040025, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.896961297414983, + "direction": "Long", + "entry_price": 83.4127420539518, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.33417359656284, + "direction": "Long", + "entry_price": 81.66557101327484, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.67616495235359, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688687495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.458397104542577, + "direction": "Long", + "entry_price": 83.86907741641141, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442486, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "05", @@ -222,8 +86766,13 @@ "status": "pass" }, { + "comparison": null, "detail": "Scenario explicitly excludes this framework", + "duration_seconds": 5.0531234592199326e-06, "framework": "vectorbt_oss", + "framework_result": null, + "ml4t_result": null, + "provenance": null, "release_blocking": false, "required": false, "scenario_id": "06", @@ -231,8 +86780,1329 @@ "status": "unsupported" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT OSS=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98758.88423767696, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 98758.88423767698, + "message": "VectorBT OSS=$98,758.8842376770, ML4T=$98,758.8842376770 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1241.1157623230392, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 1.4551915228366852e-11, + "expected": -1241.1157623230247, + "message": "VectorBT OSS=$-1,241.1157623230, ML4T=$-1,241.1157623230 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0098089448947, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969144, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.37822753298649, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583236, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1660993670657, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.344064639912, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.20347271536775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.26653798999779, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618961, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.2120800319358, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.29669089980507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600282, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120857, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096519439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516977, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.00980894489471, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.3782275329865, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.16609936706568, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.34406463991202, + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.2034727153664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.2665379899978, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618963, + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.21208003193583, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.2966908998074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600283, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096516597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516981, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.0098089448947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.37822753298649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.344064639912, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.26653798999779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.92471989618961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.2120800319358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.42218168600282, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.00980894489471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.3782275329865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34406463991202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.2665379899978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.92471989618963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.21208003193581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.42218168600283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "07" + }, "detail": null, + "duration_seconds": 3.256936904042959, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.00980894489471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.3782275329865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34406463991202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.2665379899978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.92471989618963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.21208003193581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.42218168600283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98758.88423767698, + "framework": "VectorBT OSS", + "num_trades": 10, + "total_pnl": -1241.1157623230247, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.00980894489471, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.3782275329865, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.16609936706568, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.34406463991202, + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.2034727153664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.2665379899978, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618963, + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.21208003193583, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.2966908998074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600283, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096516597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516981, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.0098089448947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.19608640609162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.37822753298649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.17796063140325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.1660993670657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.344064639912, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.26653798999779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.92471989618961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.2120800319358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.12911312293775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.34188741221216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.78971336605554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.27886274237149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.73638184134556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.42218168600282, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.5471886419149, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67481292191637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66692184481985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.87856869090707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.70575930639009, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98758.88423767696, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1241.1157623230392, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0098089448947, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.19608640609162, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 318.62774611969144, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.37822753298649, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.17796063140325, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -920.0266901583236, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1660993670657, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.344064639912, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -382.20347271536775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.26653798999779, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.92471989618961, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 65.81819061918395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.2120800319358, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.12911312293775, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -408.29669089980507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.34188741221216, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.78971336605554, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 244.78259538433667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.27886274237149, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.73638184134556, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -54.24809010259287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.42218168600282, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.5471886419149, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 212.50069559120857, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.67481292191637, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.66692184481985, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -0.7891077096519439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.87856869090707, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.70575930639009, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -317.2809384516977, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "07", @@ -240,8 +88110,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT OSS=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98602.01730516205, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 98602.01730516207, + "message": "VectorBT OSS=$98,602.0173051621, ML4T=$98,602.0173051621 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1397.9826948379487, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 1.4551915228366852e-11, + "expected": -1397.982694837934, + "message": "VectorBT OSS=$-1,397.9826948379, ML4T=$-1,397.9826948379 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.09937756510391, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503983, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.433350266363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.92112392585113, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528986, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.287640301907, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700879, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499065, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007963, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600575, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.74723658428812, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442473, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0993775651039, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503981, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528984, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.28764030190699, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700877, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499063, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600574, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.7472365842881, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.27477968868709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442476, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.09937756510391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.47432996503983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.34480674528986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.287640301907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.41312912700879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.35182203499065, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.49615479600575, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74723658428812, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.0993775651039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.47432996503981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.34480674528984, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.28764030190699, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.41312912700877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.35182203499063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.49615479600574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.7472365842881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "08" + }, "detail": null, + "duration_seconds": 3.253919875016436, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.0993775651039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.47432996503981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.34480674528984, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.28764030190699, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.41312912700877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.35182203499063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.49615479600574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.7472365842881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.01730516207, + "framework": "VectorBT OSS", + "num_trades": 10, + "total_pnl": -1397.982694837934, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.0993775651039, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503981, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.4333502663608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.9211239258509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528984, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.28764030190699, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362860765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700877, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499063, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600574, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.5159253272068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.7472365842881, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.27477968868709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442476, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.09937756510391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 104.10367149759551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.47432996503983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0899964623762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.25137291545848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.26216167619997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.34480674528986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.84584966088904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.287640301907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.05715706562091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.41312912700879, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.71628446820495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.35182203499065, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66388717758986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.49615479600575, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.47131404927781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74723658428812, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.59448878740123, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.95294649382782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.63417873538535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + } + ], + "final_value": 98602.01730516205, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1397.9826948379487, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.09937756510391, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.10367149759551, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": 300.42939324916006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.47432996503983, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 99.0899964623762, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": -938.433350266363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.25137291545848, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 92.26216167619997, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -398.92112392585113, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.34480674528986, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 88.84584966088904, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 50.10429155991915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.287640301907, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 81.05715706562091, + "exit_reason": "signal", + "exit_time": "2020-02-16T00:00:00", + "pnl": -423.04832362861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 80.41312912700879, + "entry_time": "2020-02-21T00:00:00", + "exit_price": 82.71628446820495, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": 230.31553411961522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.35182203499065, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 81.66388717758986, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -68.79348574007963, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.49615479600575, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 85.47131404927781, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": 197.51592532720497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.74723658428812, + "entry_time": "2020-03-22T00:00:00", + "exit_price": 81.59448878740123, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -15.274779688688795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 83.95294649382782, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 80.63417873538535, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": -331.8767758442473, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "08", @@ -249,8 +89440,417 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "VectorBT OSS=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100363.84268834148, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 100363.84268834148, + "message": "VectorBT OSS=$100,363.8426883415, ML4T=$100,363.8426883415 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 363.8426883414795, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 363.8426883414795, + "message": "VectorBT OSS=$363.8426883415, ML4T=$363.8426883415 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.85822292976627, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.01553458828494, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.8582229297665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.0155345882842, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "09" + }, "detail": null, + "duration_seconds": 3.3604526040144265, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 100363.84268834148, + "framework": "VectorBT OSS", + "num_trades": 2, + "total_pnl": 363.8426883414795, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.8582229297665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.0155345882842, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.37355416326918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.71339881738633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 100363.84268834148, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 363.8426883414795, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 104.29858222929766, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-02T00:00:00", + "pnl": 429.85822292976627, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.37355416326918, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 96.71339881738633, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.01553458828494, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "09", @@ -258,8 +89858,531 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 3, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 3, + "message": "VectorBT OSS=3, ML4T=3, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99854.35332614176, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 99854.35332614178, + "message": "VectorBT OSS=$99,854.3533261418, ML4T=$99,854.3533261418 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -145.6466738582385, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 1.4551915228366852e-11, + "expected": -145.64667385822395, + "message": "VectorBT OSS=$-145.6466738582, ML4T=$-145.6466738582 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_reason": "take_profit", + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_reason": "stop_loss", + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.274411914932, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.2744119149315, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "10" + }, "detail": null, + "duration_seconds": 3.2586936780717224, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "final_value": 99854.35332614178, + "framework": "VectorBT OSS", + "num_trades": 3, + "total_pnl": -145.64667385822395, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.2744119149315, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36277380567032, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 102.22663864471447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "final_value": 99854.35332614176, + "framework": "ml4t.backtest", + "num_trades": 3, + "total_pnl": -145.6466738582385, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-15T00:00:00", + "pnl": -500.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36277380567032, + "entry_time": "2020-01-22T00:00:00", + "exit_price": 100.49905118623735, + "exit_reason": "take_profit", + "exit_time": "2020-02-12T00:00:00", + "pnl": 913.6277380567044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.22663864471447, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 96.63389452556515, + "exit_reason": "stop_loss", + "exit_time": "2020-03-06T00:00:00", + "pnl": -559.274411914932, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "23ed56800f308478a89f083eb8c33c3d0aa5bd6475dbcdc2092bb3b975c5eb45", + "scenario": "ca329113ef7eae6ef6cb075659587a244d4808ab35df74a891dcea2db9151f0e" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 3, + "exit_signals": 0, + "framework_closed_trades": 3, + "framework_fills": 6, + "framework_intents": 3, + "framework_orders": null, + "ml4t_closed_trades": 3, + "ml4t_fills": 6, + "ml4t_intents": 3, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "10", @@ -267,8 +90390,1329 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "VectorBT OSS=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1000951.8554526691, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 2.3283064365386963e-10, + "expected": 1000951.8554526689, + "message": "VectorBT OSS=$1,000,951.8554526689, ML4T=$1,000,951.8554526691 (exact_diff=$0.0000000002, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 951.8554526690859, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 2.3283064365386963e-10, + "expected": 951.8554526688531, + "message": "VectorBT OSS=$951.8554526689, ML4T=$951.8554526691 (exact_diff=$0.0000000002; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.8693728948256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.12381097977595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392333, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_reason": "signal", + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.7783612659923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.79208184900017, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_reason": "signal", + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227825, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.869372894825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.1238109797756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346261, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.77836126599277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.792081849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227814, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "11" + }, "detail": null, + "duration_seconds": 3.2626333869993687, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "final_value": 1000951.8554526689, + "framework": "VectorBT OSS", + "num_trades": 10, + "total_pnl": 951.8554526688531, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.869372894825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.1238109797756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346261, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.77836126599277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.792081849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227814, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 104.20787937697249, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.18918564802424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.35451619239235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93478444533437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.1382953609819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.79908355175671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.74563281040025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.55687092019801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.67616495235359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.71489362901436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 76.91587538104775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.55985216039402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.21379021281562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.47883268095197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.87940403957454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 77.69162042691461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.04428520737794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.37220602586794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73225900039202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.0922185191642, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + } + ], + "final_value": 1000951.8554526691, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": 951.8554526690859, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 104.20787937697249, + "entry_time": "2020-01-07T00:00:00", + "exit_price": 99.18918564802424, + "exit_reason": "signal", + "exit_time": "2020-01-17T00:00:00", + "pnl": 501.8693728948256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.35451619239235, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 88.93478444533437, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 341.97317470579765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.1382953609819, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 82.79908355175671, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -166.07881907748015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.74563281040025, + "entry_time": "2020-03-07T00:00:00", + "exit_price": 85.55687092019801, + "exit_reason": "signal", + "exit_time": "2020-03-17T00:00:00", + "pnl": -381.12381097977595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 81.67616495235359, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 80.71489362901436, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": 96.12713233392333, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 76.91587538104775, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 81.55985216039402, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": -464.3976779346258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 87.21379021281562, + "entry_time": "2020-05-06T00:00:00", + "exit_price": 81.47883268095197, + "exit_reason": "signal", + "exit_time": "2020-05-16T00:00:00", + "pnl": 573.4957531863656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.87940403957454, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 77.69162042691461, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 318.7783612659923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.04428520737794, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 85.37220602586794, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -232.79208184900017, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 91.73225900039202, + "entry_time": "2020-07-05T00:00:00", + "exit_price": 88.0922185191642, + "exit_reason": "signal", + "exit_time": "2020-07-15T00:00:00", + "pnl": 364.0040481227825, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 200, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "11", @@ -276,8 +91720,417 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "VectorBT OSS=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1001485.7011748579, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 1001485.7011748579, + "message": "VectorBT OSS=$1,001,485.7011748579, ML4T=$1,001,485.7011748579 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1485.7011748579098, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 1485.7011748579098, + "message": "VectorBT OSS=$1,485.7011748579, ML4T=$1,485.7011748579 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725157, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383595, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725158, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383737, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "12" + }, "detail": null, + "duration_seconds": 3.272601071977988, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 1001485.7011748579, + "framework": "VectorBT OSS", + "num_trades": 2, + "total_pnl": 1485.7011748579098, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725158, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383737, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.78505322725157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.6612433539132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 1001485.7011748579, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 1485.7011748579098, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 87.2667981247593, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-03T00:00:00", + "pnl": 1273.3201875240702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.78505322725157, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 83.6612433539132, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": 212.38098733383595, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "a3b09249b5b4af24b6bcfcb5175b48077fed844e695fb9206221ca487dd2656c", + "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 100, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "12", @@ -285,8 +92138,303 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT OSS=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100800.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 100800.0, + "message": "VectorBT OSS=$100,800.0000000000, ML4T=$100,800.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 800.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 800.0, + "message": "VectorBT OSS=$800.0000000000, ML4T=$800.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_reason": "take_profit", + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "13" + }, "detail": null, + "duration_seconds": 3.291440617060289, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "final_value": 100800.0, + "framework": "VectorBT OSS", + "num_trades": 1, + "total_pnl": 800.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "final_value": 100800.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 800.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 108.0, + "exit_reason": "take_profit", + "exit_time": "2020-01-13T00:00:00", + "pnl": 800.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "13", @@ -294,8 +92442,303 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT OSS=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99889.95449782923, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99889.95449782923, + "message": "VectorBT OSS=$99,889.9544978292, ML4T=$99,889.9544978292 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -110.04550217077485, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -110.04550217077485, + "message": "VectorBT OSS=$-110.0455021708, ML4T=$-110.0455021708 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077121, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077167, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "14" + }, "detail": null, + "duration_seconds": 3.255767574068159, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "final_value": 99889.95449782923, + "framework": "VectorBT OSS", + "num_trades": 1, + "total_pnl": -110.04550217077485, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077167, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "final_value": 99889.95449782923, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -110.04550217077485, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 98.89954497829228, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-12T00:00:00", + "pnl": -110.04550217077121, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "14", @@ -303,8 +92746,303 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "VectorBT OSS=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99670.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99670.0, + "message": "VectorBT OSS=$99,670.0000000000, ML4T=$99,670.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -330.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -330.0, + "message": "VectorBT OSS=$-330.0000000000, ML4T=$-330.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-03T00:00:00", + "pnl": -330.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_time": "2020-01-03T00:00:00", + "pnl": -329.9999999999997, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "15" + }, "detail": null, + "duration_seconds": 3.242527954047546, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "final_value": 99670.0, + "framework": "VectorBT OSS", + "num_trades": 1, + "total_pnl": -330.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_time": "2020-01-03T00:00:00", + "pnl": -329.9999999999997, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + } + ], + "final_value": 99670.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -330.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 96.7, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-03T00:00:00", + "pnl": -330.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "15", @@ -312,17 +93050,71177 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 9, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 9, + "message": "VectorBT OSS=9, ML4T=9, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 104005.39557457357, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 104005.39557457359, + "message": "VectorBT OSS=$104,005.3955745736, ML4T=$104,005.3955745736 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 4005.395574573573, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 1.4551915228366852e-11, + "expected": 4005.3955745735875, + "message": "VectorBT OSS=$4,005.3955745736, ML4T=$4,005.3955745736 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641157, + "exit_reason": "trailing_stop", + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904412, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.0707718760177, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.2924352735281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.2468713643689, + "exit_reason": "trailing_stop", + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672089, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.8491078479456, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_reason": "trailing_stop", + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.70076277915071, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.44698444994174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_reason": "trailing_stop", + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.38168930537722, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367938, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641157, + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904412, + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.0707718760166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.29243527352696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.2468713643689, + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672089, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.849107847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.7007627791507, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.4469844499416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.3816893053778, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 103.42819240641157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 85.73788226904412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 163.2468713643689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 103.42819240641157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.73788226904412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 163.2468713643689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "16" + }, "detail": null, + "duration_seconds": 3.2858357271179557, "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 103.42819240641157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.73788226904412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 163.2468713643689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "final_value": 104005.39557457359, + "framework": "VectorBT OSS", + "num_trades": 9, + "total_pnl": 4005.3955745735875, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367938, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641157, + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904412, + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.0707718760166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.29243527352696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.2468713643689, + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672089, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.849107847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.7007627791507, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.4469844499416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.3816893053778, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.8286517665368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 108.87178148043324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 103.42819240641157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 67.68717455028396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 85.73788226904412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 146.1644167243563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 115.28717822764801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 163.2468713643689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 231.76982156958886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 220.1813304911094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 124.86128159909472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 120.36184217949486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.70076277915071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.17201183584265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 92.72582872889643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + } + ], + "final_value": 104005.39557457357, + "framework": "ml4t.backtest", + "num_trades": 9, + "total_pnl": 4005.395574573573, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 101.8286517665368, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-18T00:00:00", + "pnl": 182.86517665367865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 108.87178148043324, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 103.42819240641157, + "exit_reason": "trailing_stop", + "exit_time": "2020-04-15T00:00:00", + "pnl": -544.3589074021675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 67.68717455028396, + "entry_time": "2020-07-20T00:00:00", + "exit_price": 85.73788226904412, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-21T00:00:00", + "pnl": 1805.0707718760177, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 146.1644167243563, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 141.12149237162103, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-12T00:00:00", + "pnl": -504.2924352735281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 115.28717822764801, + "entry_time": "2021-05-16T00:00:00", + "exit_price": 163.2468713643689, + "exit_reason": "trailing_stop", + "exit_time": "2021-08-07T00:00:00", + "pnl": 4795.969313672089, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 231.76982156958886, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 220.1813304911094, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-04T00:00:00", + "pnl": -1158.8491078479456, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 124.86128159909472, + "entry_time": "2022-03-12T00:00:00", + "exit_price": 120.36184217949486, + "exit_reason": "trailing_stop", + "exit_time": "2022-04-01T00:00:00", + "pnl": -449.94394195998757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.70076277915071, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 83.93629293465128, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-07T00:00:00", + "pnl": -376.44698444994174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.17201183584265, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.72582872889643, + "exit_reason": "trailing_stop", + "exit_time": "2023-05-15T00:00:00", + "pnl": 255.38168930537722, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 1500, + "entry_signals": 9, + "exit_signals": 0, + "framework_closed_trades": 9, + "framework_fills": 18, + "framework_intents": 9, + "framework_orders": null, + "ml4t_closed_trades": 9, + "ml4t_fills": 18, + "ml4t_intents": 9, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "16", - "scenario_name": "Stress Test", + "scenario_name": "Regime Path Coverage", + "status": "pass" + }, + { + "comparison": { + "checks": [ + { + "actual": 600, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 600, + "message": "VectorBT OSS=600, ML4T=600, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99082.81840069593, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 3.2014213502407074e-10, + "expected": 99082.81840069561, + "message": "VectorBT OSS=$99,082.8184006956, ML4T=$99,082.8184006959 (exact_diff=$0.0000000003, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -917.1815993040655, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 3.2014213502407074e-10, + "expected": -917.1815993043856, + "message": "VectorBT OSS=$-917.1815993044, ML4T=$-917.1815993041 (exact_diff=$0.0000000003; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_reason": "signal", + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593714173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_reason": "signal", + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.818605100987043, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_reason": "signal", + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.094491136524084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_reason": "signal", + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586200102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_reason": "signal", + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218801145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.06433008222848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_reason": "signal", + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086653, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_reason": "signal", + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680638855, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741877003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_reason": "signal", + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684178083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_reason": "signal", + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.346779314319065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_reason": "signal", + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_reason": "signal", + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_reason": "signal", + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.694397571409354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_reason": "signal", + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.96197214105996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.558125592699071, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_reason": "signal", + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214677402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_reason": "signal", + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934980273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.159232215391967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_reason": "signal", + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853665932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43920860251751, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_reason": "signal", + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.84139686416711, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_reason": "signal", + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871567, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_reason": "signal", + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385939875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_reason": "signal", + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.514731714896698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_reason": "signal", + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.41755988945988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.1907166501479, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_reason": "signal", + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.271444044707096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_reason": "signal", + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.256873912370793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.71147617965471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_reason": "signal", + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.411611225090383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_reason": "signal", + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_reason": "signal", + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534164, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_reason": "signal", + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.436010484158032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_reason": "signal", + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.31659762711024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_reason": "signal", + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.8847571184524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_reason": "signal", + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.551277113443575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579693, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_reason": "signal", + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658736, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_reason": "signal", + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.244563725602347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.6794133043149486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_reason": "signal", + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691421134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.66423065390151, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_reason": "signal", + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_reason": "signal", + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_reason": "signal", + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_reason": "signal", + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299107568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_reason": "signal", + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.233553610009039, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_reason": "signal", + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779575956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_reason": "signal", + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904841, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632265, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_reason": "signal", + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552286926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_reason": "signal", + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243633828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_reason": "signal", + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060870859, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473834, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_reason": "signal", + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.27435094678003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_reason": "signal", + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_reason": "signal", + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_reason": "signal", + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_reason": "signal", + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828939593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_reason": "signal", + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.83390508796765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_reason": "signal", + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.0899776971346, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390373, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_reason": "signal", + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503891584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_reason": "signal", + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.221431138130356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_reason": "signal", + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967262, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_reason": "signal", + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.314194464974207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_reason": "signal", + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.43536536485044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_reason": "signal", + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957024068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_reason": "signal", + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605265767, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_reason": "signal", + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222878, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_reason": "signal", + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933833377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_reason": "signal", + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.43108275249142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_reason": "signal", + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232703194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_reason": "signal", + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.736746809110628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_reason": "signal", + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870249869, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_reason": "signal", + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_reason": "signal", + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.767928866775037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_reason": "signal", + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.499046203607577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.4442900442657, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_reason": "signal", + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.4733285004258505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_reason": "signal", + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.41985975424359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_reason": "signal", + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131527593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_reason": "signal", + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.12874559926604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_reason": "signal", + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_reason": "signal", + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055832713, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_reason": "signal", + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.46850096455091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_reason": "signal", + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_reason": "signal", + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_reason": "signal", + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.2860554086219054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_reason": "signal", + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.62622492499031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_reason": "signal", + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_reason": "signal", + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_reason": "signal", + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.8392652928469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_reason": "signal", + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057535155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_reason": "signal", + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190440912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_reason": "signal", + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.57925581127165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_reason": "signal", + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_reason": "signal", + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803505642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.916410701528, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_reason": "signal", + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245994729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_reason": "signal", + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.370378005640305, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_reason": "signal", + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_reason": "signal", + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.328749896181762, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_reason": "signal", + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580978493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_reason": "signal", + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.13393585817721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_reason": "signal", + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314274366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_reason": "signal", + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.435014304764991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_reason": "signal", + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_reason": "signal", + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840375183, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508901, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_reason": "signal", + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_reason": "signal", + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534470988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_reason": "signal", + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.279537798676756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_reason": "signal", + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988052733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_reason": "signal", + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_reason": "signal", + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648283211, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_reason": "signal", + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.23956958396775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738782, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_reason": "signal", + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.54950419017041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_reason": "signal", + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.3170582707898575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_reason": "signal", + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958929473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_reason": "signal", + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.799287939786154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_reason": "signal", + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.566110234804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_reason": "signal", + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580273526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_reason": "signal", + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_reason": "signal", + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.99451954396136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_reason": "signal", + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360714424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359947, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_reason": "signal", + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251026673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_reason": "signal", + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.55524721888287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349607, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_reason": "signal", + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151735998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_reason": "signal", + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.16380493579527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_reason": "signal", + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.324330426270535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_reason": "signal", + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446389, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_reason": "signal", + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_reason": "signal", + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_reason": "signal", + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_reason": "signal", + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_reason": "signal", + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.71778229872325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309691, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_reason": "signal", + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.085012296938658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_reason": "signal", + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118006887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_reason": "signal", + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.358103555914568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670386, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_reason": "signal", + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937580086, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.939646337063, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_reason": "signal", + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463671638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_reason": "signal", + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.64107989219883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_reason": "signal", + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978554927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_reason": "signal", + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461125902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_reason": "signal", + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.29187006162101, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_reason": "signal", + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_reason": "signal", + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198639, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_reason": "signal", + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_reason": "signal", + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.247732215164433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_reason": "signal", + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.498636898822951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_reason": "signal", + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_reason": "signal", + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615309366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_reason": "signal", + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4607924127623, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_reason": "signal", + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155382, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_reason": "signal", + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.942910425748778, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_reason": "signal", + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.159607901468917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_reason": "signal", + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.665720246286583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329608, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_reason": "signal", + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375868318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_reason": "signal", + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.25433549778063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_reason": "signal", + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251336331, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_reason": "signal", + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.651066015805554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_reason": "signal", + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288788485, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7509399436349, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_reason": "signal", + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_reason": "signal", + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.6613055010057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_reason": "signal", + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.351515279440719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_reason": "signal", + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763889453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_reason": "signal", + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.972436242504045, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544105, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_reason": "signal", + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616735905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.78182814117551, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_reason": "signal", + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.6414770862847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_reason": "signal", + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.52202640160067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_reason": "signal", + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004907486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_reason": "signal", + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.36504877182051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6600503714477, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_reason": "signal", + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430941865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_reason": "signal", + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253732356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.51475031329109, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_reason": "signal", + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865565558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_reason": "signal", + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911403636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201514, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_reason": "signal", + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702404, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_reason": "signal", + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.67990156245469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510083, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_reason": "signal", + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588427, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_reason": "signal", + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.615865477519037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_reason": "signal", + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983330013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644765, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_reason": "signal", + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.47155236267281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_reason": "signal", + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035865418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_reason": "signal", + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.4763061822523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29424834791328, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_reason": "signal", + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.820916103664786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_reason": "signal", + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.929103047956232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_reason": "signal", + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437553964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_reason": "signal", + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.25348107968057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367423, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_reason": "signal", + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695449437, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_reason": "signal", + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075543615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368549, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_reason": "signal", + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.213038607964336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_reason": "signal", + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543946172, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_reason": "signal", + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.3119127778427355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_reason": "signal", + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109606473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831216, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_reason": "signal", + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498263729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861235, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_reason": "signal", + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.112939943153833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_reason": "signal", + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352885, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_reason": "signal", + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828477266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_reason": "signal", + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_reason": "signal", + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.193972490449596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_reason": "signal", + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.634815022258408, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_reason": "signal", + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495900064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_reason": "signal", + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_reason": "signal", + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_reason": "signal", + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200341314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_reason": "signal", + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.708906925368865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_reason": "signal", + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937353803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_reason": "signal", + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823867046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178705, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_reason": "signal", + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.51189970753876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831386, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_reason": "signal", + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.2537923861618765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318698, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_reason": "signal", + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467449975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_reason": "signal", + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287143015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_reason": "signal", + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_reason": "signal", + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_reason": "signal", + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_reason": "signal", + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.89955729355279, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_reason": "signal", + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540020673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_reason": "signal", + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.301836282287695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715277, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_reason": "signal", + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089780547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_reason": "signal", + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.204835787799311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551608, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_reason": "signal", + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801757812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_reason": "signal", + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714099, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_reason": "signal", + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578473054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_reason": "signal", + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.046466530036923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_reason": "signal", + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716468106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_reason": "signal", + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.062989705174914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_reason": "signal", + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.846550115415084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_reason": "signal", + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669813805, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_reason": "signal", + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.148929313827466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_reason": "signal", + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.67007162115442, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_reason": "signal", + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417203755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3692642985158, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_reason": "signal", + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996231617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_reason": "signal", + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259348306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96384685743692, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_reason": "signal", + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.492351047065313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_reason": "signal", + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.6960470240283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_reason": "signal", + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767725106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60924422208079, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_reason": "signal", + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152243435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842418, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_reason": "signal", + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_reason": "signal", + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066539056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286363, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_reason": "signal", + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703182832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_reason": "signal", + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.26658756026336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_reason": "signal", + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979885537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939167, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_reason": "signal", + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.958284267167983, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_reason": "signal", + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.67518695522449, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_reason": "signal", + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953632, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563325, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_reason": "signal", + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011503856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635457, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_reason": "signal", + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.20190875498156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144556, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_reason": "signal", + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.188786913549848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_reason": "signal", + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_reason": "signal", + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_reason": "signal", + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266028649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_reason": "signal", + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_reason": "signal", + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.7508117158831737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_reason": "signal", + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39339911911829, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_reason": "signal", + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_reason": "signal", + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.83820052784904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_reason": "signal", + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_reason": "signal", + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_reason": "signal", + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_reason": "signal", + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.807707795838724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_reason": "signal", + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_reason": "signal", + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.58063831637992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_reason": "signal", + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.70807407659231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_reason": "signal", + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.9131983498464251, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109037, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_reason": "signal", + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607728587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654936, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_reason": "signal", + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964951458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_reason": "signal", + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_reason": "signal", + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.30218492307904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_reason": "signal", + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.116009860519625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_reason": "signal", + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721801443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_reason": "signal", + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.377991396690049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_reason": "signal", + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.790425754843454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_reason": "signal", + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_reason": "signal", + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_reason": "signal", + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083497363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963446, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_reason": "signal", + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.120684905507005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_reason": "signal", + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.6299880079695868, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_reason": "signal", + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389961, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_reason": "signal", + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_reason": "signal", + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494619593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668627, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_reason": "signal", + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_reason": "signal", + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314586615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206744, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_reason": "signal", + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419836, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_reason": "signal", + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268385658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_reason": "signal", + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131592115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_reason": "signal", + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986418441, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_reason": "signal", + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514739937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274801, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_reason": "signal", + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480843964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030802, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_reason": "signal", + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_reason": "signal", + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500957513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2390830156373, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_reason": "signal", + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.983005044510719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_reason": "signal", + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.059187856133576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_reason": "signal", + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937459276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_reason": "signal", + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502062724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_reason": "signal", + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357511, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_reason": "signal", + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876403, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_reason": "signal", + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.72051069276088, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_reason": "signal", + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462060562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_reason": "signal", + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_reason": "signal", + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_reason": "signal", + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384409952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_reason": "signal", + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.18510442104889, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_reason": "signal", + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.96776738101289, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510016, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_reason": "signal", + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.77971502472792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_reason": "signal", + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.589018842509176, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.36326200776878, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_reason": "signal", + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.82181711128942, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_reason": "signal", + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280912579, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_reason": "signal", + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.144737039050597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_reason": "signal", + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.050167947418231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_reason": "signal", + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.498634401668824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_reason": "signal", + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648757951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_reason": "signal", + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837725266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_reason": "signal", + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669457794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_reason": "signal", + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173419166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_reason": "signal", + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475651559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155105, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_reason": "signal", + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9967936460588, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_reason": "signal", + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.879597588107572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293297, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_reason": "signal", + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.39663846745316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247865, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_reason": "signal", + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199741096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_reason": "signal", + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_reason": "signal", + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_reason": "signal", + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856305258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766983, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_reason": "signal", + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424424916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_reason": "signal", + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.510255062170472, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081938, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_reason": "signal", + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049091452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_reason": "signal", + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5662997648947, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_reason": "signal", + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261796, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_reason": "signal", + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503895997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_reason": "signal", + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444195, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_reason": "signal", + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972195496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_reason": "signal", + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382659098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_reason": "signal", + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541605, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_reason": "signal", + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.80543916802344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_reason": "signal", + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958812864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_reason": "signal", + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.04892056146127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_reason": "signal", + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.5288142035115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824345, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_reason": "signal", + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_reason": "signal", + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996872107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_reason": "signal", + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.256980572848988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_reason": "signal", + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.732835568323935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_reason": "signal", + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941460843, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_reason": "signal", + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.71804376395994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_reason": "signal", + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_reason": "signal", + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2927331361965, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_reason": "signal", + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.989778988454418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_reason": "signal", + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.617776328117543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_reason": "signal", + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.679745846106016, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_reason": "signal", + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.557537143758964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_reason": "signal", + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262508637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785213, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_reason": "signal", + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.27452639938383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_reason": "signal", + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.48328085916728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_reason": "signal", + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557967, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_reason": "signal", + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171538733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654837, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_reason": "signal", + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536163, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_reason": "signal", + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660378, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_reason": "signal", + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213550338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_reason": "signal", + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.49689680980373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962727, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_reason": "signal", + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.33077462199799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_reason": "signal", + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_reason": "signal", + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.49465844311635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_reason": "signal", + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.55570058979538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_reason": "signal", + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.022673051784295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_reason": "signal", + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927238294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_reason": "signal", + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.544461104454967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_reason": "signal", + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476298851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_reason": "signal", + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.02937136700166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9434543592522, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_reason": "signal", + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.0379112064129, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258927, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_reason": "signal", + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.262967547514563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170635, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_reason": "signal", + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918275248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734213, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_reason": "signal", + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.440692419269908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693204, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_reason": "signal", + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569969245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586935, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_reason": "signal", + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767296782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_reason": "signal", + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535180358, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_reason": "signal", + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.0953791114861815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_reason": "signal", + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.031376806777189, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_reason": "signal", + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.199383891174875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_reason": "signal", + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661953512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_reason": "signal", + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.0670859707206546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_reason": "signal", + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.32002349353752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_reason": "signal", + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.832583851371965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_reason": "signal", + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_reason": "signal", + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_reason": "signal", + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_reason": "signal", + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361717, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_reason": "signal", + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.98923316949731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_reason": "signal", + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521374553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_reason": "signal", + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977465634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_reason": "signal", + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.01771977784665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562022, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_reason": "signal", + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788157, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_reason": "signal", + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.9690817196897115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_reason": "signal", + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.6298475393559784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_reason": "signal", + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_reason": "signal", + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.4965979569497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_reason": "signal", + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.73558672362924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_reason": "signal", + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397877962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219035, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_reason": "signal", + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_reason": "signal", + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_reason": "signal", + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_reason": "signal", + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.538085337755547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_reason": "signal", + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136735038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_reason": "signal", + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.660219079667513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1634420410312, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_reason": "signal", + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_reason": "signal", + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.51073701711539, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_reason": "signal", + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.039291318245887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_reason": "signal", + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.5455469724420254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_reason": "signal", + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.684106013008204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_reason": "signal", + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.175185654492452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_reason": "signal", + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.000169986198671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_reason": "signal", + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903136995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_reason": "signal", + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296161414, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_reason": "signal", + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_reason": "signal", + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.346592844440238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_reason": "signal", + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.27825226889581245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_reason": "signal", + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816992817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_reason": "signal", + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.206471919769683, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_reason": "signal", + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256222904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_reason": "signal", + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193162, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_reason": "signal", + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723484808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_reason": "signal", + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_reason": "signal", + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.4286277387273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_reason": "signal", + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.386696350815328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_reason": "signal", + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.9423728518268035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_reason": "signal", + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449517, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4719110379968, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_reason": "signal", + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.8619685868870874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_reason": "signal", + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_reason": "signal", + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_reason": "signal", + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_reason": "signal", + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780962, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_reason": "signal", + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214942092, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_reason": "signal", + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.300406506135914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_reason": "signal", + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606662, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915469, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_reason": "signal", + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.78203732486145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_reason": "signal", + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389963782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605427, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_reason": "signal", + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_reason": "signal", + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882171274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1123342756572, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_reason": "signal", + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_reason": "signal", + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_reason": "signal", + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576041515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_reason": "signal", + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057154, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_reason": "signal", + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599363, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_reason": "signal", + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304649466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_reason": "signal", + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.0243068697091076, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_reason": "signal", + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630663075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_reason": "signal", + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171904594, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212905, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_reason": "signal", + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.850532277363527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_reason": "signal", + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.208127806416087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886634, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_reason": "signal", + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_reason": "signal", + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.950291361366908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_reason": "signal", + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_reason": "signal", + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345987, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_reason": "signal", + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.703008452692302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_reason": "signal", + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006990936, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_reason": "signal", + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.755139693985257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67881964988702, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_reason": "signal", + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394165908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690371, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_reason": "signal", + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_reason": "signal", + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.28591441390381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_reason": "signal", + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026074566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561574, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_reason": "signal", + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.64246364351311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_reason": "signal", + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288754246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_reason": "signal", + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.0540723384710873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_reason": "signal", + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.18906961320863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948878, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_reason": "signal", + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422677416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_reason": "signal", + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312482, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_reason": "signal", + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.51815315062595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10919349920911, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_reason": "signal", + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.339955484278107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_reason": "signal", + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119754955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_reason": "signal", + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.683561533820466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_reason": "signal", + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_reason": "signal", + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_reason": "signal", + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_reason": "signal", + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.17253493285352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864644, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_reason": "signal", + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_reason": "signal", + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113402725, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_reason": "signal", + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.95124871613007, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_reason": "signal", + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.58713017559967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_reason": "signal", + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_reason": "signal", + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_reason": "signal", + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481157424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921617, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_reason": "signal", + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541040057375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_reason": "signal", + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_reason": "signal", + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.424006679009835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_reason": "signal", + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.55566499742599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92441725059159, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_reason": "signal", + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.9925168828794995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979755, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_reason": "signal", + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.49772748038413, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4263959037515, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_reason": "signal", + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.573757603870035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_reason": "signal", + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617475, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_reason": "signal", + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.5347405117991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_reason": "signal", + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184013, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_reason": "signal", + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.120229511472644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_reason": "signal", + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.931582189943583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_reason": "signal", + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039717881, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_reason": "signal", + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.94435838649406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_reason": "signal", + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.171329489941854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573187, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_reason": "signal", + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_reason": "signal", + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.71964497666886, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_reason": "signal", + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.165661585799171, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_reason": "signal", + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742489865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_reason": "signal", + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_reason": "signal", + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.758516862899342, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_reason": "signal", + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_reason": "signal", + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.03123755209526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681195, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_reason": "signal", + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460924718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624199, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_reason": "signal", + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.89429108366494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_reason": "signal", + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.5829205531154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164757, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_reason": "signal", + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035269526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_reason": "signal", + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928536, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_reason": "signal", + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525051872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_reason": "signal", + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.180241042491616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_reason": "signal", + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748758578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_reason": "signal", + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359858, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_reason": "signal", + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.830548398671453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_reason": "signal", + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931773471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_reason": "signal", + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367004184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_reason": "signal", + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_reason": "signal", + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.53076817370311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_reason": "signal", + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.2863786863108544, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_reason": "signal", + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.314075352951477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_reason": "signal", + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.316709206214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433928, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_reason": "signal", + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.97443094036862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_reason": "signal", + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_reason": "signal", + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_reason": "signal", + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.03336817440686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_reason": "signal", + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_reason": "signal", + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_reason": "signal", + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.8860584383674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_reason": "signal", + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_reason": "signal", + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.79934479523763, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_reason": "signal", + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.0413638643822196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_reason": "signal", + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180531315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_reason": "signal", + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.43210846053444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_reason": "signal", + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.300869738231995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_reason": "signal", + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391500386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_reason": "signal", + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026382292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477344, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_reason": "signal", + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247105955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_reason": "signal", + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.901509342811551, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_reason": "signal", + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529459737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_reason": "signal", + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.00368736967721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_reason": "signal", + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.375219865520194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_reason": "signal", + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323621, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_reason": "signal", + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845515494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_reason": "signal", + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_reason": "signal", + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_reason": "signal", + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.3732195255815896, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_reason": "signal", + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_reason": "signal", + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.2638775310661, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_reason": "signal", + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237786932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033825, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_reason": "signal", + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.1141954973609245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_reason": "signal", + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_reason": "signal", + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.651363355676949, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_reason": "signal", + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6866778828559, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_reason": "signal", + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.24383423575091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_reason": "signal", + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956909315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646611, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_reason": "signal", + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.2936113286014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_reason": "signal", + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.0873836587798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_reason": "signal", + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_reason": "signal", + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049990543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696184, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_reason": "signal", + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.82028992037158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_reason": "signal", + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588521321, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_reason": "signal", + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_reason": "signal", + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712217965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_reason": "signal", + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.086274334578775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_reason": "signal", + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246019599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_reason": "signal", + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691247669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76765880138052, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_reason": "signal", + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001033899, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_reason": "signal", + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_reason": "signal", + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.9401548163259577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_reason": "signal", + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446485, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_reason": "signal", + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.909642827453354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_reason": "signal", + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_reason": "signal", + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986613527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896145, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_reason": "signal", + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663786834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06360781499562, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_reason": "signal", + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.74492273900978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_reason": "signal", + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.95281060565685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_reason": "signal", + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223034003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_reason": "signal", + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_reason": "signal", + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_reason": "signal", + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612556, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_reason": "signal", + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573970061, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_reason": "signal", + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811706, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_reason": "signal", + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804038503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_reason": "signal", + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250840212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_reason": "signal", + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.9806272595615155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_reason": "signal", + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_reason": "signal", + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_reason": "signal", + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.4772455717266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_reason": "signal", + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.3364267550241493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_reason": "signal", + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.593823999966844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_reason": "signal", + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117042512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_reason": "signal", + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762062426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_reason": "signal", + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.12496866238871, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783007, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_reason": "signal", + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.90006374215409, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_reason": "signal", + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742123469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_reason": "signal", + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777529, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_reason": "signal", + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.375818066228021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_reason": "signal", + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.35110392900242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_reason": "signal", + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265306867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_reason": "signal", + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_reason": "signal", + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228018244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_reason": "signal", + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_reason": "signal", + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.800617803228306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_reason": "signal", + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_reason": "signal", + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112129376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.15663810787721, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_reason": "signal", + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.30461443963577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_reason": "signal", + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.238123677778276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_reason": "signal", + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_reason": "signal", + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484375832, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593713491, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.81860510098636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.09449113652465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586199989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218804555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.064330082228935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680639082, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741875695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684177912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.3467793143181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.69439757140907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.961972141060187, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.5581255926977065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214676265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934972884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.1592322153927626, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853679574, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.4392086025175, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.841396864166654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385940273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.51473171489596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.4175598894592, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.19071665014789, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.27144404470732, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.25687391237011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.711476179654312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.41161122508953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670451, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534162, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.43601048415826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.316597627110752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.884757118451887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.55127711344352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579691, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658735, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.24456372560246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.679413304314494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691420111, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.6642306539015, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299106602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.2335536100097215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779573114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904898, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632264, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552285619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243634283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060871371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473835, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.2743509467814, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828940503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.833905087967935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.089977697134827, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390374, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503897269, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.22143113813138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967261, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.3141944649751167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.435365364850838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957022704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605266392, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222901, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933831103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.431082752491932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232704445, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.73674680911023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870250381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.7679288667759465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.4990462036063263, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.44429004426568, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.473328500425566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.419859754243646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131526797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.128745599266495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055833565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.468500964550344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.28605540862128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.626224924989856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.83926529284673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057534757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190439832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.579255811271253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803504164, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91641070152801, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245995752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.3703780056404185, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.32874989618125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580977754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.133935858177665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314275276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.4350143047646498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840374387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508903, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534469624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.27953779867738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988053244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648288327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.239569583967238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738783, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.549504190170239, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.317058270789744, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958931008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.79928793978644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.56611023480474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580274436, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.9945195439614167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360713287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359948, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251027355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.555247218882243, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349606, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151736169, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.163804935794474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.32433042627099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250585, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.717782298722398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309693, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.08501229693735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118005978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.35810355591542, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670384, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937577812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.93964633706301, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463670786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.641079892197638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978555268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461124708, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.291870061621694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198622, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.24773221516340982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.49863689882369, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594623, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615308684, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46079241276229, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.94291042574946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.1596079014692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.66572024628681, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329607, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375867295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.2543354977804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251330647, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.65106601580584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288785643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75093994363492, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.661305501004904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.35151527944123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763888885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.97243624250433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544106, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616736985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7818281411755, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.641477086284283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.522026401600272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004906804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.365048771821193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66005037144768, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430943286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253733095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5147503132911, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865564705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911404432, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201515, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.679901562454347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510082, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.61586547751955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983329274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644767, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.471552362672355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035864679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.476306182251733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2942483479133, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.82091610366541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.92910304795663, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437557943, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.253481079680625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367425, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695443184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075542535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368548, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.21303860796337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543945262, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.31191277784302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109608747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831217, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498262705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861234, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.11293994315355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352883, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828476811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.1939724904498803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.6348150222575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495899722, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200340973, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.70890692536892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937354712, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823866421, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178704, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.511899707539044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831385, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.253792386163013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318696, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467450657, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287142276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027726, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.899557293554153, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540016694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.30183628228707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715279, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089781514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.2048357877988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551607, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801756562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714097, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578466232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.04646653003698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716465832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.06298970517565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.84655011541605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669814658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.1489293138273524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.670071621155728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417196933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36926429851582, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996232754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259347965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9638468574369, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.49235104706537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.696047024026996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767726584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6092442220808, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152244459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842416, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066538374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286364, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703183287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.266587560263304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979886787, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939166, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.95828426716946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.675186955224547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563327, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011504254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635458, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.201908754982924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144558, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.18878691354837, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266030013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.750811715883117, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.3933991191183, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.838200527849381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.80770779583844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.580638316379293, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.708074076593277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.913198349846823, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109036, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607730122, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654935, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964952197, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.302184923080063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.11600986051951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721812812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.37799139669022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.79042575484317, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083496794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963444, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.1206849055072325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.629988007969075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389506, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494614477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668626, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288771, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314585705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206742, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268389069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131595526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986426967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514740676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274803, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480821227, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030803, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500958707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23908301563729, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.98300504451015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.05918785613318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937458367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502063861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876404, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.7205106927609, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462061642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384410861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.185104421049573, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.967767381012948, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510017, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.779715024729455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.5890188425102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.3632620077688, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.821817111289988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280913204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.14473703905088, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.0501679474180605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.49863440166962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648758065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837724982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669464616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173420587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475652127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155103, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99679364605882, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.8795975881067193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293296, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.396638467454352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247866, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199740925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302750862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856306395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766984, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424431737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.51025506216996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081939, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049092987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56629976489471, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503894917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444197, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972196576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382658984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541603, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.805439168024463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958813773, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.0489205614611, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.528814203511274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824344, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537079, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996870856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.25698057284876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.73283556832388, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941466527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.718043763959486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015783, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29273313619652, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.98977898845419, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.61777632811817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.67974584610613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.5575371437582817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262513753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785215, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.274526399382864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.483280859167849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557965, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171537597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654839, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276665996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536164, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646894, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660377, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213548803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.496896809804014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962726, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.330774621999012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.494658443117316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.555700589794412, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.02267305178509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927239374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.54446110445582, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476299988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.029371367001545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94345435925221, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.03791120641415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258926, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.26296754751479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170637, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918274964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734212, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.44069241927093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693206, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569968848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586936, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767297123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535178994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.095379111485897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.0313768067774731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.19938389117391, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661952603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.067085970720939, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.320023493537292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.83258385137094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397329, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.989233169496913, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521375633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977460518, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.017719777847503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562024, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788384, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.969081719690394, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.629847539355069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.49659795694981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.735586723630547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397876825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219033, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.53808533775606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136738448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.66021907966808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16344204103119, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.5107370171159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.03929131824566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.545546972441116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.68410601300798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.1751856544923953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.0001699861983866, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903137052, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296160107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.3465928444404085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.2782522688960398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816993954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.2064719197691716, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256224041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193163, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723470597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.428627738727357, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.3866963508151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.942372851825951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449521, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.47191103799679, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.861968586886519, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780961, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214940785, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.30040650613597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915468, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.782037324861676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389962986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605429, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882170364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11233427565722, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576048336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057153, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599362, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304654013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.024306869708937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630673876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171903798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212904, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.8505322773634703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.20812780641586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886635, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.9502913613674195, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345986, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.70300845269179, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006991675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.75513969398537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.678819649887, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394166022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690373, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.285914413903527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026075532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561572, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.642463643513338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288755156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.054072338471258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.189069613209085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948876, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422676904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.518153150624926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1091934992091, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.33995548427822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119755012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.68356153382166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.172534932854376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864645, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173468, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113401304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.951248716128646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.587130175600862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481150603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921618, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541039966425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.4240066790108, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.5556649974252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9244172505916, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.992516882881091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979754, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.497727480383617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42639590375148, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.57375760387049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.534740511800294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854323, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184015, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.1202295114724166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.93158218994381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039718051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.944358386493093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.17132948994271, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573185, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.719644976669997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.16566158579883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742488558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.75851686290008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.031237552095206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681193, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460925514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624197, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.894291083664882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.582920553113979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164759, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035270776, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525052554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.18024104249116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748757328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359801, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.83054839867026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931774438, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367003217, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.530768173702654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.286378686309831, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.3140753529508515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.31670920621434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433926, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.974430940369984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999607, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.033368174406121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.886058438367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537678, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.799344795237516, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.041363864381651, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180530235, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.432108460534664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.30086973823245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391499477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026383202, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477345, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247107376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.90150934281246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529460192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.003687369676925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.37521986551968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323622, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845518905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.373219525581476, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734781, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.26387753106695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237787046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033824, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.114195497361095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.6513633556779723, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68667788285592, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.2438342357504, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956910566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646612, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.29361132859998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.087383658779345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049989406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696185, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.820289920370556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588520867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712225355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.08627433457974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246020054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691248635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7676588013805, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001034069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.940154816325503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446483, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.90964282745455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986612731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896144, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663785526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0636078149956, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.744922739010008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.952810605657078, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223033548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031401, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612557, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573968924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811708, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804039526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250839758, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.980627259560833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378213, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.477245571726257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.336426755023524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.5938239999666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117041659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762066405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.124968662388824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783006, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.900063742154032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742117216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.3758180662279074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.351103929002534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265297204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228017619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.8006178032281355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112130058, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1566381078772, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.304614439634463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.2381236777780487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484376741, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "VectorBT OSS", + "passed": true, + "scenario_id": "17" + }, + "detail": null, + "duration_seconds": 3.4040371340233833, + "framework": "vectorbt_oss", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "final_value": 99082.81840069561, + "framework": "VectorBT OSS", + "num_trades": 600, + "total_pnl": -917.1815993043856, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593713491, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.81860510098636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.09449113652465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586199989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218804555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.064330082228935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680639082, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741875695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684177912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.3467793143181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.69439757140907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.961972141060187, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.5581255926977065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214676265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934972884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.1592322153927626, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853679574, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.4392086025175, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.841396864166654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385940273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.51473171489596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.4175598894592, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.19071665014789, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.27144404470732, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.25687391237011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.711476179654312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.41161122508953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670451, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534162, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.43601048415826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.316597627110752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.884757118451887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.55127711344352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579691, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658735, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.24456372560246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.679413304314494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691420111, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.6642306539015, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299106602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.2335536100097215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779573114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904898, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632264, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552285619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243634283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060871371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473835, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.2743509467814, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828940503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.833905087967935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.089977697134827, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390374, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503897269, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.22143113813138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967261, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.3141944649751167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.435365364850838, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957022704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605266392, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222901, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933831103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.431082752491932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232704445, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.73674680911023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870250381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.7679288667759465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.4990462036063263, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.44429004426568, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.473328500425566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.419859754243646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131526797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.128745599266495, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055833565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.468500964550344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.28605540862128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.626224924989856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.83926529284673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057534757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190439832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.579255811271253, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803504164, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91641070152801, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245995752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.3703780056404185, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.32874989618125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580977754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.133935858177665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314275276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.4350143047646498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840374387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508903, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534469624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.27953779867738, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988053244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648288327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.239569583967238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738783, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.549504190170239, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.317058270789744, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958931008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.79928793978644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.56611023480474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580274436, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.9945195439614167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360713287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359948, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251027355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.555247218882243, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349606, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151736169, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.163804935794474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.32433042627099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250585, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.717782298722398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309693, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.08501229693735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118005978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.35810355591542, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670384, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937577812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.93964633706301, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463670786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.641079892197638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978555268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461124708, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.291870061621694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198622, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936174, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.24773221516340982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.49863689882369, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594623, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615308684, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46079241276229, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.94291042574946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.1596079014692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.66572024628681, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329607, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375867295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.2543354977804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251330647, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.65106601580584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288785643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75093994363492, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.661305501004904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.35151527944123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763888885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.97243624250433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544106, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616736985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7818281411755, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.641477086284283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.522026401600272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004906804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.365048771821193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66005037144768, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430943286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253733095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5147503132911, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865564705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911404432, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201515, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.679901562454347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510082, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.61586547751955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983329274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644767, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.471552362672355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035864679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.476306182251733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2942483479133, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.82091610366541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.92910304795663, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437557943, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.253481079680625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367425, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695443184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075542535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368548, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.21303860796337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543945262, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.31191277784302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109608747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831217, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498262705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861234, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.11293994315355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352883, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828476811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.1939724904498803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.6348150222575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495899722, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200340973, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.70890692536892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937354712, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823866421, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178704, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.511899707539044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831385, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.253792386163013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318696, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467450657, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287142276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027726, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.899557293554153, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540016694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.30183628228707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715279, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089781514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.2048357877988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551607, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801756562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714097, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578466232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.04646653003698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716465832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.06298970517565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.84655011541605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669814658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.1489293138273524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.670071621155728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417196933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36926429851582, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996232754, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259347965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9638468574369, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.49235104706537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.696047024026996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767726584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6092442220808, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152244459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842416, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066538374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286364, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703183287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.266587560263304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979886787, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939166, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.95828426716946, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.675186955224547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563327, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011504254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635458, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.201908754982924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144558, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.18878691354837, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266030013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.750811715883117, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.3933991191183, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.838200527849381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.80770779583844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.580638316379293, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.708074076593277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.913198349846823, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109036, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607730122, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654935, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964952197, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.302184923080063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.11600986051951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721812812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.37799139669022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.79042575484317, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864892, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083496794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963444, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.1206849055072325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.629988007969075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389506, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494614477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668626, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288771, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314585705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206742, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268389069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131595526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986426967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514740676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274803, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480821227, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030803, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500958707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23908301563729, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.98300504451015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.05918785613318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937458367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502063861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876404, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.7205106927609, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462061642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384410861, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.185104421049573, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.967767381012948, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510017, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.779715024729455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.5890188425102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.3632620077688, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.821817111289988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280913204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.14473703905088, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.0501679474180605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.49863440166962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648758065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837724982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669464616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173420587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475652127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155103, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99679364605882, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.8795975881067193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293296, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.396638467454352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247866, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199740925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302750862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856306395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766984, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424431737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.51025506216996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081939, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049092987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073459, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56629976489471, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503894917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444197, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972196576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382658984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541603, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.805439168024463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958813773, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.0489205614611, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.528814203511274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824344, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537079, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996870856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.25698057284876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.73283556832388, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941466527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.718043763959486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015783, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29273313619652, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.98977898845419, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.61777632811817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.67974584610613, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.5575371437582817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262513753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785215, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.274526399382864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.483280859167849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557965, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171537597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654839, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276665996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536164, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646894, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660377, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213548803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.496896809804014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962726, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.330774621999012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.494658443117316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.555700589794412, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.02267305178509, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927239374, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.54446110445582, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476299988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.029371367001545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94345435925221, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.03791120641415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258926, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.26296754751479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170637, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918274964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734212, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.44069241927093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693206, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569968848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586936, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767297123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535178994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.095379111485897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.0313768067774731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.19938389117391, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661952603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.067085970720939, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.320023493537292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.83258385137094, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397329, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.989233169496913, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521375633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977460518, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.017719777847503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562024, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788384, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.969081719690394, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.629847539355069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.49659795694981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.735586723630547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397876825, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219033, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.53808533775606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136738448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.66021907966808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16344204103119, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061498, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.5107370171159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.03929131824566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.545546972441116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.68410601300798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.1751856544923953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.0001699861983866, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903137052, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296160107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.3465928444404085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.2782522688960398, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816993954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.2064719197691716, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256224041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193163, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723470597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827679, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.428627738727357, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.3866963508151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.942372851825951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449521, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.47191103799679, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.861968586886519, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780961, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214940785, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.30040650613597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915468, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.782037324861676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389962986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605429, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882170364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11233427565722, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576048336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545335, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057153, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599362, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304654013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.024306869708937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630673876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171903798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212904, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.8505322773634703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.20812780641586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886635, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.9502913613674195, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345986, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.70300845269179, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006991675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.75513969398537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.678819649887, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394166022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690373, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.285914413903527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026075532, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561572, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.642463643513338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288755156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.054072338471258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.189069613209085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948876, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422676904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.518153150624926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1091934992091, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.33995548427822, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119755012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.68356153382166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.172534932854376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864645, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173468, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113401304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.951248716128646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.587130175600862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481150603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921618, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541039966425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.4240066790108, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.5556649974252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9244172505916, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.992516882881091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979754, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.497727480383617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42639590375148, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.57375760387049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.534740511800294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854323, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184015, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.1202295114724166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.93158218994381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039718051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.944358386493093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.17132948994271, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573185, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.719644976669997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.16566158579883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742488558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.75851686290008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.031237552095206, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681193, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460925514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624197, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.894291083664882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.582920553113979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164759, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035270776, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525052554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.18024104249116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748757328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359801, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.83054839867026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931774438, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367003217, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.530768173702654, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.286378686309831, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.3140753529508515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.31670920621434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433926, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.974430940369984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999607, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.033368174406121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.886058438367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537678, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.799344795237516, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.041363864381651, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180530235, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.432108460534664, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.30086973823245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391499477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026383202, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477345, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247107376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.90150934281246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529460192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.003687369676925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.37521986551968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808371, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323622, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845518905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.373219525581476, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734781, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.26387753106695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237787046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033824, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.114195497361095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.6513633556779723, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68667788285592, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.2438342357504, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956910566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646612, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.29361132859998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.087383658779345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049989406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696185, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.820289920370556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588520867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712225355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.08627433457974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246020054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691248635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7676588013805, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001034069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.940154816325503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446483, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.90964282745455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986612731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896144, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663785526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0636078149956, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.744922739010008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.952810605657078, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223033548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031401, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612557, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573968924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372121, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811708, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804039526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250839758, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.980627259560833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378213, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.477245571726257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.336426755023524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.5938239999666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117041659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762066405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.124968662388824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783006, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.900063742154032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742117216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.3758180662279074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.351103929002534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265297204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228017619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.8006178032281355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112130058, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1566381078772, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.304614439634463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.2381236777780487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484376741, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33867736091129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.24521783497416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.33353996675463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.17535391574476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.17558936557836, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.82464445421311, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.14823158528606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.02303868942406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.0898265784532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.0375220132344, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.69877148351581, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.8094147843381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.88896279741591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.58446195759505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.94461858556683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.86726342876044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.264261049502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.97378019208324, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43666090180685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.64557703864863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.41486055220747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.62832834535065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.40627623062987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.9966907903866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.62784889129782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.91665393395704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.20129913778622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.36824311350031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.44539780996692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.29577808855632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60087912978423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67646038571121, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17445140133515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.07045121918839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.49723620471183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.5174230546468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5413500261472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.47975770399327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.29423417091141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.27541464305773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43920860251751, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.06079463387583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.37828233356667, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.30210368322795, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.8891828858322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.6817301819728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.39002953943762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.68517685658658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.65084298157255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.93501858046714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.1907166501479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25659603867345, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36428253311259, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01156809266551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31879308123833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.40136182036203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17903686528695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0619221034904, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25968317752123, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.56379928977212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.80666495491704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.94182055020374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.92425119368045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.78971486194605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.23057477534164, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.4049348801832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.24159987362269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.06843389735158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.22183940097844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.93299182979392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.91637693821662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.20188970935105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.57826653579693, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.48615354430639, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.48852996658736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.70097560384337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.56660104606993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.60339517911308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5215727488348, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.3913600319206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.66423065390151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.49406633741951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.64849065100934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.63323070552582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.88914932519062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.96225788336264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.21454142458283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.08973549159177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.91131718633395, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.95365272243404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3677264483084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.38542382708798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.727355594576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.80184598433505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.75895482632265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.65309620079978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.18275486854981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.08066364611346, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86355002974182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8079829991331, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50774498473834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.15500147527054, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25388112126257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.46869004462158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.49982930970904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.64941137818613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08181708620197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.89782993828217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.34821493675021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0511570084608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36636841676064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.22802936588096, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.13124547885464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.97034570188329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84675502390373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82877025439984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83150510044737, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80556016637114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.10675350799055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.84453919660923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.88147160830762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.95771616416846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.25900520967262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.28214715432236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.64410132782972, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.78845498147822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96240900085823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01654413042846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08257869239384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.92270971634117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.9249177043285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5475977762062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85856446370276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.8876461806366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.75554506700362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.4712342394787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.13596092844963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.29084433077668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.50946620110103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42209873300993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16470383307056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.10251353436806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16007736983093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25346405776058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.02466944517249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.03234873384025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11031617256702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.14530663460309, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.4442900442657, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39955675926143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19954612220634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.33374471974878, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.17850638089598, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31970147221125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.19274532121113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.3840327772038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.48120231354616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.7121932598933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86988580253298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.76604202197464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.79597689506201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42129188541651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.67647877199742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82191220927734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84470059887572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.72847566121298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43094423441607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39808368032986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31641481415083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.40267706340073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.60680412325432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.51452016846274, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.31471449163298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.43834781075664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84446638005844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.49607372712997, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85869892480143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87107213537678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.83017137699973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.73075043509533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85446221431528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.13025477242799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.08577867542596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.20567187514531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.27862593574773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.19411735771268, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.916410701528, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.80020190906805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.03429888110497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.99059510104857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.12230359240208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.21493112615859, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.7362497471537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.90953724611552, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.99997604721491, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.25158859302469, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98246224229298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.18380160087476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.54700954481861, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.87858935796136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.82466366840129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.79031352535364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.52782616930364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.71180131795903, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.66862984653359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.94388954493733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.40172293508901, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.27308992706585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30251070708916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.36341600243385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.07297082017436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.63576619816114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.36545808934646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.425342939227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.59476724765915, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.41575843731752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.30499551372479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.2943417590765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.20190364871404, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.35429934455371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.25575482738782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.30124986928953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.90191386326036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.96508444596826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.75989432781597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.47851546822666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.43273982617148, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.78073270556935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.29707161405977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.17141051171173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.83897503233364, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.92050920813638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.39298906893524, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.24960092613485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.15249367428707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.11254847884746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.6477102979142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.66187174327492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.22816086359947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.18924739108921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.15833017318171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.35388264537053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.30391448349607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1765702619787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.03923857682982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.14087662618776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.60285889768487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.71610220194758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.43129513858887, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.7750138677335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.5417619126041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.26004415392279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.48237494714664, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.58658168452075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.75620116852377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.69650084660127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.92028780826493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.62951533581877, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.58269597074072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.65987379372794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.66612454309691, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.8169746660663, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.5926039176473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28582192646724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.47874410921285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.57232514477201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.07482838670386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.06329982176626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.939646337063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.02294071169972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.73925579999096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.99566659891293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.99166395939717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.91107729961162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.35440315345551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.19457800884426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87539474258334, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.03831344319956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.84933568810729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.942984467456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28778584744732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02443267142746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94057536205155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72906200441219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.38445225202611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38197492987447, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18213638354725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04715001455901, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19838818284391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29725636974986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.23572569098852, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3432106471416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46834681822006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.39304905252162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4607924127623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.87391242777782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81782457593818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74839547168068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.9804659897062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.1820620687209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53780103937676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35114383691389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19430169329608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0736265695374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.56101740773187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02847405275406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02877565620591, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02966575553104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71076966315076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5342590029927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87172892779671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8898807030855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7509399436349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70594283596789, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83044892913243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71383587412238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52870331564132, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.68221846843574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68293629394864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76185935158753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77694161620539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94666597863043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09046839544105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0093802192737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.78182814117551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75541337031265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72371690451082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60849664049482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94340121095276, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.85028148090369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7183641880944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93201467581261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6600503714477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71003338575711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64414870400898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73370138654631, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.51475031329109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60797476194675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42059367470232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66628705381636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53531464201514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2030497935449, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62268440600192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91948342162647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.67919849510083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43887673234494, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.17984056111294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.94368190633774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.11465699863811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97059505880482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29459604644765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53931157007439, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49631090115352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52393358151217, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66942128922241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.4946582273999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.29424834791328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07603918687664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.33479567014805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.14550463966849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9928646204638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96872153502625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87705988155102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.53452507075421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.56396146367423, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.59385740536969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64213975217385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78882758292927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.63683672368549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.48470633760584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39062489567554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.494696351115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93573503075692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.98885415853535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.06245234985892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.0289821017493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22900373831216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.3157346032948, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59973514861235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77086454804387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82096590563263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.95769963997635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.21106339352885, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07551182524406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09759300944572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33359941396125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2288848699624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2069451450579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46522997402728, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63157812424986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92215275507255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81904355011355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34536862719393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.4540782896955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65179701007457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58231165488735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59222373899847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41076247699506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.57987210255567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.93696117180936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88875391692817, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67494277755462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99358787892747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.07975990716614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07047992178705, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33559891886243, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59225467831386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.63479260217548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80334597318698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98346554786147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92321614880655, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83699346593512, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93109508241774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96354668527802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08641930356686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23768236549668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08211844013991, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20846159911048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.13954155854589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89054598561034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11646823351487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.10168176297485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30038009222437, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.41339845504724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10852951715277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84680988625497, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00138088356287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04342924144086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01673785551608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8508081374985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87089994615239, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9378403552245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05201413714099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0235397935625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26517251606933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15470785076896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4932600250258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.51252060274227, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53140073996916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90203063702091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26191114348926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0634456423351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43521818420996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38568536751181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21262216293847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.23411145607675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.82330133886903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61660062265747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71484163940588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72855192282307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3692642985158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37837200951205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19352686807355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.28024660066703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96384685743692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14877036790756, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09572264391801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53876217367774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.64617178108719, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.85422093876446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60924422208079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52724603055836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46494136842418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44406941275119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.32264147745168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0360221167863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01384655286363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97262653583181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.28024889847717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.96758302287454, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.25528568314509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.20092793334622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49508373939167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.73466658206335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46436704586412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69111891541637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21128313549013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37756823246967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04218716563325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00014735551822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.93318531635457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84116622880475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50637869144556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.66826656058106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36257300920573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60779676375832, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36220969555443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.1193839744838, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89096232869592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.75394086603562, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.10653141004636, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.98502552303084, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03115476672883, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05866288388766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.80506699745925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97004409317438, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39339911911829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28070286679336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74175784445059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6733758391721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81901224922302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84844274508458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.60313885279771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.41938832519848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.64052127057325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54200410559555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73590345101391, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.62782637305553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79185882856454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.8357946573913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79563500808236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.09144139124615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.91260250945975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.67552176869381, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.66062267455895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64149069106048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37359630109037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.51652219716766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.54575759654936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58821852619887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76782809841714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6119124553235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74629736846254, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61327551923173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.32896871135786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13780861275266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12507835931243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13114200203424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37230639398891, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.298526480022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14580661294434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.26371087049277, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.19265250778471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.34688434505053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.27944969864926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.00376526097061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.12691845430324, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13627424638673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.90552697963446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.86432013057937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.88314466139805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.85684478131836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8333575750649, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87580958070879, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87723690769735, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02118341969194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.14559411024791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1102070847533, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.03652679668627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.64848582455738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.5160908672533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67122680039915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.49638519206744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23851904732544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.12623758622358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.13616044249197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.97730849654188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.93950245741028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.92103698222829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.92708766921471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.318742774315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.23642124916759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.21999028274801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.22126197659611, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.84560909030802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.53569591871245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.0165686304024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91735297539282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2390830156373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.14925296519219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.22089116397768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.87029928541635, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89974631246403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.06863681183862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.57589026049908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.50862549547844, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62801821971621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.81567744205196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.33854066905738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.96569574948703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07274851876403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.95622489428452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.72051069276088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.55232295814028, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.40473126616526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.65640141611814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56665701011867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.46095751045398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.76022002087706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.81381751472117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23375682446748, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01190578025698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56046438309357, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6501420569037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.45985538510016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.32205823485288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.4213362857644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.3254460973393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.36326200776878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1350438366559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.53738507774712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.43902960493799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.28282897059066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.42427634098117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.65923583486823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60873415539405, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.39024714619487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66523349021156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.82876323237488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97466728886246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.89452843928451, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.67041116090726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.63870699300467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.60806866533521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.09022889967974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33132395141395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.1422566167072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02336448195068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.85171345155105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92826438920278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9967936460588, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02558962193989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.86654130293297, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1805076876075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.20590970247865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.04093233048125, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.94025278141096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.1695372755258, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.55006804279205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.74946747581956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.08829699168929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.17204398025235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82928257766983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.80555288724541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03756487304749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.92246232242579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.12455329081938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.03614640032846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43863634543025, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57880144701099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5662997648947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63602712862732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99359531127284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20326657631179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.36371229951278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15013947578183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.39786147444195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32525340472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1699951830038, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94415449917722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06237685823791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88599230986543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09341138541605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29146577709628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.45209900958335, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.38892182999521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42662435004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86711355565461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.43026737045712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68555551249223, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.34275603824345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26115762602807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.81665975574816, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69084237577945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.80375023000443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71118042427594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.46412500503037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.6314533607136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6742741594175, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69072074935896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.12667461230008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99949417466048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.92543412582965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.72977842157017, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5701038761525, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.59977663872266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2927331361965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40263092608106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28632878234235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.53250654562353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49417223286694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21737477440588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21700275153675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.24257812297434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.33447437173405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36500808099656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62192540785213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.95467067184597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32280422773096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.27797141913928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.85159096418194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.9332147424965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.87171080557967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.72359330386428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.38266657654837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28429001378173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01211175536163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.84310882657518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.59049236660378, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.35514007446828, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9357580237877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05072699188574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00889117962727, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.18219892584725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.96556912199465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87607469195584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60138099475903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55643441032785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88066522817982, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.67510822228188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69837663925773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91860336977558, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.70107216756422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66971331829183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87708149049162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72163687944706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.94898877051006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.95474043698636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6415881902333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.34129447656329, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9434543592522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60307524718807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.18983136258927, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07720168711411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00591795170635, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.73390898252362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87915537734213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05356230153482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.19249105693204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35715717263174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92376356586935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8642597181964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.08761417167571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3787010770275, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.22887351223902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.18791972112416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71839956451682, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.72871333258459, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71285525012034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.95484908903208, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09252551101909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19565426763862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34851063541004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36918149511725, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.29871325433136, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43191348926673, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54163438380152, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70996022231523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.44351635290319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3607156455027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.25194927165909, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.09482587993352, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.05964578316673, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1247824238807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60195304694001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5077083162264, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32915625849455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41904859018952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86240170807343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74311994285968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92758592270172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.91004727072426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.90746519420465, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.16764239198312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.44892482562022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.29820349772235, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29660996193417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34630077913107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28533190136021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.32163037675376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.20619082469412, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94806731557186, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.5296456958934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2046797163239, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32570812965447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27835226241817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18052001757422, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21374473155299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13943605219035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26046795573633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21960702536101, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64774686400108, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31556350692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.46149005259649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.52377288657563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.23839203319807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6963758650249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70207115016164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1906639429263, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35726613372299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1634420410312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2066382813918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0471045722787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82199720210754, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8989666578373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.77857374465485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.70919453056075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.74465000028516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60934516564298, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96618622577306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78501792806425, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76326607151933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62556378625803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65556548612001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68684981308908, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58597625405771, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86536967969084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.75020367672924, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75062990936559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98349381034318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04847278769076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06193871613516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.60529611931622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60807864200518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90198815097345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84425841280351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66689924421028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.6348345250126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74311085652141, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.87596365908365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.15467982049428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06917346679761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16088604193162, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1767131466551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59084973064017, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3728256379574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.83907971020484, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05336598759212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15556945611712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.11170249260897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26806948858284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.19864576006458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02469106007196, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.37555658552148, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.4719110379968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46329135212792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.72605970139526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42143976779836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5510290269881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42138738037778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.49725923626676, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.83017838441384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.96394971087318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80946954515628, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.05895494780962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7764741456602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.82916340306784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.49615933800648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53903204926397, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.2199238563033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.15553425915469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3233546324033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29143609072966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34909878462929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79549173605427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.86012460829116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62257045149929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.36740770267758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1123342756572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.28815691102787, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.89234388227695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64456440149245, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.62943347351336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64788638508941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1774162868962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.00402666791075, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.04453321057154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96838361247781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88321586599363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.90884833929827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7179718780841, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74821494678119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9038655497103, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83750554707963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88584036004717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9446210717662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.10339943212905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.0848941093554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.14949796034026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8874166822761, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75795965886634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82124488293752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.65346951457661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61396660096294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54800539421142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.46513172439276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04018712803396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2845186523261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80052936345987, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.65349927893294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93158855841354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.79425107834362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.55284494377143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33529354683158, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67881964988702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76309874382866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.06380422690371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34837478850592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.28272356925105, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08986442511201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.19668777653186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9155347262711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86963033561574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02605497205086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07735953777274, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92691564488518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.63814938665311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6176086632684, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71204578933798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41015509320589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42767992948878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23852235526199, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49442961672796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43422929731483, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.28736530415493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.12218377264868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10919349920911, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97579394436632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87630575654731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64709318534976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49382854321888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15699292788067, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.04266303105983, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9313781112256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.69530603069572, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.82075180753827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.00003866180036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.769068469798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62148930928706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0232146586156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.05026787864644, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.7648966725291, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45047976504434, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.57906184617835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.73227416508321, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.39276167792192, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43027834183452, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.72614964359053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22140030401876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.40388767907393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6481057355818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.68848188004498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71473698288804, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70268409440689, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.43854075921617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44140071332018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74726961853332, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8365056762946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88893089201021, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26317095880032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37686063355893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.01130398358468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92441725059159, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89449208176279, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93827683979755, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6532995649937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.4263959037515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.75213347979019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.0270700566813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.76146992741955, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10225140410179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.81690399898379, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0438108934807, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.80207795946215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.12592905184013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15713134695487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21575520670791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31507102860735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2320901589937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.15393731859652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07037591089997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3198194947649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69216760463115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.07388089953058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.64149353573187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71271228263036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.11471503048601, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98751858071931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.7067835294734, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.74844014533139, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.02489656616589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98294992874101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.71598064705562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90144093756582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88369269337046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99127786199946, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.25279588129149, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98339215080473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84625570624047, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.50594333071952, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.50759103681195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.60423833142119, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.58324904624199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.89219195707862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.65911048978346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.7149396953146, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.87432845164757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.68840177129488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.93449198055023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.32948554144308, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.32849848634218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.22062659109166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.95224360650606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.11404601693097, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79369852289173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.57121837540416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.70539792020504, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.81536726931864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.66590107949516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.54759559550845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11939973938362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21880305870137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.79422563292844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71312689925841, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46426831854224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.10239283352094, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.37028780606191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.13498012432488, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.38863630293943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41150008980253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.14488289984781, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17802365337732, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27104619189048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.98787909982833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11321145433928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.23295576374296, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.85697546574279, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7517321560528, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50551757491745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.62546167858358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86332633060258, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.76299264885851, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78913797285577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.00024160373006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9168412948554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7772709282975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99344762670124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45458704231757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.40001356367094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97082046191717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01206001173375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.08005345968613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.22217203577799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2425856744218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.46073627278375, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.58143591458905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95177802714637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.56745694254103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.81253269752307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.86554139490539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90464875740813, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96373746132312, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09789228558353, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19003786584736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66999752477344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45706703230238, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2209401021726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26995519560073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.23034844043512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.41387280572972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.33303611955198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.52307299324875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.67190914597171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29815694731651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.11959184333037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.78483612314953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92001295323621, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94709162208174, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06260774305197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.1459174166961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06618787236135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61303967582782, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.941078352886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.01481054814181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92069860353018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.87432907187284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88014313205952, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.43750435674885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.46298718335747, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.92373570713617, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93253015033825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.89138819536463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6779918521803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.51002812881958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.285974590119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32248822367578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35524577583958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73566009456992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.6866778828559, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.84911622521342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68254626297609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.53753290340698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.40541279646611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.71834890975212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.75716070422646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82803454081426, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73900139072163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58423325500644, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16188235681071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.02650792631081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.00049424696184, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.27869714616556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.18595899862997, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03056917274476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.6959315804981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.29325844026822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24617524245163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27923511016385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24377176084563, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.84290901749984, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.45792359801233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61079046047253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59272403631071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.6658144632232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76765880138052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.83153611139085, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47875371686978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54124524065837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.99233076398606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9529292158228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9845811375129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0553452779518, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.96933895446485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33843538273938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.7587929540311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.61541170919818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.48109292079488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.584127260661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73326548896145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63121700232358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06360781499562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8561585876055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92284538933916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11237349539573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07021236134935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.17184698357968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.31228518791787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.33590023205818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50027778498863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.54209415864854, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3677893725537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.22925202091126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.09309676612556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15732000186526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.68995738997093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28297081793372, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.49225030811706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.33431283007668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00621404043055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92641929792215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.07027528339762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13008155599323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.00907183642319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.23094904986101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.2825480931582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91271666538603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05360990148436, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28838235720163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.79116186423771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.76779759668747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66567440561238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70161264561204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.83214429583118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.77606667466077, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.66108486881463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.66515259357669, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.16857543076497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.40982511738886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.06344300783007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.82444237040852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.59077974741996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.57824858967784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.18599707786814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.23587599762591, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.52520755360774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.53896573427002, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.32372356389571, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.39723460318574, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.42867761884308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.41468909557778, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37521291073797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.28061929510595, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.37421531457154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.42880794685172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.10075544827296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.08909178471053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.9283105563295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97631673436179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.83969795208085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.97701708069182, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.24948915106788, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.31081866218918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.15663810787721, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.05359196348086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.89974340615646, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.86736216937868, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.02917974715604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.10061155400963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.71230009060692, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.55956047576315, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-04T00:00:00" + } + ], + "final_value": 99082.81840069593, + "framework": "ml4t.backtest", + "num_trades": 600, + "total_pnl": -917.1815993040655, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33867736091129, + "entry_time": "2020-01-02T00:00:00", + "exit_price": 100.24521783497416, + "exit_reason": "signal", + "exit_time": "2020-01-03T00:00:00", + "pnl": -9.345952593714173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.33353996675463, + "entry_time": "2020-01-05T00:00:00", + "exit_price": 100.17535391574476, + "exit_reason": "signal", + "exit_time": "2020-01-06T00:00:00", + "pnl": -15.818605100987043, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.17558936557836, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 99.82464445421311, + "exit_reason": "signal", + "exit_time": "2020-01-09T00:00:00", + "pnl": -35.094491136524084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.14823158528606, + "entry_time": "2020-01-11T00:00:00", + "exit_price": 100.02303868942406, + "exit_reason": "signal", + "exit_time": "2020-01-12T00:00:00", + "pnl": -12.519289586200102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.0898265784532, + "entry_time": "2020-01-14T00:00:00", + "exit_price": 100.0375220132344, + "exit_reason": "signal", + "exit_time": "2020-01-15T00:00:00", + "pnl": -5.2304565218801145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.69877148351581, + "entry_time": "2020-01-17T00:00:00", + "exit_price": 99.8094147843381, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": 11.06433008222848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.88896279741591, + "entry_time": "2020-01-20T00:00:00", + "exit_price": 99.58446195759505, + "exit_reason": "signal", + "exit_time": "2020-01-21T00:00:00", + "pnl": -30.450083982086653, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.94461858556683, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 99.86726342876044, + "exit_reason": "signal", + "exit_time": "2020-01-24T00:00:00", + "pnl": -7.735515680638855, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.264261049502, + "entry_time": "2020-01-26T00:00:00", + "exit_price": 99.97378019208324, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": -29.048085741877003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43666090180685, + "entry_time": "2020-01-29T00:00:00", + "exit_price": 99.64557703864863, + "exit_reason": "signal", + "exit_time": "2020-01-30T00:00:00", + "pnl": 20.891613684178083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.41486055220747, + "entry_time": "2020-02-01T00:00:00", + "exit_price": 99.62832834535065, + "exit_reason": "signal", + "exit_time": "2020-02-02T00:00:00", + "pnl": 21.346779314319065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.40627623062987, + "entry_time": "2020-02-04T00:00:00", + "exit_price": 98.9966907903866, + "exit_reason": "signal", + "exit_time": "2020-02-05T00:00:00", + "pnl": -40.95854402432633, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.62784889129782, + "entry_time": "2020-02-07T00:00:00", + "exit_price": 98.91665393395704, + "exit_reason": "signal", + "exit_time": "2020-02-08T00:00:00", + "pnl": 28.880504265922355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20129913778622, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 99.36824311350031, + "exit_reason": "signal", + "exit_time": "2020-02-11T00:00:00", + "pnl": 16.694397571409354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.44539780996692, + "entry_time": "2020-02-13T00:00:00", + "exit_price": 99.29577808855632, + "exit_reason": "signal", + "exit_time": "2020-02-14T00:00:00", + "pnl": -14.96197214105996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60087912978423, + "entry_time": "2020-02-16T00:00:00", + "exit_price": 98.67646038571121, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": 7.558125592699071, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17445140133515, + "entry_time": "2020-02-19T00:00:00", + "exit_price": 99.07045121918839, + "exit_reason": "signal", + "exit_time": "2020-02-20T00:00:00", + "pnl": -10.400018214677402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.49723620471183, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 99.5174230546468, + "exit_reason": "signal", + "exit_time": "2020-02-23T00:00:00", + "pnl": 2.0186849934980273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5413500261472, + "entry_time": "2020-02-25T00:00:00", + "exit_price": 99.47975770399327, + "exit_reason": "signal", + "exit_time": "2020-02-26T00:00:00", + "pnl": -6.159232215391967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.29423417091141, + "entry_time": "2020-02-28T00:00:00", + "exit_price": 99.27541464305773, + "exit_reason": "signal", + "exit_time": "2020-02-29T00:00:00", + "pnl": -1.8819527853665932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43920860251751, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.06079463387583, + "exit_reason": "signal", + "exit_time": "2020-03-03T00:00:00", + "pnl": -37.84139686416711, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.37828233356667, + "entry_time": "2020-03-05T00:00:00", + "exit_price": 99.30210368322795, + "exit_reason": "signal", + "exit_time": "2020-03-06T00:00:00", + "pnl": -7.617865033871567, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.8891828858322, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 98.6817301819728, + "exit_reason": "signal", + "exit_time": "2020-03-09T00:00:00", + "pnl": -20.745270385939875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.39002953943762, + "entry_time": "2020-03-11T00:00:00", + "exit_price": 98.68517685658658, + "exit_reason": "signal", + "exit_time": "2020-03-12T00:00:00", + "pnl": 29.514731714896698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.65084298157255, + "entry_time": "2020-03-14T00:00:00", + "exit_price": 98.93501858046714, + "exit_reason": "signal", + "exit_time": "2020-03-15T00:00:00", + "pnl": 28.41755988945988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.1907166501479, + "entry_time": "2020-03-17T00:00:00", + "exit_price": 99.25659603867345, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 6.587938852555453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36428253311259, + "entry_time": "2020-03-20T00:00:00", + "exit_price": 99.01156809266551, + "exit_reason": "signal", + "exit_time": "2020-03-21T00:00:00", + "pnl": -35.271444044707096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31879308123833, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.40136182036203, + "exit_reason": "signal", + "exit_time": "2020-03-24T00:00:00", + "pnl": 8.256873912370793, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17903686528695, + "entry_time": "2020-03-26T00:00:00", + "exit_price": 99.0619221034904, + "exit_reason": "signal", + "exit_time": "2020-03-27T00:00:00", + "pnl": -11.71147617965471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25968317752123, + "entry_time": "2020-03-29T00:00:00", + "exit_price": 99.56379928977212, + "exit_reason": "signal", + "exit_time": "2020-03-30T00:00:00", + "pnl": 30.411611225090383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.80666495491704, + "entry_time": "2020-04-01T00:00:00", + "exit_price": 99.94182055020374, + "exit_reason": "signal", + "exit_time": "2020-04-02T00:00:00", + "pnl": 13.515559528670565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.92425119368045, + "entry_time": "2020-04-04T00:00:00", + "exit_price": 99.78971486194605, + "exit_reason": "signal", + "exit_time": "2020-04-05T00:00:00", + "pnl": -13.453633173439812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.23057477534164, + "entry_time": "2020-04-07T00:00:00", + "exit_price": 100.4049348801832, + "exit_reason": "signal", + "exit_time": "2020-04-08T00:00:00", + "pnl": 17.436010484158032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.24159987362269, + "entry_time": "2020-04-10T00:00:00", + "exit_price": 100.06843389735158, + "exit_reason": "signal", + "exit_time": "2020-04-11T00:00:00", + "pnl": -17.31659762711024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.22183940097844, + "entry_time": "2020-04-13T00:00:00", + "exit_price": 99.93299182979392, + "exit_reason": "signal", + "exit_time": "2020-04-14T00:00:00", + "pnl": -28.8847571184524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91637693821662, + "entry_time": "2020-04-16T00:00:00", + "exit_price": 100.20188970935105, + "exit_reason": "signal", + "exit_time": "2020-04-17T00:00:00", + "pnl": 28.551277113443575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.57826653579693, + "entry_time": "2020-04-19T00:00:00", + "exit_price": 100.48615354430639, + "exit_reason": "signal", + "exit_time": "2020-04-20T00:00:00", + "pnl": -9.211299149052138, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.48852996658736, + "entry_time": "2020-04-22T00:00:00", + "exit_price": 100.70097560384337, + "exit_reason": "signal", + "exit_time": "2020-04-23T00:00:00", + "pnl": 21.244563725602347, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.56660104606993, + "entry_time": "2020-04-25T00:00:00", + "exit_price": 100.60339517911308, + "exit_reason": "signal", + "exit_time": "2020-04-26T00:00:00", + "pnl": 3.6794133043149486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5215727488348, + "entry_time": "2020-04-28T00:00:00", + "exit_price": 100.3913600319206, + "exit_reason": "signal", + "exit_time": "2020-04-29T00:00:00", + "pnl": -13.021271691421134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.66423065390151, + "entry_time": "2020-05-01T00:00:00", + "exit_price": 100.49406633741951, + "exit_reason": "signal", + "exit_time": "2020-05-02T00:00:00", + "pnl": -17.016431648198704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64849065100934, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.63323070552582, + "exit_reason": "signal", + "exit_time": "2020-05-05T00:00:00", + "pnl": -1.5259945483521733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88914932519062, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 100.96225788336264, + "exit_reason": "signal", + "exit_time": "2020-05-08T00:00:00", + "pnl": 7.310855817202537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.21454142458283, + "entry_time": "2020-05-10T00:00:00", + "exit_price": 101.08973549159177, + "exit_reason": "signal", + "exit_time": "2020-05-11T00:00:00", + "pnl": -12.480593299107568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.91131718633395, + "entry_time": "2020-05-13T00:00:00", + "exit_price": 100.95365272243404, + "exit_reason": "signal", + "exit_time": "2020-05-14T00:00:00", + "pnl": 4.233553610009039, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3677264483084, + "entry_time": "2020-05-16T00:00:00", + "exit_price": 100.38542382708798, + "exit_reason": "signal", + "exit_time": "2020-05-17T00:00:00", + "pnl": 1.7697378779575956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.727355594576, + "entry_time": "2020-05-19T00:00:00", + "exit_price": 99.80184598433505, + "exit_reason": "signal", + "exit_time": "2020-05-20T00:00:00", + "pnl": 7.449038975904841, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.75895482632265, + "entry_time": "2020-05-22T00:00:00", + "exit_price": 99.65309620079978, + "exit_reason": "signal", + "exit_time": "2020-05-23T00:00:00", + "pnl": -10.585862552286926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.18275486854981, + "entry_time": "2020-05-25T00:00:00", + "exit_price": 99.08066364611346, + "exit_reason": "signal", + "exit_time": "2020-05-26T00:00:00", + "pnl": -10.209122243633828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86355002974182, + "entry_time": "2020-05-28T00:00:00", + "exit_price": 98.8079829991331, + "exit_reason": "signal", + "exit_time": "2020-05-29T00:00:00", + "pnl": -5.556703060870859, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50774498473834, + "entry_time": "2020-05-31T00:00:00", + "exit_price": 98.15500147527054, + "exit_reason": "signal", + "exit_time": "2020-06-01T00:00:00", + "pnl": -35.27435094678003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25388112126257, + "entry_time": "2020-06-03T00:00:00", + "exit_price": 98.46869004462158, + "exit_reason": "signal", + "exit_time": "2020-06-04T00:00:00", + "pnl": 21.480892335901444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.49982930970904, + "entry_time": "2020-06-06T00:00:00", + "exit_price": 98.64941137818613, + "exit_reason": "signal", + "exit_time": "2020-06-07T00:00:00", + "pnl": 14.958206847708425, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08181708620197, + "entry_time": "2020-06-09T00:00:00", + "exit_price": 98.89782993828217, + "exit_reason": "signal", + "exit_time": "2020-06-10T00:00:00", + "pnl": -18.398714791979728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.34821493675021, + "entry_time": "2020-06-12T00:00:00", + "exit_price": 99.0511570084608, + "exit_reason": "signal", + "exit_time": "2020-06-13T00:00:00", + "pnl": -29.705792828939593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36636841676064, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 99.22802936588096, + "exit_reason": "signal", + "exit_time": "2020-06-16T00:00:00", + "pnl": -13.83390508796765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.13124547885464, + "entry_time": "2020-06-18T00:00:00", + "exit_price": 98.97034570188329, + "exit_reason": "signal", + "exit_time": "2020-06-19T00:00:00", + "pnl": -16.0899776971346, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84675502390373, + "entry_time": "2020-06-21T00:00:00", + "exit_price": 98.82877025439984, + "exit_reason": "signal", + "exit_time": "2020-06-22T00:00:00", + "pnl": -1.7984769503891584, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83150510044737, + "entry_time": "2020-06-24T00:00:00", + "exit_price": 98.80556016637114, + "exit_reason": "signal", + "exit_time": "2020-06-25T00:00:00", + "pnl": -2.594493407623304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.10675350799055, + "entry_time": "2020-06-27T00:00:00", + "exit_price": 98.84453919660923, + "exit_reason": "signal", + "exit_time": "2020-06-28T00:00:00", + "pnl": -26.221431138130356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88147160830762, + "entry_time": "2020-06-30T00:00:00", + "exit_price": 98.95771616416846, + "exit_reason": "signal", + "exit_time": "2020-07-01T00:00:00", + "pnl": 7.624455586083059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.25900520967262, + "entry_time": "2020-07-03T00:00:00", + "exit_price": 99.28214715432236, + "exit_reason": "signal", + "exit_time": "2020-07-04T00:00:00", + "pnl": 2.314194464974207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.64410132782972, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 98.78845498147822, + "exit_reason": "signal", + "exit_time": "2020-07-07T00:00:00", + "pnl": 14.43536536485044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96240900085823, + "entry_time": "2020-07-09T00:00:00", + "exit_price": 99.01654413042846, + "exit_reason": "signal", + "exit_time": "2020-07-10T00:00:00", + "pnl": 5.413512957024068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08257869239384, + "entry_time": "2020-07-12T00:00:00", + "exit_price": 98.92270971634117, + "exit_reason": "signal", + "exit_time": "2020-07-13T00:00:00", + "pnl": -15.986897605265767, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9249177043285, + "entry_time": "2020-07-15T00:00:00", + "exit_price": 98.5475977762062, + "exit_reason": "signal", + "exit_time": "2020-07-16T00:00:00", + "pnl": -37.73199281222878, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85856446370276, + "entry_time": "2020-07-18T00:00:00", + "exit_price": 98.8876461806366, + "exit_reason": "signal", + "exit_time": "2020-07-19T00:00:00", + "pnl": 2.9081716933833377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.75554506700362, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 98.4712342394787, + "exit_reason": "signal", + "exit_time": "2020-07-22T00:00:00", + "pnl": -28.43108275249142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.13596092844963, + "entry_time": "2020-07-24T00:00:00", + "exit_price": 98.29084433077668, + "exit_reason": "signal", + "exit_time": "2020-07-25T00:00:00", + "pnl": 15.488340232703194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.50946620110103, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 98.42209873300993, + "exit_reason": "signal", + "exit_time": "2020-07-28T00:00:00", + "pnl": -8.736746809110628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16470383307056, + "entry_time": "2020-07-30T00:00:00", + "exit_price": 98.10251353436806, + "exit_reason": "signal", + "exit_time": "2020-07-31T00:00:00", + "pnl": -6.219029870249869, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16007736983093, + "entry_time": "2020-08-02T00:00:00", + "exit_price": 98.25346405776058, + "exit_reason": "signal", + "exit_time": "2020-08-03T00:00:00", + "pnl": 9.338668792965109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.02466944517249, + "entry_time": "2020-08-05T00:00:00", + "exit_price": 98.03234873384025, + "exit_reason": "signal", + "exit_time": "2020-08-06T00:00:00", + "pnl": 0.767928866775037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11031617256702, + "entry_time": "2020-08-08T00:00:00", + "exit_price": 98.14530663460309, + "exit_reason": "signal", + "exit_time": "2020-08-09T00:00:00", + "pnl": 3.499046203607577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.4442900442657, + "entry_time": "2020-08-11T00:00:00", + "exit_price": 98.39955675926143, + "exit_reason": "signal", + "exit_time": "2020-08-12T00:00:00", + "pnl": -4.4733285004258505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19954612220634, + "entry_time": "2020-08-14T00:00:00", + "exit_price": 98.33374471974878, + "exit_reason": "signal", + "exit_time": "2020-08-15T00:00:00", + "pnl": 13.41985975424359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.17850638089598, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.31970147221125, + "exit_reason": "signal", + "exit_time": "2020-08-18T00:00:00", + "pnl": 14.119509131527593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.19274532121113, + "entry_time": "2020-08-20T00:00:00", + "exit_price": 98.3840327772038, + "exit_reason": "signal", + "exit_time": "2020-08-21T00:00:00", + "pnl": 19.12874559926604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48120231354616, + "entry_time": "2020-08-23T00:00:00", + "exit_price": 98.7121932598933, + "exit_reason": "signal", + "exit_time": "2020-08-24T00:00:00", + "pnl": 23.099094634713765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86988580253298, + "entry_time": "2020-08-26T00:00:00", + "exit_price": 98.76604202197464, + "exit_reason": "signal", + "exit_time": "2020-08-27T00:00:00", + "pnl": -10.384378055832713, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.79597689506201, + "entry_time": "2020-08-29T00:00:00", + "exit_price": 98.42129188541651, + "exit_reason": "signal", + "exit_time": "2020-08-30T00:00:00", + "pnl": -37.46850096455091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67647877199742, + "entry_time": "2020-09-01T00:00:00", + "exit_price": 98.82191220927734, + "exit_reason": "signal", + "exit_time": "2020-09-02T00:00:00", + "pnl": 14.543343727991669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84470059887572, + "entry_time": "2020-09-04T00:00:00", + "exit_price": 98.72847566121298, + "exit_reason": "signal", + "exit_time": "2020-09-05T00:00:00", + "pnl": -11.622493766273692, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43094423441607, + "entry_time": "2020-09-07T00:00:00", + "exit_price": 98.39808368032986, + "exit_reason": "signal", + "exit_time": "2020-09-08T00:00:00", + "pnl": -3.2860554086219054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31641481415083, + "entry_time": "2020-09-10T00:00:00", + "exit_price": 98.40267706340073, + "exit_reason": "signal", + "exit_time": "2020-09-11T00:00:00", + "pnl": 8.62622492499031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.60680412325432, + "entry_time": "2020-09-13T00:00:00", + "exit_price": 98.51452016846274, + "exit_reason": "signal", + "exit_time": "2020-09-14T00:00:00", + "pnl": -9.22839547915828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.31471449163298, + "entry_time": "2020-09-16T00:00:00", + "exit_price": 98.43834781075664, + "exit_reason": "signal", + "exit_time": "2020-09-17T00:00:00", + "pnl": 12.363331912365538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84446638005844, + "entry_time": "2020-09-19T00:00:00", + "exit_price": 98.49607372712997, + "exit_reason": "signal", + "exit_time": "2020-09-20T00:00:00", + "pnl": -34.8392652928469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85869892480143, + "entry_time": "2020-09-22T00:00:00", + "exit_price": 98.87107213537678, + "exit_reason": "signal", + "exit_time": "2020-09-23T00:00:00", + "pnl": 1.237321057535155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.83017137699973, + "entry_time": "2020-09-25T00:00:00", + "exit_price": 98.73075043509533, + "exit_reason": "signal", + "exit_time": "2020-09-26T00:00:00", + "pnl": -9.942094190440912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85446221431528, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.13025477242799, + "exit_reason": "signal", + "exit_time": "2020-09-29T00:00:00", + "pnl": 27.57925581127165, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.08577867542596, + "entry_time": "2020-10-01T00:00:00", + "exit_price": 99.20567187514531, + "exit_reason": "signal", + "exit_time": "2020-10-02T00:00:00", + "pnl": 11.989319971935402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27862593574773, + "entry_time": "2020-10-04T00:00:00", + "exit_price": 99.19411735771268, + "exit_reason": "signal", + "exit_time": "2020-10-05T00:00:00", + "pnl": -8.450857803505642, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.916410701528, + "entry_time": "2020-10-07T00:00:00", + "exit_price": 98.80020190906805, + "exit_reason": "signal", + "exit_time": "2020-10-08T00:00:00", + "pnl": -11.620879245994729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.03429888110497, + "entry_time": "2020-10-10T00:00:00", + "exit_price": 97.99059510104857, + "exit_reason": "signal", + "exit_time": "2020-10-11T00:00:00", + "pnl": -4.370378005640305, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.12230359240208, + "entry_time": "2020-10-13T00:00:00", + "exit_price": 98.21493112615859, + "exit_reason": "signal", + "exit_time": "2020-10-14T00:00:00", + "pnl": 9.2627533756513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7362497471537, + "entry_time": "2020-10-16T00:00:00", + "exit_price": 97.90953724611552, + "exit_reason": "signal", + "exit_time": "2020-10-17T00:00:00", + "pnl": 17.328749896181762, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99997604721491, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.25158859302469, + "exit_reason": "signal", + "exit_time": "2020-10-20T00:00:00", + "pnl": 25.161254580978493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98246224229298, + "entry_time": "2020-10-22T00:00:00", + "exit_price": 98.18380160087476, + "exit_reason": "signal", + "exit_time": "2020-10-23T00:00:00", + "pnl": 20.13393585817721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.54700954481861, + "entry_time": "2020-10-25T00:00:00", + "exit_price": 98.87858935796136, + "exit_reason": "signal", + "exit_time": "2020-10-26T00:00:00", + "pnl": 33.157981314274366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.82466366840129, + "entry_time": "2020-10-28T00:00:00", + "exit_price": 98.79031352535364, + "exit_reason": "signal", + "exit_time": "2020-10-29T00:00:00", + "pnl": -3.435014304764991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.52782616930364, + "entry_time": "2020-10-31T00:00:00", + "exit_price": 98.71180131795903, + "exit_reason": "signal", + "exit_time": "2020-11-01T00:00:00", + "pnl": 18.39751486553905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.66862984653359, + "entry_time": "2020-11-03T00:00:00", + "exit_price": 98.94388954493733, + "exit_reason": "signal", + "exit_time": "2020-11-04T00:00:00", + "pnl": 27.525969840375183, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.40172293508901, + "entry_time": "2020-11-06T00:00:00", + "exit_price": 98.27308992706585, + "exit_reason": "signal", + "exit_time": "2020-11-07T00:00:00", + "pnl": -12.863300802317099, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30251070708916, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 98.36341600243385, + "exit_reason": "signal", + "exit_time": "2020-11-10T00:00:00", + "pnl": 6.090529534470988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07297082017436, + "entry_time": "2020-11-12T00:00:00", + "exit_price": 98.63576619816114, + "exit_reason": "signal", + "exit_time": "2020-11-13T00:00:00", + "pnl": 56.279537798676756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.36545808934646, + "entry_time": "2020-11-15T00:00:00", + "exit_price": 98.425342939227, + "exit_reason": "signal", + "exit_time": "2020-11-16T00:00:00", + "pnl": 5.988484988052733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.59476724765915, + "entry_time": "2020-11-18T00:00:00", + "exit_price": 98.41575843731752, + "exit_reason": "signal", + "exit_time": "2020-11-19T00:00:00", + "pnl": -17.900881034162012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.30499551372479, + "entry_time": "2020-11-21T00:00:00", + "exit_price": 98.2943417590765, + "exit_reason": "signal", + "exit_time": "2020-11-22T00:00:00", + "pnl": -1.0653754648283211, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.20190364871404, + "entry_time": "2020-11-24T00:00:00", + "exit_price": 98.35429934455371, + "exit_reason": "signal", + "exit_time": "2020-11-25T00:00:00", + "pnl": 15.23956958396775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.25575482738782, + "entry_time": "2020-11-27T00:00:00", + "exit_price": 98.30124986928953, + "exit_reason": "signal", + "exit_time": "2020-11-28T00:00:00", + "pnl": 4.54950419017041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.90191386326036, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.96508444596826, + "exit_reason": "signal", + "exit_time": "2020-12-01T00:00:00", + "pnl": 6.3170582707898575, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.75989432781597, + "entry_time": "2020-12-03T00:00:00", + "exit_price": 97.47851546822666, + "exit_reason": "signal", + "exit_time": "2020-12-04T00:00:00", + "pnl": -28.137885958929473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.43273982617148, + "entry_time": "2020-12-06T00:00:00", + "exit_price": 97.78073270556935, + "exit_reason": "signal", + "exit_time": "2020-12-07T00:00:00", + "pnl": 34.799287939786154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.29707161405977, + "entry_time": "2020-12-09T00:00:00", + "exit_price": 97.17141051171173, + "exit_reason": "signal", + "exit_time": "2020-12-10T00:00:00", + "pnl": -12.566110234804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.83897503233364, + "entry_time": "2020-12-12T00:00:00", + "exit_price": 96.92050920813638, + "exit_reason": "signal", + "exit_time": "2020-12-13T00:00:00", + "pnl": 8.153417580273526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.39298906893524, + "entry_time": "2020-12-15T00:00:00", + "exit_price": 97.24960092613485, + "exit_reason": "signal", + "exit_time": "2020-12-16T00:00:00", + "pnl": -14.338814280039514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.15249367428707, + "entry_time": "2020-12-18T00:00:00", + "exit_price": 98.11254847884746, + "exit_reason": "signal", + "exit_time": "2020-12-19T00:00:00", + "pnl": -3.99451954396136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6477102979142, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 97.66187174327492, + "exit_reason": "signal", + "exit_time": "2020-12-22T00:00:00", + "pnl": 1.4161445360714424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.22816086359947, + "entry_time": "2020-12-24T00:00:00", + "exit_price": 97.18924739108921, + "exit_reason": "signal", + "exit_time": "2020-12-25T00:00:00", + "pnl": -3.891347251026673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.15833017318171, + "entry_time": "2020-12-27T00:00:00", + "exit_price": 97.35388264537053, + "exit_reason": "signal", + "exit_time": "2020-12-28T00:00:00", + "pnl": 19.55524721888287, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30391448349607, + "entry_time": "2020-12-30T00:00:00", + "exit_price": 97.1765702619787, + "exit_reason": "signal", + "exit_time": "2020-12-31T00:00:00", + "pnl": -12.734422151735998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.03923857682982, + "entry_time": "2021-01-02T00:00:00", + "exit_price": 97.14087662618776, + "exit_reason": "signal", + "exit_time": "2021-01-03T00:00:00", + "pnl": 10.16380493579527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.60285889768487, + "entry_time": "2021-01-05T00:00:00", + "exit_price": 96.71610220194758, + "exit_reason": "signal", + "exit_time": "2021-01-06T00:00:00", + "pnl": 11.324330426270535, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.43129513858887, + "entry_time": "2021-01-08T00:00:00", + "exit_price": 96.7750138677335, + "exit_reason": "signal", + "exit_time": "2021-01-09T00:00:00", + "pnl": 34.37187291446389, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.5417619126041, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.26004415392279, + "exit_reason": "signal", + "exit_time": "2021-01-12T00:00:00", + "pnl": -28.17177586813159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.48237494714664, + "entry_time": "2021-01-14T00:00:00", + "exit_price": 96.58658168452075, + "exit_reason": "signal", + "exit_time": "2021-01-15T00:00:00", + "pnl": 10.420673737411562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.75620116852377, + "entry_time": "2021-01-17T00:00:00", + "exit_price": 96.69650084660127, + "exit_reason": "signal", + "exit_time": "2021-01-18T00:00:00", + "pnl": -5.970032192250073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.92028780826493, + "entry_time": "2021-01-20T00:00:00", + "exit_price": 95.62951533581877, + "exit_reason": "signal", + "exit_time": "2021-01-21T00:00:00", + "pnl": -29.077247244616956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.58269597074072, + "entry_time": "2021-01-23T00:00:00", + "exit_price": 95.65987379372794, + "exit_reason": "signal", + "exit_time": "2021-01-24T00:00:00", + "pnl": 7.71778229872325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.66612454309691, + "entry_time": "2021-01-26T00:00:00", + "exit_price": 95.8169746660663, + "exit_reason": "signal", + "exit_time": "2021-01-27T00:00:00", + "pnl": 15.085012296938658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5926039176473, + "entry_time": "2021-01-29T00:00:00", + "exit_price": 95.28582192646724, + "exit_reason": "signal", + "exit_time": "2021-01-30T00:00:00", + "pnl": -30.678199118006887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.47874410921285, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.57232514477201, + "exit_reason": "signal", + "exit_time": "2021-02-02T00:00:00", + "pnl": 9.358103555914568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.07482838670386, + "entry_time": "2021-02-04T00:00:00", + "exit_price": 96.06329982176626, + "exit_reason": "signal", + "exit_time": "2021-02-05T00:00:00", + "pnl": -1.1528564937580086, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.939646337063, + "entry_time": "2021-02-07T00:00:00", + "exit_price": 96.02294071169972, + "exit_reason": "signal", + "exit_time": "2021-02-08T00:00:00", + "pnl": 8.329437463671638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.73925579999096, + "entry_time": "2021-02-10T00:00:00", + "exit_price": 95.99566659891293, + "exit_reason": "signal", + "exit_time": "2021-02-11T00:00:00", + "pnl": 25.64107989219883, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.99166395939717, + "entry_time": "2021-02-13T00:00:00", + "exit_price": 95.91107729961162, + "exit_reason": "signal", + "exit_time": "2021-02-14T00:00:00", + "pnl": -8.058665978554927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.35440315345551, + "entry_time": "2021-02-16T00:00:00", + "exit_price": 96.19457800884426, + "exit_reason": "signal", + "exit_time": "2021-02-17T00:00:00", + "pnl": -15.982514461125902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87539474258334, + "entry_time": "2021-02-19T00:00:00", + "exit_price": 96.03831344319956, + "exit_reason": "signal", + "exit_time": "2021-02-20T00:00:00", + "pnl": 16.29187006162101, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.84933568810729, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.942984467456, + "exit_reason": "signal", + "exit_time": "2021-02-23T00:00:00", + "pnl": 9.364877934871402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28778584744732, + "entry_time": "2021-02-25T00:00:00", + "exit_price": 95.02443267142746, + "exit_reason": "signal", + "exit_time": "2021-02-26T00:00:00", + "pnl": -26.33531760198639, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94057536205155, + "entry_time": "2021-02-28T00:00:00", + "exit_price": 94.72906200441219, + "exit_reason": "signal", + "exit_time": "2021-03-01T00:00:00", + "pnl": -21.151335763936004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38445225202611, + "entry_time": "2021-03-03T00:00:00", + "exit_price": 94.38197492987447, + "exit_reason": "signal", + "exit_time": "2021-03-04T00:00:00", + "pnl": -0.247732215164433, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18213638354725, + "entry_time": "2021-03-06T00:00:00", + "exit_price": 94.04715001455901, + "exit_reason": "signal", + "exit_time": "2021-03-07T00:00:00", + "pnl": -13.498636898822951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19838818284391, + "entry_time": "2021-03-09T00:00:00", + "exit_price": 94.29725636974986, + "exit_reason": "signal", + "exit_time": "2021-03-10T00:00:00", + "pnl": 9.886818690594737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23572569098852, + "entry_time": "2021-03-12T00:00:00", + "exit_price": 94.3432106471416, + "exit_reason": "signal", + "exit_time": "2021-03-13T00:00:00", + "pnl": 10.748495615309366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46834681822006, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.39304905252162, + "exit_reason": "signal", + "exit_time": "2021-03-16T00:00:00", + "pnl": -7.529776569843307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4607924127623, + "entry_time": "2021-03-18T00:00:00", + "exit_price": 94.87391242777782, + "exit_reason": "signal", + "exit_time": "2021-03-19T00:00:00", + "pnl": 41.31200150155382, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81782457593818, + "entry_time": "2021-03-21T00:00:00", + "exit_price": 94.74839547168068, + "exit_reason": "signal", + "exit_time": "2021-03-22T00:00:00", + "pnl": -6.942910425748778, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9804659897062, + "entry_time": "2021-03-24T00:00:00", + "exit_price": 95.1820620687209, + "exit_reason": "signal", + "exit_time": "2021-03-25T00:00:00", + "pnl": 20.159607901468917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53780103937676, + "entry_time": "2021-03-27T00:00:00", + "exit_price": 94.35114383691389, + "exit_reason": "signal", + "exit_time": "2021-03-28T00:00:00", + "pnl": -18.665720246286583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19430169329608, + "entry_time": "2021-03-30T00:00:00", + "exit_price": 94.0736265695374, + "exit_reason": "signal", + "exit_time": "2021-03-31T00:00:00", + "pnl": -12.067512375868318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.56101740773187, + "entry_time": "2021-04-02T00:00:00", + "exit_price": 94.02847405275406, + "exit_reason": "signal", + "exit_time": "2021-04-03T00:00:00", + "pnl": -53.25433549778063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02877565620591, + "entry_time": "2021-04-05T00:00:00", + "exit_price": 94.02966575553104, + "exit_reason": "signal", + "exit_time": "2021-04-06T00:00:00", + "pnl": 0.08900993251336331, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71076966315076, + "entry_time": "2021-04-08T00:00:00", + "exit_price": 93.5342590029927, + "exit_reason": "signal", + "exit_time": "2021-04-09T00:00:00", + "pnl": -17.651066015805554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87172892779671, + "entry_time": "2021-04-11T00:00:00", + "exit_price": 93.8898807030855, + "exit_reason": "signal", + "exit_time": "2021-04-12T00:00:00", + "pnl": 1.8151775288788485, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7509399436349, + "entry_time": "2021-04-14T00:00:00", + "exit_price": 93.70594283596789, + "exit_reason": "signal", + "exit_time": "2021-04-15T00:00:00", + "pnl": -4.499710766702265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83044892913243, + "entry_time": "2021-04-17T00:00:00", + "exit_price": 93.71383587412238, + "exit_reason": "signal", + "exit_time": "2021-04-18T00:00:00", + "pnl": -11.6613055010057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52870331564132, + "entry_time": "2021-04-20T00:00:00", + "exit_price": 93.68221846843574, + "exit_reason": "signal", + "exit_time": "2021-04-21T00:00:00", + "pnl": 15.351515279440719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68293629394864, + "entry_time": "2021-04-23T00:00:00", + "exit_price": 93.76185935158753, + "exit_reason": "signal", + "exit_time": "2021-04-24T00:00:00", + "pnl": 7.892305763889453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77694161620539, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.94666597863043, + "exit_reason": "signal", + "exit_time": "2021-04-27T00:00:00", + "pnl": 16.972436242504045, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09046839544105, + "entry_time": "2021-04-29T00:00:00", + "exit_price": 94.0093802192737, + "exit_reason": "signal", + "exit_time": "2021-04-30T00:00:00", + "pnl": -8.108817616735905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.78182814117551, + "entry_time": "2021-05-02T00:00:00", + "exit_price": 93.75541337031265, + "exit_reason": "signal", + "exit_time": "2021-05-03T00:00:00", + "pnl": -2.6414770862847945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72371690451082, + "entry_time": "2021-05-05T00:00:00", + "exit_price": 93.60849664049482, + "exit_reason": "signal", + "exit_time": "2021-05-06T00:00:00", + "pnl": -11.52202640160067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94340121095276, + "entry_time": "2021-05-08T00:00:00", + "exit_price": 93.85028148090369, + "exit_reason": "signal", + "exit_time": "2021-05-09T00:00:00", + "pnl": -9.311973004907486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7183641880944, + "entry_time": "2021-05-11T00:00:00", + "exit_price": 93.93201467581261, + "exit_reason": "signal", + "exit_time": "2021-05-12T00:00:00", + "pnl": 21.36504877182051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6600503714477, + "entry_time": "2021-05-14T00:00:00", + "exit_price": 93.71003338575711, + "exit_reason": "signal", + "exit_time": "2021-05-15T00:00:00", + "pnl": 4.998301430941865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64414870400898, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 93.73370138654631, + "exit_reason": "signal", + "exit_time": "2021-05-18T00:00:00", + "pnl": 8.955268253732356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.51475031329109, + "entry_time": "2021-05-20T00:00:00", + "exit_price": 93.60797476194675, + "exit_reason": "signal", + "exit_time": "2021-05-21T00:00:00", + "pnl": 9.322444865565558, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42059367470232, + "entry_time": "2021-05-23T00:00:00", + "exit_price": 93.66628705381636, + "exit_reason": "signal", + "exit_time": "2021-05-24T00:00:00", + "pnl": 24.569337911403636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53531464201514, + "entry_time": "2021-05-26T00:00:00", + "exit_price": 93.2030497935449, + "exit_reason": "signal", + "exit_time": "2021-05-27T00:00:00", + "pnl": -33.22648484702404, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62268440600192, + "entry_time": "2021-05-29T00:00:00", + "exit_price": 92.91948342162647, + "exit_reason": "signal", + "exit_time": "2021-05-30T00:00:00", + "pnl": 29.67990156245469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67919849510083, + "entry_time": "2021-06-01T00:00:00", + "exit_price": 92.43887673234494, + "exit_reason": "signal", + "exit_time": "2021-06-02T00:00:00", + "pnl": -24.032176275588427, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.17984056111294, + "entry_time": "2021-06-04T00:00:00", + "exit_price": 91.94368190633774, + "exit_reason": "signal", + "exit_time": "2021-06-05T00:00:00", + "pnl": -23.615865477519037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.11465699863811, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.97059505880482, + "exit_reason": "signal", + "exit_time": "2021-06-08T00:00:00", + "pnl": -14.406193983330013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29459604644765, + "entry_time": "2021-06-10T00:00:00", + "exit_price": 92.53931157007439, + "exit_reason": "signal", + "exit_time": "2021-06-11T00:00:00", + "pnl": 24.47155236267281, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49631090115352, + "entry_time": "2021-06-13T00:00:00", + "exit_price": 92.52393358151217, + "exit_reason": "signal", + "exit_time": "2021-06-14T00:00:00", + "pnl": 2.762268035865418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66942128922241, + "entry_time": "2021-06-16T00:00:00", + "exit_price": 92.4946582273999, + "exit_reason": "signal", + "exit_time": "2021-06-17T00:00:00", + "pnl": -17.4763061822523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.29424834791328, + "entry_time": "2021-06-19T00:00:00", + "exit_price": 92.07603918687664, + "exit_reason": "signal", + "exit_time": "2021-06-20T00:00:00", + "pnl": -21.820916103664786, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.33479567014805, + "entry_time": "2021-06-22T00:00:00", + "exit_price": 92.14550463966849, + "exit_reason": "signal", + "exit_time": "2021-06-23T00:00:00", + "pnl": -18.929103047956232, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9928646204638, + "entry_time": "2021-06-25T00:00:00", + "exit_price": 91.96872153502625, + "exit_reason": "signal", + "exit_time": "2021-06-26T00:00:00", + "pnl": -2.4143085437553964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87705988155102, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.53452507075421, + "exit_reason": "signal", + "exit_time": "2021-06-29T00:00:00", + "pnl": -34.25348107968057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.56396146367423, + "entry_time": "2021-07-01T00:00:00", + "exit_price": 91.59385740536969, + "exit_reason": "signal", + "exit_time": "2021-07-02T00:00:00", + "pnl": 2.9895941695449437, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64213975217385, + "entry_time": "2021-07-04T00:00:00", + "exit_price": 91.78882758292927, + "exit_reason": "signal", + "exit_time": "2021-07-05T00:00:00", + "pnl": 14.668783075543615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63683672368549, + "entry_time": "2021-07-07T00:00:00", + "exit_price": 91.48470633760584, + "exit_reason": "signal", + "exit_time": "2021-07-08T00:00:00", + "pnl": -15.213038607964336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39062489567554, + "entry_time": "2021-07-10T00:00:00", + "exit_price": 91.494696351115, + "exit_reason": "signal", + "exit_time": "2021-07-11T00:00:00", + "pnl": 10.407145543946172, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93573503075692, + "entry_time": "2021-07-13T00:00:00", + "exit_price": 90.98885415853535, + "exit_reason": "signal", + "exit_time": "2021-07-14T00:00:00", + "pnl": 5.3119127778427355, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06245234985892, + "entry_time": "2021-07-16T00:00:00", + "exit_price": 91.0289821017493, + "exit_reason": "signal", + "exit_time": "2021-07-17T00:00:00", + "pnl": -3.3470248109606473, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22900373831216, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.3157346032948, + "exit_reason": "signal", + "exit_time": "2021-07-20T00:00:00", + "pnl": 8.673086498263729, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59973514861235, + "entry_time": "2021-07-22T00:00:00", + "exit_price": 91.77086454804387, + "exit_reason": "signal", + "exit_time": "2021-07-23T00:00:00", + "pnl": 17.112939943153833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82096590563263, + "entry_time": "2021-07-25T00:00:00", + "exit_price": 91.95769963997635, + "exit_reason": "signal", + "exit_time": "2021-07-26T00:00:00", + "pnl": 13.673373434372479, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.21106339352885, + "entry_time": "2021-07-28T00:00:00", + "exit_price": 92.07551182524406, + "exit_reason": "signal", + "exit_time": "2021-07-29T00:00:00", + "pnl": -13.555156828477266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09759300944572, + "entry_time": "2021-07-31T00:00:00", + "exit_price": 92.33359941396125, + "exit_reason": "signal", + "exit_time": "2021-08-01T00:00:00", + "pnl": 23.600640451553772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2288848699624, + "entry_time": "2021-08-03T00:00:00", + "exit_price": 92.2069451450579, + "exit_reason": "signal", + "exit_time": "2021-08-04T00:00:00", + "pnl": -2.193972490449596, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46522997402728, + "entry_time": "2021-08-06T00:00:00", + "exit_price": 92.63157812424986, + "exit_reason": "signal", + "exit_time": "2021-08-07T00:00:00", + "pnl": 16.634815022258408, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92215275507255, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 92.81904355011355, + "exit_reason": "signal", + "exit_time": "2021-08-10T00:00:00", + "pnl": -10.310920495900064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34536862719393, + "entry_time": "2021-08-12T00:00:00", + "exit_price": 93.4540782896955, + "exit_reason": "signal", + "exit_time": "2021-08-13T00:00:00", + "pnl": 10.870966250156926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65179701007457, + "entry_time": "2021-08-15T00:00:00", + "exit_price": 93.58231165488735, + "exit_reason": "signal", + "exit_time": "2021-08-16T00:00:00", + "pnl": -6.948535518722565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59222373899847, + "entry_time": "2021-08-18T00:00:00", + "exit_price": 93.41076247699506, + "exit_reason": "signal", + "exit_time": "2021-08-19T00:00:00", + "pnl": -18.146126200341314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57987210255567, + "entry_time": "2021-08-21T00:00:00", + "exit_price": 93.93696117180936, + "exit_reason": "signal", + "exit_time": "2021-08-22T00:00:00", + "pnl": 35.708906925368865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88875391692817, + "entry_time": "2021-08-24T00:00:00", + "exit_price": 93.67494277755462, + "exit_reason": "signal", + "exit_time": "2021-08-25T00:00:00", + "pnl": -21.381113937353803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99358787892747, + "entry_time": "2021-08-27T00:00:00", + "exit_price": 93.07975990716614, + "exit_reason": "signal", + "exit_time": "2021-08-28T00:00:00", + "pnl": 8.617202823867046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07047992178705, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.33559891886243, + "exit_reason": "signal", + "exit_time": "2021-08-31T00:00:00", + "pnl": 26.51189970753876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59225467831386, + "entry_time": "2021-09-02T00:00:00", + "exit_price": 93.63479260217548, + "exit_reason": "signal", + "exit_time": "2021-09-03T00:00:00", + "pnl": 4.2537923861618765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80334597318698, + "entry_time": "2021-09-05T00:00:00", + "exit_price": 93.98346554786147, + "exit_reason": "signal", + "exit_time": "2021-09-06T00:00:00", + "pnl": 18.011957467449975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92321614880655, + "entry_time": "2021-09-08T00:00:00", + "exit_price": 93.83699346593512, + "exit_reason": "signal", + "exit_time": "2021-09-09T00:00:00", + "pnl": -8.622268287143015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93109508241774, + "entry_time": "2021-09-11T00:00:00", + "exit_price": 93.96354668527802, + "exit_reason": "signal", + "exit_time": "2021-09-12T00:00:00", + "pnl": 3.245160286027385, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08641930356686, + "entry_time": "2021-09-14T00:00:00", + "exit_price": 94.23768236549668, + "exit_reason": "signal", + "exit_time": "2021-09-15T00:00:00", + "pnl": 15.126306192982156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08211844013991, + "entry_time": "2021-09-17T00:00:00", + "exit_price": 94.20846159911048, + "exit_reason": "signal", + "exit_time": "2021-09-18T00:00:00", + "pnl": 12.634315897057604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.13954155854589, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 93.89054598561034, + "exit_reason": "signal", + "exit_time": "2021-09-21T00:00:00", + "pnl": -24.89955729355279, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11646823351487, + "entry_time": "2021-09-23T00:00:00", + "exit_price": 94.10168176297485, + "exit_reason": "signal", + "exit_time": "2021-09-24T00:00:00", + "pnl": -1.4786470540020673, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30038009222437, + "entry_time": "2021-09-26T00:00:00", + "exit_price": 94.41339845504724, + "exit_reason": "signal", + "exit_time": "2021-09-27T00:00:00", + "pnl": 11.301836282287695, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10852951715277, + "entry_time": "2021-09-29T00:00:00", + "exit_price": 93.84680988625497, + "exit_reason": "signal", + "exit_time": "2021-09-30T00:00:00", + "pnl": -26.171963089780547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00138088356287, + "entry_time": "2021-10-02T00:00:00", + "exit_price": 94.04342924144086, + "exit_reason": "signal", + "exit_time": "2021-10-03T00:00:00", + "pnl": 4.204835787799311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01673785551608, + "entry_time": "2021-10-05T00:00:00", + "exit_price": 93.8508081374985, + "exit_reason": "signal", + "exit_time": "2021-10-06T00:00:00", + "pnl": -16.592971801757812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87089994615239, + "entry_time": "2021-10-08T00:00:00", + "exit_price": 93.9378403552245, + "exit_reason": "signal", + "exit_time": "2021-10-09T00:00:00", + "pnl": 6.694040907210365, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05201413714099, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.0235397935625, + "exit_reason": "signal", + "exit_time": "2021-10-12T00:00:00", + "pnl": -2.8474343578473054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26517251606933, + "entry_time": "2021-10-14T00:00:00", + "exit_price": 94.15470785076896, + "exit_reason": "signal", + "exit_time": "2021-10-15T00:00:00", + "pnl": -11.046466530036923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4932600250258, + "entry_time": "2021-10-17T00:00:00", + "exit_price": 94.51252060274227, + "exit_reason": "signal", + "exit_time": "2021-10-18T00:00:00", + "pnl": 1.9260577716468106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53140073996916, + "entry_time": "2021-10-20T00:00:00", + "exit_price": 94.90203063702091, + "exit_reason": "signal", + "exit_time": "2021-10-21T00:00:00", + "pnl": 37.062989705174914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26191114348926, + "entry_time": "2021-10-23T00:00:00", + "exit_price": 94.0634456423351, + "exit_reason": "signal", + "exit_time": "2021-10-24T00:00:00", + "pnl": -19.846550115415084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43521818420996, + "entry_time": "2021-10-26T00:00:00", + "exit_price": 94.38568536751181, + "exit_reason": "signal", + "exit_time": "2021-10-27T00:00:00", + "pnl": -4.953281669813805, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21262216293847, + "entry_time": "2021-10-29T00:00:00", + "exit_price": 94.23411145607675, + "exit_reason": "signal", + "exit_time": "2021-10-30T00:00:00", + "pnl": 2.148929313827466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82330133886903, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 93.61660062265747, + "exit_reason": "signal", + "exit_time": "2021-11-02T00:00:00", + "pnl": -20.67007162115442, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71484163940588, + "entry_time": "2021-11-04T00:00:00", + "exit_price": 93.72855192282307, + "exit_reason": "signal", + "exit_time": "2021-11-05T00:00:00", + "pnl": 1.3710283417203755, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3692642985158, + "entry_time": "2021-11-07T00:00:00", + "exit_price": 93.37837200951205, + "exit_reason": "signal", + "exit_time": "2021-11-08T00:00:00", + "pnl": 0.9107710996231617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19352686807355, + "entry_time": "2021-11-10T00:00:00", + "exit_price": 93.28024660066703, + "exit_reason": "signal", + "exit_time": "2021-11-11T00:00:00", + "pnl": 8.671973259348306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96384685743692, + "entry_time": "2021-11-13T00:00:00", + "exit_price": 93.14877036790756, + "exit_reason": "signal", + "exit_time": "2021-11-14T00:00:00", + "pnl": 18.492351047065313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09572264391801, + "entry_time": "2021-11-16T00:00:00", + "exit_price": 92.53876217367774, + "exit_reason": "signal", + "exit_time": "2021-11-17T00:00:00", + "pnl": -55.6960470240283, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.64617178108719, + "entry_time": "2021-11-19T00:00:00", + "exit_price": 92.85422093876446, + "exit_reason": "signal", + "exit_time": "2021-11-20T00:00:00", + "pnl": 20.804915767725106, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60924422208079, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 92.52724603055836, + "exit_reason": "signal", + "exit_time": "2021-11-23T00:00:00", + "pnl": -8.199819152243435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46494136842418, + "entry_time": "2021-11-25T00:00:00", + "exit_price": 92.44406941275119, + "exit_reason": "signal", + "exit_time": "2021-11-26T00:00:00", + "pnl": -2.0871955672973854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32264147745168, + "entry_time": "2021-11-28T00:00:00", + "exit_price": 92.0360221167863, + "exit_reason": "signal", + "exit_time": "2021-11-29T00:00:00", + "pnl": -28.661936066539056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01384655286363, + "entry_time": "2021-12-01T00:00:00", + "exit_price": 91.97262653583181, + "exit_reason": "signal", + "exit_time": "2021-12-02T00:00:00", + "pnl": -4.122001703182832, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.28024889847717, + "entry_time": "2021-12-04T00:00:00", + "exit_price": 91.96758302287454, + "exit_reason": "signal", + "exit_time": "2021-12-05T00:00:00", + "pnl": -31.26658756026336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25528568314509, + "entry_time": "2021-12-07T00:00:00", + "exit_price": 92.20092793334622, + "exit_reason": "signal", + "exit_time": "2021-12-08T00:00:00", + "pnl": -5.435774979885537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49508373939167, + "entry_time": "2021-12-10T00:00:00", + "exit_price": 92.73466658206335, + "exit_reason": "signal", + "exit_time": "2021-12-11T00:00:00", + "pnl": 23.958284267167983, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46436704586412, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.69111891541637, + "exit_reason": "signal", + "exit_time": "2021-12-14T00:00:00", + "pnl": 22.67518695522449, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21128313549013, + "entry_time": "2021-12-16T00:00:00", + "exit_price": 93.37756823246967, + "exit_reason": "signal", + "exit_time": "2021-12-17T00:00:00", + "pnl": 16.628509697953632, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04218716563325, + "entry_time": "2021-12-19T00:00:00", + "exit_price": 93.00014735551822, + "exit_reason": "signal", + "exit_time": "2021-12-20T00:00:00", + "pnl": -4.203981011503856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.93318531635457, + "entry_time": "2021-12-22T00:00:00", + "exit_price": 92.84116622880475, + "exit_reason": "signal", + "exit_time": "2021-12-23T00:00:00", + "pnl": -9.20190875498156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50637869144556, + "entry_time": "2021-12-25T00:00:00", + "exit_price": 92.66826656058106, + "exit_reason": "signal", + "exit_time": "2021-12-26T00:00:00", + "pnl": 16.188786913549848, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36257300920573, + "entry_time": "2021-12-28T00:00:00", + "exit_price": 92.60779676375832, + "exit_reason": "signal", + "exit_time": "2021-12-29T00:00:00", + "pnl": 24.522375455258953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36220969555443, + "entry_time": "2021-12-31T00:00:00", + "exit_price": 92.1193839744838, + "exit_reason": "signal", + "exit_time": "2022-01-01T00:00:00", + "pnl": -24.28257210706397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89096232869592, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.75394086603562, + "exit_reason": "signal", + "exit_time": "2022-01-04T00:00:00", + "pnl": -13.702146266028649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.10653141004636, + "entry_time": "2022-01-06T00:00:00", + "exit_price": 91.98502552303084, + "exit_reason": "signal", + "exit_time": "2022-01-07T00:00:00", + "pnl": -12.150588701551897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03115476672883, + "entry_time": "2022-01-09T00:00:00", + "exit_price": 92.05866288388766, + "exit_reason": "signal", + "exit_time": "2022-01-10T00:00:00", + "pnl": 2.7508117158831737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.80506699745925, + "entry_time": "2022-01-12T00:00:00", + "exit_price": 91.97004409317438, + "exit_reason": "signal", + "exit_time": "2022-01-13T00:00:00", + "pnl": 16.49770957151304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39339911911829, + "entry_time": "2022-01-15T00:00:00", + "exit_price": 91.28070286679336, + "exit_reason": "signal", + "exit_time": "2022-01-16T00:00:00", + "pnl": -11.269625232493127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74175784445059, + "entry_time": "2022-01-18T00:00:00", + "exit_price": 91.6733758391721, + "exit_reason": "signal", + "exit_time": "2022-01-19T00:00:00", + "pnl": -6.83820052784904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81901224922302, + "entry_time": "2022-01-21T00:00:00", + "exit_price": 91.84844274508458, + "exit_reason": "signal", + "exit_time": "2022-01-22T00:00:00", + "pnl": 2.9430495861561212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.60313885279771, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.41938832519848, + "exit_reason": "signal", + "exit_time": "2022-01-25T00:00:00", + "pnl": -18.375052759922255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.64052127057325, + "entry_time": "2022-01-27T00:00:00", + "exit_price": 91.54200410559555, + "exit_reason": "signal", + "exit_time": "2022-01-28T00:00:00", + "pnl": -9.851716497769303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73590345101391, + "entry_time": "2022-01-30T00:00:00", + "exit_price": 91.62782637305553, + "exit_reason": "signal", + "exit_time": "2022-01-31T00:00:00", + "pnl": -10.807707795838724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79185882856454, + "entry_time": "2022-02-02T00:00:00", + "exit_price": 91.8357946573913, + "exit_reason": "signal", + "exit_time": "2022-02-03T00:00:00", + "pnl": 4.393582882676128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79563500808236, + "entry_time": "2022-02-05T00:00:00", + "exit_price": 92.09144139124615, + "exit_reason": "signal", + "exit_time": "2022-02-06T00:00:00", + "pnl": 29.58063831637992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.91260250945975, + "entry_time": "2022-02-08T00:00:00", + "exit_price": 91.67552176869381, + "exit_reason": "signal", + "exit_time": "2022-02-09T00:00:00", + "pnl": -23.70807407659231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66062267455895, + "entry_time": "2022-02-11T00:00:00", + "exit_price": 91.64149069106048, + "exit_reason": "signal", + "exit_time": "2022-02-12T00:00:00", + "pnl": -1.9131983498464251, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37359630109037, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.51652219716766, + "exit_reason": "signal", + "exit_time": "2022-02-15T00:00:00", + "pnl": 14.292589607728587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.54575759654936, + "entry_time": "2022-02-17T00:00:00", + "exit_price": 91.58821852619887, + "exit_reason": "signal", + "exit_time": "2022-02-18T00:00:00", + "pnl": 4.246092964951458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76782809841714, + "entry_time": "2022-02-20T00:00:00", + "exit_price": 91.6119124553235, + "exit_reason": "signal", + "exit_time": "2022-02-21T00:00:00", + "pnl": -15.591564309363093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74629736846254, + "entry_time": "2022-02-23T00:00:00", + "exit_price": 91.61327551923173, + "exit_reason": "signal", + "exit_time": "2022-02-24T00:00:00", + "pnl": -13.30218492307904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.32896871135786, + "entry_time": "2022-02-26T00:00:00", + "exit_price": 91.13780861275266, + "exit_reason": "signal", + "exit_time": "2022-02-27T00:00:00", + "pnl": -19.116009860519625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12507835931243, + "entry_time": "2022-03-01T00:00:00", + "exit_price": 91.13114200203424, + "exit_reason": "signal", + "exit_time": "2022-03-02T00:00:00", + "pnl": 0.6063642721801443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37230639398891, + "entry_time": "2022-03-04T00:00:00", + "exit_price": 91.298526480022, + "exit_reason": "signal", + "exit_time": "2022-03-05T00:00:00", + "pnl": -7.377991396690049, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14580661294434, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.26371087049277, + "exit_reason": "signal", + "exit_time": "2022-03-08T00:00:00", + "pnl": 11.790425754843454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.19265250778471, + "entry_time": "2022-03-10T00:00:00", + "exit_price": 91.34688434505053, + "exit_reason": "signal", + "exit_time": "2022-03-11T00:00:00", + "pnl": 15.423183726581556, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.27944969864926, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 91.00376526097061, + "exit_reason": "signal", + "exit_time": "2022-03-14T00:00:00", + "pnl": -27.568443767864665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.12691845430324, + "entry_time": "2022-03-16T00:00:00", + "exit_price": 91.13627424638673, + "exit_reason": "signal", + "exit_time": "2022-03-17T00:00:00", + "pnl": 0.9355792083497363, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.90552697963446, + "entry_time": "2022-03-19T00:00:00", + "exit_price": 90.86432013057937, + "exit_reason": "signal", + "exit_time": "2022-03-20T00:00:00", + "pnl": -4.120684905507005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88314466139805, + "entry_time": "2022-03-22T00:00:00", + "exit_price": 90.85684478131836, + "exit_reason": "signal", + "exit_time": "2022-03-23T00:00:00", + "pnl": -2.6299880079695868, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8333575750649, + "entry_time": "2022-03-25T00:00:00", + "exit_price": 90.87580958070879, + "exit_reason": "signal", + "exit_time": "2022-03-26T00:00:00", + "pnl": 4.245200564389961, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87723690769735, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.02118341969194, + "exit_reason": "signal", + "exit_time": "2022-03-29T00:00:00", + "pnl": 14.394651199458167, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.14559411024791, + "entry_time": "2022-03-31T00:00:00", + "exit_price": 91.1102070847533, + "exit_reason": "signal", + "exit_time": "2022-04-01T00:00:00", + "pnl": -3.5387025494619593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.03652679668627, + "entry_time": "2022-04-03T00:00:00", + "exit_price": 90.64848582455738, + "exit_reason": "signal", + "exit_time": "2022-04-04T00:00:00", + "pnl": -38.80409721288743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.5160908672533, + "entry_time": "2022-04-06T00:00:00", + "exit_price": 90.67122680039915, + "exit_reason": "signal", + "exit_time": "2022-04-07T00:00:00", + "pnl": 15.513593314586615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49638519206744, + "entry_time": "2022-04-09T00:00:00", + "exit_price": 90.23851904732544, + "exit_reason": "signal", + "exit_time": "2022-04-10T00:00:00", + "pnl": -25.78661447419836, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.12623758622358, + "entry_time": "2022-04-12T00:00:00", + "exit_price": 90.13616044249197, + "exit_reason": "signal", + "exit_time": "2022-04-13T00:00:00", + "pnl": 0.9922856268385658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.97730849654188, + "entry_time": "2022-04-15T00:00:00", + "exit_price": 89.93950245741028, + "exit_reason": "signal", + "exit_time": "2022-04-16T00:00:00", + "pnl": -3.7806039131592115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.92103698222829, + "entry_time": "2022-04-18T00:00:00", + "exit_price": 89.92708766921471, + "exit_reason": "signal", + "exit_time": "2022-04-19T00:00:00", + "pnl": 0.6050686986418441, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.318742774315, + "entry_time": "2022-04-21T00:00:00", + "exit_price": 90.23642124916759, + "exit_reason": "signal", + "exit_time": "2022-04-22T00:00:00", + "pnl": -8.232152514739937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.21999028274801, + "entry_time": "2022-04-24T00:00:00", + "exit_price": 90.22126197659611, + "exit_reason": "signal", + "exit_time": "2022-04-25T00:00:00", + "pnl": 0.12716938480843964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84560909030802, + "entry_time": "2022-04-27T00:00:00", + "exit_price": 90.53569591871245, + "exit_reason": "signal", + "exit_time": "2022-04-28T00:00:00", + "pnl": -30.991317159558093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0165686304024, + "entry_time": "2022-04-30T00:00:00", + "exit_price": 90.91735297539282, + "exit_reason": "signal", + "exit_time": "2022-05-01T00:00:00", + "pnl": -9.921565500957513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2390830156373, + "entry_time": "2022-05-03T00:00:00", + "exit_price": 91.14925296519219, + "exit_reason": "signal", + "exit_time": "2022-05-04T00:00:00", + "pnl": -8.983005044510719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.22089116397768, + "entry_time": "2022-05-06T00:00:00", + "exit_price": 90.87029928541635, + "exit_reason": "signal", + "exit_time": "2022-05-07T00:00:00", + "pnl": -35.059187856133576, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89974631246403, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.06863681183862, + "exit_reason": "signal", + "exit_time": "2022-05-10T00:00:00", + "pnl": 16.889049937459276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.57589026049908, + "entry_time": "2022-05-12T00:00:00", + "exit_price": 91.50862549547844, + "exit_reason": "signal", + "exit_time": "2022-05-13T00:00:00", + "pnl": -6.726476502062724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62801821971621, + "entry_time": "2022-05-15T00:00:00", + "exit_price": 91.81567744205196, + "exit_reason": "signal", + "exit_time": "2022-05-16T00:00:00", + "pnl": 18.76592223357511, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.33854066905738, + "entry_time": "2022-05-18T00:00:00", + "exit_price": 90.96569574948703, + "exit_reason": "signal", + "exit_time": "2022-05-19T00:00:00", + "pnl": -37.28449195703615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07274851876403, + "entry_time": "2022-05-21T00:00:00", + "exit_price": 90.95622489428452, + "exit_reason": "signal", + "exit_time": "2022-05-22T00:00:00", + "pnl": -11.652362447952328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.72051069276088, + "entry_time": "2022-05-24T00:00:00", + "exit_price": 90.55232295814028, + "exit_reason": "signal", + "exit_time": "2022-05-25T00:00:00", + "pnl": -16.818773462060562, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.40473126616526, + "entry_time": "2022-05-27T00:00:00", + "exit_price": 90.65640141611814, + "exit_reason": "signal", + "exit_time": "2022-05-28T00:00:00", + "pnl": 25.16701499528972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56665701011867, + "entry_time": "2022-05-30T00:00:00", + "exit_price": 90.46095751045398, + "exit_reason": "signal", + "exit_time": "2022-05-31T00:00:00", + "pnl": -10.569949966469721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.76022002087706, + "entry_time": "2022-06-02T00:00:00", + "exit_price": 90.81381751472117, + "exit_reason": "signal", + "exit_time": "2022-06-03T00:00:00", + "pnl": 5.359749384409952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23375682446748, + "entry_time": "2022-06-05T00:00:00", + "exit_price": 91.01190578025698, + "exit_reason": "signal", + "exit_time": "2022-06-06T00:00:00", + "pnl": -22.18510442104889, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56046438309357, + "entry_time": "2022-06-08T00:00:00", + "exit_price": 90.6501420569037, + "exit_reason": "signal", + "exit_time": "2022-06-09T00:00:00", + "pnl": 8.96776738101289, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45985538510016, + "entry_time": "2022-06-11T00:00:00", + "exit_price": 90.32205823485288, + "exit_reason": "signal", + "exit_time": "2022-06-12T00:00:00", + "pnl": -13.77971502472792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.4213362857644, + "entry_time": "2022-06-14T00:00:00", + "exit_price": 90.3254460973393, + "exit_reason": "signal", + "exit_time": "2022-06-15T00:00:00", + "pnl": -9.589018842509176, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.36326200776878, + "entry_time": "2022-06-17T00:00:00", + "exit_price": 90.1350438366559, + "exit_reason": "signal", + "exit_time": "2022-06-18T00:00:00", + "pnl": -22.82181711128942, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.53738507774712, + "entry_time": "2022-06-20T00:00:00", + "exit_price": 90.43902960493799, + "exit_reason": "signal", + "exit_time": "2022-06-21T00:00:00", + "pnl": -9.835547280912579, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28282897059066, + "entry_time": "2022-06-23T00:00:00", + "exit_price": 90.42427634098117, + "exit_reason": "signal", + "exit_time": "2022-06-24T00:00:00", + "pnl": 14.144737039050597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.65923583486823, + "entry_time": "2022-06-26T00:00:00", + "exit_price": 90.60873415539405, + "exit_reason": "signal", + "exit_time": "2022-06-27T00:00:00", + "pnl": -5.050167947418231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.39024714619487, + "entry_time": "2022-06-29T00:00:00", + "exit_price": 90.66523349021156, + "exit_reason": "signal", + "exit_time": "2022-06-30T00:00:00", + "pnl": 27.498634401668824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82876323237488, + "entry_time": "2022-07-02T00:00:00", + "exit_price": 90.97466728886246, + "exit_reason": "signal", + "exit_time": "2022-07-03T00:00:00", + "pnl": 14.590405648757951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.89452843928451, + "entry_time": "2022-07-05T00:00:00", + "exit_price": 90.67041116090726, + "exit_reason": "signal", + "exit_time": "2022-07-06T00:00:00", + "pnl": -22.411727837725266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63870699300467, + "entry_time": "2022-07-08T00:00:00", + "exit_price": 90.60806866533521, + "exit_reason": "signal", + "exit_time": "2022-07-09T00:00:00", + "pnl": -3.0638327669457794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09022889967974, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 91.33132395141395, + "exit_reason": "signal", + "exit_time": "2022-07-12T00:00:00", + "pnl": 24.109505173419166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1422566167072, + "entry_time": "2022-07-14T00:00:00", + "exit_price": 91.02336448195068, + "exit_reason": "signal", + "exit_time": "2022-07-15T00:00:00", + "pnl": -11.889213475651559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.85171345155105, + "entry_time": "2022-07-17T00:00:00", + "exit_price": 90.92826438920278, + "exit_reason": "signal", + "exit_time": "2022-07-18T00:00:00", + "pnl": 7.65509376517366, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9967936460588, + "entry_time": "2022-07-20T00:00:00", + "exit_price": 91.02558962193989, + "exit_reason": "signal", + "exit_time": "2022-07-21T00:00:00", + "pnl": 2.879597588107572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86654130293297, + "entry_time": "2022-07-23T00:00:00", + "exit_price": 91.1805076876075, + "exit_reason": "signal", + "exit_time": "2022-07-24T00:00:00", + "pnl": 31.39663846745316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20590970247865, + "entry_time": "2022-07-26T00:00:00", + "exit_price": 91.04093233048125, + "exit_reason": "signal", + "exit_time": "2022-07-27T00:00:00", + "pnl": -16.497737199741096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.94025278141096, + "entry_time": "2022-07-29T00:00:00", + "exit_price": 91.1695372755258, + "exit_reason": "signal", + "exit_time": "2022-07-30T00:00:00", + "pnl": 22.928449411483598, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55006804279205, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.74946747581956, + "exit_reason": "signal", + "exit_time": "2022-08-02T00:00:00", + "pnl": 19.939943302752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.08829699168929, + "entry_time": "2022-08-04T00:00:00", + "exit_price": 92.17204398025235, + "exit_reason": "signal", + "exit_time": "2022-08-05T00:00:00", + "pnl": 8.374698856305258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82928257766983, + "entry_time": "2022-08-07T00:00:00", + "exit_price": 91.80555288724541, + "exit_reason": "signal", + "exit_time": "2022-08-08T00:00:00", + "pnl": -2.3729690424424916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03756487304749, + "entry_time": "2022-08-10T00:00:00", + "exit_price": 91.92246232242579, + "exit_reason": "signal", + "exit_time": "2022-08-11T00:00:00", + "pnl": -11.510255062170472, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12455329081938, + "entry_time": "2022-08-13T00:00:00", + "exit_price": 92.03614640032846, + "exit_reason": "signal", + "exit_time": "2022-08-14T00:00:00", + "pnl": -8.840689049091452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43863634543025, + "entry_time": "2022-08-16T00:00:00", + "exit_price": 92.57880144701099, + "exit_reason": "signal", + "exit_time": "2022-08-17T00:00:00", + "pnl": 14.016510158073288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5662997648947, + "entry_time": "2022-08-19T00:00:00", + "exit_price": 92.63602712862732, + "exit_reason": "signal", + "exit_time": "2022-08-20T00:00:00", + "pnl": 6.972736373261796, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99359531127284, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.20326657631179, + "exit_reason": "signal", + "exit_time": "2022-08-23T00:00:00", + "pnl": 20.967126503895997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36371229951278, + "entry_time": "2022-08-25T00:00:00", + "exit_price": 93.15013947578183, + "exit_reason": "signal", + "exit_time": "2022-08-26T00:00:00", + "pnl": -21.357282373095586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39786147444195, + "entry_time": "2022-08-28T00:00:00", + "exit_price": 93.32525340472, + "exit_reason": "signal", + "exit_time": "2022-08-29T00:00:00", + "pnl": -7.260806972195496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1699951830038, + "entry_time": "2022-08-31T00:00:00", + "exit_price": 92.94415449917722, + "exit_reason": "signal", + "exit_time": "2022-09-01T00:00:00", + "pnl": -22.584068382659098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06237685823791, + "entry_time": "2022-09-03T00:00:00", + "exit_price": 92.88599230986543, + "exit_reason": "signal", + "exit_time": "2022-09-04T00:00:00", + "pnl": -17.63845483724799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09341138541605, + "entry_time": "2022-09-06T00:00:00", + "exit_price": 93.29146577709628, + "exit_reason": "signal", + "exit_time": "2022-09-07T00:00:00", + "pnl": 19.80543916802344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.45209900958335, + "entry_time": "2022-09-09T00:00:00", + "exit_price": 93.38892182999521, + "exit_reason": "signal", + "exit_time": "2022-09-10T00:00:00", + "pnl": -6.317717958812864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42662435004, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 93.86711355565461, + "exit_reason": "signal", + "exit_time": "2022-09-13T00:00:00", + "pnl": 44.04892056146127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.43026737045712, + "entry_time": "2022-09-15T00:00:00", + "exit_price": 94.68555551249223, + "exit_reason": "signal", + "exit_time": "2022-09-16T00:00:00", + "pnl": 25.5288142035115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.34275603824345, + "entry_time": "2022-09-18T00:00:00", + "exit_price": 94.26115762602807, + "exit_reason": "signal", + "exit_time": "2022-09-19T00:00:00", + "pnl": -8.159841221537135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.81665975574816, + "entry_time": "2022-09-21T00:00:00", + "exit_price": 94.69084237577945, + "exit_reason": "signal", + "exit_time": "2022-09-22T00:00:00", + "pnl": -12.581737996872107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.80375023000443, + "entry_time": "2022-09-24T00:00:00", + "exit_price": 94.71118042427594, + "exit_reason": "signal", + "exit_time": "2022-09-25T00:00:00", + "pnl": -9.256980572848988, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.46412500503037, + "entry_time": "2022-09-27T00:00:00", + "exit_price": 94.6314533607136, + "exit_reason": "signal", + "exit_time": "2022-09-28T00:00:00", + "pnl": 16.732835568323935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6742741594175, + "entry_time": "2022-09-30T00:00:00", + "exit_price": 94.69072074935896, + "exit_reason": "signal", + "exit_time": "2022-10-01T00:00:00", + "pnl": 1.6446589941460843, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.12667461230008, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 94.99949417466048, + "exit_reason": "signal", + "exit_time": "2022-10-04T00:00:00", + "pnl": -12.71804376395994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92543412582965, + "entry_time": "2022-10-06T00:00:00", + "exit_price": 94.72977842157017, + "exit_reason": "signal", + "exit_time": "2022-10-07T00:00:00", + "pnl": -19.565570425947953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5701038761525, + "entry_time": "2022-10-09T00:00:00", + "exit_price": 94.59977663872266, + "exit_reason": "signal", + "exit_time": "2022-10-10T00:00:00", + "pnl": 2.967276257015328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2927331361965, + "entry_time": "2022-10-12T00:00:00", + "exit_price": 94.40263092608106, + "exit_reason": "signal", + "exit_time": "2022-10-13T00:00:00", + "pnl": 10.989778988454418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28632878234235, + "entry_time": "2022-10-15T00:00:00", + "exit_price": 94.53250654562353, + "exit_reason": "signal", + "exit_time": "2022-10-16T00:00:00", + "pnl": 24.617776328117543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49417223286694, + "entry_time": "2022-10-18T00:00:00", + "exit_price": 94.21737477440588, + "exit_reason": "signal", + "exit_time": "2022-10-19T00:00:00", + "pnl": -27.679745846106016, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21700275153675, + "entry_time": "2022-10-21T00:00:00", + "exit_price": 94.24257812297434, + "exit_reason": "signal", + "exit_time": "2022-10-22T00:00:00", + "pnl": 2.557537143758964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33447437173405, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.36500808099656, + "exit_reason": "signal", + "exit_time": "2022-10-25T00:00:00", + "pnl": 3.0533709262508637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62192540785213, + "entry_time": "2022-10-27T00:00:00", + "exit_price": 94.95467067184597, + "exit_reason": "signal", + "exit_time": "2022-10-28T00:00:00", + "pnl": 33.27452639938383, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32280422773096, + "entry_time": "2022-10-30T00:00:00", + "exit_price": 95.27797141913928, + "exit_reason": "signal", + "exit_time": "2022-10-31T00:00:00", + "pnl": -4.48328085916728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.85159096418194, + "entry_time": "2022-11-02T00:00:00", + "exit_price": 95.9332147424965, + "exit_reason": "signal", + "exit_time": "2022-11-03T00:00:00", + "pnl": 8.162377831456979, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.87171080557967, + "entry_time": "2022-11-05T00:00:00", + "exit_price": 95.72359330386428, + "exit_reason": "signal", + "exit_time": "2022-11-06T00:00:00", + "pnl": -14.811750171538733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38266657654837, + "entry_time": "2022-11-08T00:00:00", + "exit_price": 95.28429001378173, + "exit_reason": "signal", + "exit_time": "2022-11-09T00:00:00", + "pnl": -9.837656276666166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01211175536163, + "entry_time": "2022-11-11T00:00:00", + "exit_price": 94.84310882657518, + "exit_reason": "signal", + "exit_time": "2022-11-12T00:00:00", + "pnl": -16.900292878646724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.59049236660378, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.35514007446828, + "exit_reason": "signal", + "exit_time": "2022-11-15T00:00:00", + "pnl": -23.535229213550338, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9357580237877, + "entry_time": "2022-11-17T00:00:00", + "exit_price": 94.05072699188574, + "exit_reason": "signal", + "exit_time": "2022-11-18T00:00:00", + "pnl": 11.49689680980373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00889117962727, + "entry_time": "2022-11-20T00:00:00", + "exit_price": 94.18219892584725, + "exit_reason": "signal", + "exit_time": "2022-11-21T00:00:00", + "pnl": 17.33077462199799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96556912199465, + "entry_time": "2022-11-23T00:00:00", + "exit_price": 93.87607469195584, + "exit_reason": "signal", + "exit_time": "2022-11-24T00:00:00", + "pnl": -8.949443003881242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60138099475903, + "entry_time": "2022-11-26T00:00:00", + "exit_price": 93.55643441032785, + "exit_reason": "signal", + "exit_time": "2022-11-27T00:00:00", + "pnl": -4.49465844311635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88066522817982, + "entry_time": "2022-11-29T00:00:00", + "exit_price": 93.67510822228188, + "exit_reason": "signal", + "exit_time": "2022-11-30T00:00:00", + "pnl": -20.55570058979538, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69837663925773, + "entry_time": "2022-12-02T00:00:00", + "exit_price": 93.91860336977558, + "exit_reason": "signal", + "exit_time": "2022-12-03T00:00:00", + "pnl": 22.022673051784295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.70107216756422, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.66971331829183, + "exit_reason": "signal", + "exit_time": "2022-12-06T00:00:00", + "pnl": -3.135884927238294, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87708149049162, + "entry_time": "2022-12-08T00:00:00", + "exit_price": 93.72163687944706, + "exit_reason": "signal", + "exit_time": "2022-12-09T00:00:00", + "pnl": -15.544461104454967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.94898877051006, + "entry_time": "2022-12-11T00:00:00", + "exit_price": 93.95474043698636, + "exit_reason": "signal", + "exit_time": "2022-12-12T00:00:00", + "pnl": 0.5751666476298851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6415881902333, + "entry_time": "2022-12-14T00:00:00", + "exit_price": 93.34129447656329, + "exit_reason": "signal", + "exit_time": "2022-12-15T00:00:00", + "pnl": -30.02937136700166, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9434543592522, + "entry_time": "2022-12-17T00:00:00", + "exit_price": 92.60307524718807, + "exit_reason": "signal", + "exit_time": "2022-12-18T00:00:00", + "pnl": -34.0379112064129, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.18983136258927, + "entry_time": "2022-12-20T00:00:00", + "exit_price": 92.07720168711411, + "exit_reason": "signal", + "exit_time": "2022-12-21T00:00:00", + "pnl": -11.262967547514563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00591795170635, + "entry_time": "2022-12-23T00:00:00", + "exit_price": 91.73390898252362, + "exit_reason": "signal", + "exit_time": "2022-12-24T00:00:00", + "pnl": -27.200896918275248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87915537734213, + "entry_time": "2022-12-26T00:00:00", + "exit_price": 92.05356230153482, + "exit_reason": "signal", + "exit_time": "2022-12-27T00:00:00", + "pnl": 17.440692419269908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.19249105693204, + "entry_time": "2022-12-29T00:00:00", + "exit_price": 92.35715717263174, + "exit_reason": "signal", + "exit_time": "2022-12-30T00:00:00", + "pnl": 16.466611569969245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92376356586935, + "entry_time": "2023-01-01T00:00:00", + "exit_price": 92.8642597181964, + "exit_reason": "signal", + "exit_time": "2023-01-02T00:00:00", + "pnl": -5.950384767296782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08761417167571, + "entry_time": "2023-01-04T00:00:00", + "exit_price": 93.3787010770275, + "exit_reason": "signal", + "exit_time": "2023-01-05T00:00:00", + "pnl": 29.108690535180358, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22887351223902, + "entry_time": "2023-01-07T00:00:00", + "exit_price": 93.18791972112416, + "exit_reason": "signal", + "exit_time": "2023-01-08T00:00:00", + "pnl": -4.0953791114861815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71839956451682, + "entry_time": "2023-01-10T00:00:00", + "exit_price": 92.72871333258459, + "exit_reason": "signal", + "exit_time": "2023-01-11T00:00:00", + "pnl": 1.031376806777189, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71285525012034, + "entry_time": "2023-01-13T00:00:00", + "exit_price": 92.95484908903208, + "exit_reason": "signal", + "exit_time": "2023-01-14T00:00:00", + "pnl": 24.199383891174875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09252551101909, + "entry_time": "2023-01-16T00:00:00", + "exit_price": 93.19565426763862, + "exit_reason": "signal", + "exit_time": "2023-01-17T00:00:00", + "pnl": 10.312875661953512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34851063541004, + "entry_time": "2023-01-19T00:00:00", + "exit_price": 93.36918149511725, + "exit_reason": "signal", + "exit_time": "2023-01-20T00:00:00", + "pnl": 2.0670859707206546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.29871325433136, + "entry_time": "2023-01-22T00:00:00", + "exit_price": 93.43191348926673, + "exit_reason": "signal", + "exit_time": "2023-01-23T00:00:00", + "pnl": 13.32002349353752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54163438380152, + "entry_time": "2023-01-25T00:00:00", + "exit_price": 93.70996022231523, + "exit_reason": "signal", + "exit_time": "2023-01-26T00:00:00", + "pnl": 16.832583851371965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44351635290319, + "entry_time": "2023-01-28T00:00:00", + "exit_price": 93.3607156455027, + "exit_reason": "signal", + "exit_time": "2023-01-29T00:00:00", + "pnl": -8.280070740049268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25194927165909, + "entry_time": "2023-01-31T00:00:00", + "exit_price": 93.09482587993352, + "exit_reason": "signal", + "exit_time": "2023-02-01T00:00:00", + "pnl": -15.712339172556312, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05964578316673, + "entry_time": "2023-02-03T00:00:00", + "exit_price": 93.1247824238807, + "exit_reason": "signal", + "exit_time": "2023-02-04T00:00:00", + "pnl": 6.513664071397216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60195304694001, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.5077083162264, + "exit_reason": "signal", + "exit_time": "2023-02-07T00:00:00", + "pnl": -9.424473071361717, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32915625849455, + "entry_time": "2023-02-09T00:00:00", + "exit_price": 93.41904859018952, + "exit_reason": "signal", + "exit_time": "2023-02-10T00:00:00", + "pnl": 8.98923316949731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86240170807343, + "entry_time": "2023-02-12T00:00:00", + "exit_price": 93.74311994285968, + "exit_reason": "signal", + "exit_time": "2023-02-13T00:00:00", + "pnl": -11.928176521374553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92758592270172, + "entry_time": "2023-02-15T00:00:00", + "exit_price": 93.91004727072426, + "exit_reason": "signal", + "exit_time": "2023-02-16T00:00:00", + "pnl": -1.7538651977465634, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.90746519420465, + "entry_time": "2023-02-18T00:00:00", + "exit_price": 94.16764239198312, + "exit_reason": "signal", + "exit_time": "2023-02-19T00:00:00", + "pnl": 26.01771977784665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.44892482562022, + "entry_time": "2023-02-21T00:00:00", + "exit_price": 94.29820349772235, + "exit_reason": "signal", + "exit_time": "2023-02-22T00:00:00", + "pnl": -15.072132789788157, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29660996193417, + "entry_time": "2023-02-24T00:00:00", + "exit_price": 94.34630077913107, + "exit_reason": "signal", + "exit_time": "2023-02-25T00:00:00", + "pnl": 4.9690817196897115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28533190136021, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.32163037675376, + "exit_reason": "signal", + "exit_time": "2023-02-28T00:00:00", + "pnl": 3.6298475393559784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20619082469412, + "entry_time": "2023-03-02T00:00:00", + "exit_price": 93.94806731557186, + "exit_reason": "signal", + "exit_time": "2023-03-03T00:00:00", + "pnl": -25.812350912225156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.5296456958934, + "entry_time": "2023-03-05T00:00:00", + "exit_price": 93.2046797163239, + "exit_reason": "signal", + "exit_time": "2023-03-06T00:00:00", + "pnl": -32.4965979569497, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32570812965447, + "entry_time": "2023-03-08T00:00:00", + "exit_price": 93.27835226241817, + "exit_reason": "signal", + "exit_time": "2023-03-09T00:00:00", + "pnl": -4.73558672362924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18052001757422, + "entry_time": "2023-03-11T00:00:00", + "exit_price": 93.21374473155299, + "exit_reason": "signal", + "exit_time": "2023-03-12T00:00:00", + "pnl": 3.322471397877962, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13943605219035, + "entry_time": "2023-03-14T00:00:00", + "exit_price": 93.26046795573633, + "exit_reason": "signal", + "exit_time": "2023-03-15T00:00:00", + "pnl": 12.103190354599064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21960702536101, + "entry_time": "2023-03-17T00:00:00", + "exit_price": 92.64774686400108, + "exit_reason": "signal", + "exit_time": "2023-03-18T00:00:00", + "pnl": -57.18601613599458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31556350692, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.46149005259649, + "exit_reason": "signal", + "exit_time": "2023-03-21T00:00:00", + "pnl": 14.592654567648424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52377288657563, + "entry_time": "2023-03-23T00:00:00", + "exit_price": 92.23839203319807, + "exit_reason": "signal", + "exit_time": "2023-03-24T00:00:00", + "pnl": -28.538085337755547, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6963758650249, + "entry_time": "2023-03-26T00:00:00", + "exit_price": 92.70207115016164, + "exit_reason": "signal", + "exit_time": "2023-03-27T00:00:00", + "pnl": 0.5695285136735038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1906639429263, + "entry_time": "2023-03-29T00:00:00", + "exit_price": 93.35726613372299, + "exit_reason": "signal", + "exit_time": "2023-03-30T00:00:00", + "pnl": 16.660219079667513, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1634420410312, + "entry_time": "2023-04-01T00:00:00", + "exit_price": 93.2066382813918, + "exit_reason": "signal", + "exit_time": "2023-04-02T00:00:00", + "pnl": 4.319624036061214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0471045722787, + "entry_time": "2023-04-04T00:00:00", + "exit_price": 92.82199720210754, + "exit_reason": "signal", + "exit_time": "2023-04-05T00:00:00", + "pnl": -22.51073701711539, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8989666578373, + "entry_time": "2023-04-07T00:00:00", + "exit_price": 92.77857374465485, + "exit_reason": "signal", + "exit_time": "2023-04-08T00:00:00", + "pnl": -12.039291318245887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.70919453056075, + "entry_time": "2023-04-10T00:00:00", + "exit_price": 92.74465000028516, + "exit_reason": "signal", + "exit_time": "2023-04-11T00:00:00", + "pnl": 3.5455469724420254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60934516564298, + "entry_time": "2023-04-13T00:00:00", + "exit_price": 92.96618622577306, + "exit_reason": "signal", + "exit_time": "2023-04-14T00:00:00", + "pnl": 35.684106013008204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78501792806425, + "entry_time": "2023-04-16T00:00:00", + "exit_price": 92.76326607151933, + "exit_reason": "signal", + "exit_time": "2023-04-17T00:00:00", + "pnl": -2.175185654492452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62556378625803, + "entry_time": "2023-04-19T00:00:00", + "exit_price": 92.65556548612001, + "exit_reason": "signal", + "exit_time": "2023-04-20T00:00:00", + "pnl": 3.000169986198671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68684981308908, + "entry_time": "2023-04-22T00:00:00", + "exit_price": 92.58597625405771, + "exit_reason": "signal", + "exit_time": "2023-04-23T00:00:00", + "pnl": -10.087355903136995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86536967969084, + "entry_time": "2023-04-25T00:00:00", + "exit_price": 92.75020367672924, + "exit_reason": "signal", + "exit_time": "2023-04-26T00:00:00", + "pnl": -11.516600296161414, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75062990936559, + "entry_time": "2023-04-28T00:00:00", + "exit_price": 92.98349381034318, + "exit_reason": "signal", + "exit_time": "2023-04-29T00:00:00", + "pnl": 23.286390097759067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04847278769076, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 93.06193871613516, + "exit_reason": "signal", + "exit_time": "2023-05-02T00:00:00", + "pnl": 1.346592844440238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.60529611931622, + "entry_time": "2023-05-04T00:00:00", + "exit_price": 92.60807864200518, + "exit_reason": "signal", + "exit_time": "2023-05-05T00:00:00", + "pnl": 0.27825226889581245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90198815097345, + "entry_time": "2023-05-07T00:00:00", + "exit_price": 92.84425841280351, + "exit_reason": "signal", + "exit_time": "2023-05-08T00:00:00", + "pnl": -5.772973816992817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66689924421028, + "entry_time": "2023-05-10T00:00:00", + "exit_price": 92.6348345250126, + "exit_reason": "signal", + "exit_time": "2023-05-11T00:00:00", + "pnl": -3.206471919769683, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74311085652141, + "entry_time": "2023-05-13T00:00:00", + "exit_price": 92.87596365908365, + "exit_reason": "signal", + "exit_time": "2023-05-14T00:00:00", + "pnl": 13.285280256222904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15467982049428, + "entry_time": "2023-05-16T00:00:00", + "exit_price": 93.06917346679761, + "exit_reason": "signal", + "exit_time": "2023-05-17T00:00:00", + "pnl": -8.550635369667361, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16088604193162, + "entry_time": "2023-05-19T00:00:00", + "exit_price": 93.1767131466551, + "exit_reason": "signal", + "exit_time": "2023-05-20T00:00:00", + "pnl": 1.5827104723484808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59084973064017, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.3728256379574, + "exit_reason": "signal", + "exit_time": "2023-05-23T00:00:00", + "pnl": -21.80240926827537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.83907971020484, + "entry_time": "2023-05-25T00:00:00", + "exit_price": 94.05336598759212, + "exit_reason": "signal", + "exit_time": "2023-05-26T00:00:00", + "pnl": 21.4286277387273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15556945611712, + "entry_time": "2023-05-28T00:00:00", + "exit_price": 94.11170249260897, + "exit_reason": "signal", + "exit_time": "2023-05-29T00:00:00", + "pnl": -4.386696350815328, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26806948858284, + "entry_time": "2023-05-31T00:00:00", + "exit_price": 94.19864576006458, + "exit_reason": "signal", + "exit_time": "2023-06-01T00:00:00", + "pnl": -6.9423728518268035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02469106007196, + "entry_time": "2023-06-03T00:00:00", + "exit_price": 94.37555658552148, + "exit_reason": "signal", + "exit_time": "2023-06-04T00:00:00", + "pnl": 35.0865525449517, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.4719110379968, + "entry_time": "2023-06-06T00:00:00", + "exit_price": 94.46329135212792, + "exit_reason": "signal", + "exit_time": "2023-06-07T00:00:00", + "pnl": -0.8619685868870874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.72605970139526, + "entry_time": "2023-06-09T00:00:00", + "exit_price": 94.42143976779836, + "exit_reason": "signal", + "exit_time": "2023-06-10T00:00:00", + "pnl": -30.461993359689586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5510290269881, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.42138738037778, + "exit_reason": "signal", + "exit_time": "2023-06-13T00:00:00", + "pnl": -12.964164661032555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.49725923626676, + "entry_time": "2023-06-15T00:00:00", + "exit_price": 94.83017838441384, + "exit_reason": "signal", + "exit_time": "2023-06-16T00:00:00", + "pnl": 33.291914814708434, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.96394971087318, + "entry_time": "2023-06-18T00:00:00", + "exit_price": 94.80946954515628, + "exit_reason": "signal", + "exit_time": "2023-06-19T00:00:00", + "pnl": -15.44801657169046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.05895494780962, + "entry_time": "2023-06-21T00:00:00", + "exit_price": 94.7764741456602, + "exit_reason": "signal", + "exit_time": "2023-06-22T00:00:00", + "pnl": -28.248080214942092, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.82916340306784, + "entry_time": "2023-06-24T00:00:00", + "exit_price": 94.49615933800648, + "exit_reason": "signal", + "exit_time": "2023-06-25T00:00:00", + "pnl": -33.300406506135914, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53903204926397, + "entry_time": "2023-06-27T00:00:00", + "exit_price": 94.2199238563033, + "exit_reason": "signal", + "exit_time": "2023-06-28T00:00:00", + "pnl": -31.91081929606662, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.15553425915469, + "entry_time": "2023-06-30T00:00:00", + "exit_price": 94.3233546324033, + "exit_reason": "signal", + "exit_time": "2023-07-01T00:00:00", + "pnl": 16.78203732486145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29143609072966, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.34909878462929, + "exit_reason": "signal", + "exit_time": "2023-07-04T00:00:00", + "pnl": 5.766269389963782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79549173605427, + "entry_time": "2023-07-06T00:00:00", + "exit_price": 94.86012460829116, + "exit_reason": "signal", + "exit_time": "2023-07-07T00:00:00", + "pnl": 6.463287223687075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62257045149929, + "entry_time": "2023-07-09T00:00:00", + "exit_price": 94.36740770267758, + "exit_reason": "signal", + "exit_time": "2023-07-10T00:00:00", + "pnl": -25.516274882171274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1123342756572, + "entry_time": "2023-07-12T00:00:00", + "exit_price": 94.28815691102787, + "exit_reason": "signal", + "exit_time": "2023-07-13T00:00:00", + "pnl": 17.582263537065955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89234388227695, + "entry_time": "2023-07-15T00:00:00", + "exit_price": 93.64456440149245, + "exit_reason": "signal", + "exit_time": "2023-07-16T00:00:00", + "pnl": -24.77794807845021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.62943347351336, + "entry_time": "2023-07-18T00:00:00", + "exit_price": 93.64788638508941, + "exit_reason": "signal", + "exit_time": "2023-07-19T00:00:00", + "pnl": 1.8452911576041515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1774162868962, + "entry_time": "2023-07-21T00:00:00", + "exit_price": 94.00402666791075, + "exit_reason": "signal", + "exit_time": "2023-07-22T00:00:00", + "pnl": -17.338961898545676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.04453321057154, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.96838361247781, + "exit_reason": "signal", + "exit_time": "2023-07-25T00:00:00", + "pnl": -7.614959809372522, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88321586599363, + "entry_time": "2023-07-27T00:00:00", + "exit_price": 93.90884833929827, + "exit_reason": "signal", + "exit_time": "2023-07-28T00:00:00", + "pnl": 2.5632473304649466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7179718780841, + "entry_time": "2023-07-30T00:00:00", + "exit_price": 93.74821494678119, + "exit_reason": "signal", + "exit_time": "2023-07-31T00:00:00", + "pnl": 3.0243068697091076, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9038655497103, + "entry_time": "2023-08-02T00:00:00", + "exit_price": 93.83750554707963, + "exit_reason": "signal", + "exit_time": "2023-08-03T00:00:00", + "pnl": -6.6360002630663075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88584036004717, + "entry_time": "2023-08-05T00:00:00", + "exit_price": 93.9446210717662, + "exit_reason": "signal", + "exit_time": "2023-08-06T00:00:00", + "pnl": 5.878071171904594, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.10339943212905, + "entry_time": "2023-08-08T00:00:00", + "exit_price": 94.0848941093554, + "exit_reason": "signal", + "exit_time": "2023-08-09T00:00:00", + "pnl": -1.850532277363527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.14949796034026, + "entry_time": "2023-08-11T00:00:00", + "exit_price": 93.8874166822761, + "exit_reason": "signal", + "exit_time": "2023-08-12T00:00:00", + "pnl": -26.208127806416087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75795965886634, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 93.82124488293752, + "exit_reason": "signal", + "exit_time": "2023-08-15T00:00:00", + "pnl": 6.328522407116907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.65346951457661, + "entry_time": "2023-08-17T00:00:00", + "exit_price": 93.61396660096294, + "exit_reason": "signal", + "exit_time": "2023-08-18T00:00:00", + "pnl": -3.950291361366908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54800539421142, + "entry_time": "2023-08-20T00:00:00", + "exit_price": 93.46513172439276, + "exit_reason": "signal", + "exit_time": "2023-08-21T00:00:00", + "pnl": -8.287366981865489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04018712803396, + "entry_time": "2023-08-23T00:00:00", + "exit_price": 93.2845186523261, + "exit_reason": "signal", + "exit_time": "2023-08-24T00:00:00", + "pnl": 24.433152429213806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80052936345987, + "entry_time": "2023-08-26T00:00:00", + "exit_price": 93.65349927893294, + "exit_reason": "signal", + "exit_time": "2023-08-27T00:00:00", + "pnl": -14.703008452692302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93158855841354, + "entry_time": "2023-08-29T00:00:00", + "exit_price": 93.79425107834362, + "exit_reason": "signal", + "exit_time": "2023-08-30T00:00:00", + "pnl": -13.733748006990936, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55284494377143, + "entry_time": "2023-09-01T00:00:00", + "exit_price": 93.33529354683158, + "exit_reason": "signal", + "exit_time": "2023-09-02T00:00:00", + "pnl": -21.755139693985257, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67881964988702, + "entry_time": "2023-09-04T00:00:00", + "exit_price": 93.76309874382866, + "exit_reason": "signal", + "exit_time": "2023-09-05T00:00:00", + "pnl": 8.427909394165908, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.06380422690371, + "entry_time": "2023-09-07T00:00:00", + "exit_price": 94.34837478850592, + "exit_reason": "signal", + "exit_time": "2023-09-08T00:00:00", + "pnl": 28.45705616021951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.28272356925105, + "entry_time": "2023-09-10T00:00:00", + "exit_price": 94.08986442511201, + "exit_reason": "signal", + "exit_time": "2023-09-11T00:00:00", + "pnl": -19.28591441390381, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.19668777653186, + "entry_time": "2023-09-13T00:00:00", + "exit_price": 93.9155347262711, + "exit_reason": "signal", + "exit_time": "2023-09-14T00:00:00", + "pnl": -28.115305026074566, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86963033561574, + "entry_time": "2023-09-16T00:00:00", + "exit_price": 94.02605497205086, + "exit_reason": "signal", + "exit_time": "2023-09-17T00:00:00", + "pnl": 15.64246364351311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07735953777274, + "entry_time": "2023-09-19T00:00:00", + "exit_price": 93.92691564488518, + "exit_reason": "signal", + "exit_time": "2023-09-20T00:00:00", + "pnl": -15.044389288754246, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.63814938665311, + "entry_time": "2023-09-22T00:00:00", + "exit_price": 93.6176086632684, + "exit_reason": "signal", + "exit_time": "2023-09-23T00:00:00", + "pnl": -2.0540723384710873, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71204578933798, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.41015509320589, + "exit_reason": "signal", + "exit_time": "2023-09-26T00:00:00", + "pnl": -30.18906961320863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42767992948878, + "entry_time": "2023-09-28T00:00:00", + "exit_price": 93.23852235526199, + "exit_reason": "signal", + "exit_time": "2023-09-29T00:00:00", + "pnl": -18.915757422677416, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49442961672796, + "entry_time": "2023-10-01T00:00:00", + "exit_price": 93.43422929731483, + "exit_reason": "signal", + "exit_time": "2023-10-02T00:00:00", + "pnl": -6.020031941312482, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.28736530415493, + "entry_time": "2023-10-04T00:00:00", + "exit_price": 93.12218377264868, + "exit_reason": "signal", + "exit_time": "2023-10-05T00:00:00", + "pnl": -16.51815315062595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10919349920911, + "entry_time": "2023-10-07T00:00:00", + "exit_price": 92.97579394436632, + "exit_reason": "signal", + "exit_time": "2023-10-08T00:00:00", + "pnl": -13.339955484278107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87630575654731, + "entry_time": "2023-10-10T00:00:00", + "exit_price": 92.64709318534976, + "exit_reason": "signal", + "exit_time": "2023-10-11T00:00:00", + "pnl": -22.921257119754955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49382854321888, + "entry_time": "2023-10-13T00:00:00", + "exit_price": 92.15699292788067, + "exit_reason": "signal", + "exit_time": "2023-10-14T00:00:00", + "pnl": -33.683561533820466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04266303105983, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.9313781112256, + "exit_reason": "signal", + "exit_time": "2023-10-17T00:00:00", + "pnl": -11.128491983423373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.69530603069572, + "entry_time": "2023-10-19T00:00:00", + "exit_price": 91.82075180753827, + "exit_reason": "signal", + "exit_time": "2023-10-20T00:00:00", + "pnl": 12.544577684255273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.00003866180036, + "entry_time": "2023-10-22T00:00:00", + "exit_price": 91.769068469798, + "exit_reason": "signal", + "exit_time": "2023-10-23T00:00:00", + "pnl": -23.09701920023508, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62148930928706, + "entry_time": "2023-10-25T00:00:00", + "exit_price": 92.0232146586156, + "exit_reason": "signal", + "exit_time": "2023-10-26T00:00:00", + "pnl": 40.17253493285352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05026787864644, + "entry_time": "2023-10-28T00:00:00", + "exit_price": 91.7648966725291, + "exit_reason": "signal", + "exit_time": "2023-10-29T00:00:00", + "pnl": -28.53712061173428, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45047976504434, + "entry_time": "2023-10-31T00:00:00", + "exit_price": 91.57906184617835, + "exit_reason": "signal", + "exit_time": "2023-11-01T00:00:00", + "pnl": 12.858208113402725, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73227416508321, + "entry_time": "2023-11-03T00:00:00", + "exit_price": 91.39276167792192, + "exit_reason": "signal", + "exit_time": "2023-11-04T00:00:00", + "pnl": -33.95124871613007, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43027834183452, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.72614964359053, + "exit_reason": "signal", + "exit_time": "2023-11-07T00:00:00", + "pnl": 29.58713017559967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22140030401876, + "entry_time": "2023-11-09T00:00:00", + "exit_price": 92.40388767907393, + "exit_reason": "signal", + "exit_time": "2023-11-10T00:00:00", + "pnl": 18.248737505517056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6481057355818, + "entry_time": "2023-11-12T00:00:00", + "exit_price": 92.68848188004498, + "exit_reason": "signal", + "exit_time": "2023-11-13T00:00:00", + "pnl": 4.037614446318912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71473698288804, + "entry_time": "2023-11-15T00:00:00", + "exit_price": 92.70268409440689, + "exit_reason": "signal", + "exit_time": "2023-11-16T00:00:00", + "pnl": -1.2052888481157424, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.43854075921617, + "entry_time": "2023-11-18T00:00:00", + "exit_price": 92.44140071332018, + "exit_reason": "signal", + "exit_time": "2023-11-19T00:00:00", + "pnl": 0.28599541040057375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74726961853332, + "entry_time": "2023-11-21T00:00:00", + "exit_price": 92.8365056762946, + "exit_reason": "signal", + "exit_time": "2023-11-22T00:00:00", + "pnl": 8.92360577612817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88893089201021, + "entry_time": "2023-11-24T00:00:00", + "exit_price": 93.26317095880032, + "exit_reason": "signal", + "exit_time": "2023-11-25T00:00:00", + "pnl": 37.424006679009835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37686063355893, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 93.01130398358468, + "exit_reason": "signal", + "exit_time": "2023-11-28T00:00:00", + "pnl": -36.55566499742599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92441725059159, + "entry_time": "2023-11-30T00:00:00", + "exit_price": 92.89449208176279, + "exit_reason": "signal", + "exit_time": "2023-12-01T00:00:00", + "pnl": -2.9925168828794995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93827683979755, + "entry_time": "2023-12-03T00:00:00", + "exit_price": 93.6532995649937, + "exit_reason": "signal", + "exit_time": "2023-12-04T00:00:00", + "pnl": -28.49772748038413, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4263959037515, + "entry_time": "2023-12-06T00:00:00", + "exit_price": 93.75213347979019, + "exit_reason": "signal", + "exit_time": "2023-12-07T00:00:00", + "pnl": 32.573757603870035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.0270700566813, + "entry_time": "2023-12-09T00:00:00", + "exit_price": 93.76146992741955, + "exit_reason": "signal", + "exit_time": "2023-12-10T00:00:00", + "pnl": -26.56001292617475, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10225140410179, + "entry_time": "2023-12-12T00:00:00", + "exit_price": 92.81690399898379, + "exit_reason": "signal", + "exit_time": "2023-12-13T00:00:00", + "pnl": -28.5347405117991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0438108934807, + "entry_time": "2023-12-15T00:00:00", + "exit_price": 92.80207795946215, + "exit_reason": "signal", + "exit_time": "2023-12-16T00:00:00", + "pnl": -24.173293401854608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12592905184013, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 93.15713134695487, + "exit_reason": "signal", + "exit_time": "2023-12-19T00:00:00", + "pnl": 3.120229511472644, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21575520670791, + "entry_time": "2023-12-21T00:00:00", + "exit_price": 93.31507102860735, + "exit_reason": "signal", + "exit_time": "2023-12-22T00:00:00", + "pnl": 9.931582189943583, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2320901589937, + "entry_time": "2023-12-24T00:00:00", + "exit_price": 93.15393731859652, + "exit_reason": "signal", + "exit_time": "2023-12-25T00:00:00", + "pnl": -7.815284039717881, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07037591089997, + "entry_time": "2023-12-27T00:00:00", + "exit_price": 93.3198194947649, + "exit_reason": "signal", + "exit_time": "2023-12-28T00:00:00", + "pnl": 24.94435838649406, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69216760463115, + "entry_time": "2023-12-30T00:00:00", + "exit_price": 94.07388089953058, + "exit_reason": "signal", + "exit_time": "2023-12-31T00:00:00", + "pnl": 38.171329489941854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.64149353573187, + "entry_time": "2024-01-02T00:00:00", + "exit_price": 94.71271228263036, + "exit_reason": "signal", + "exit_time": "2024-01-03T00:00:00", + "pnl": 7.121874689850301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.11471503048601, + "entry_time": "2024-01-05T00:00:00", + "exit_price": 94.98751858071931, + "exit_reason": "signal", + "exit_time": "2024-01-06T00:00:00", + "pnl": -12.71964497666886, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7067835294734, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.74844014533139, + "exit_reason": "signal", + "exit_time": "2024-01-09T00:00:00", + "pnl": 4.165661585799171, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.02489656616589, + "entry_time": "2024-01-11T00:00:00", + "exit_price": 94.98294992874101, + "exit_reason": "signal", + "exit_time": "2024-01-12T00:00:00", + "pnl": -4.194663742489865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.71598064705562, + "entry_time": "2024-01-14T00:00:00", + "exit_price": 94.90144093756582, + "exit_reason": "signal", + "exit_time": "2024-01-15T00:00:00", + "pnl": 18.546029051020014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88369269337046, + "entry_time": "2024-01-17T00:00:00", + "exit_price": 94.99127786199946, + "exit_reason": "signal", + "exit_time": "2024-01-18T00:00:00", + "pnl": 10.758516862899342, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.25279588129149, + "entry_time": "2024-01-20T00:00:00", + "exit_price": 94.98339215080473, + "exit_reason": "signal", + "exit_time": "2024-01-21T00:00:00", + "pnl": -26.94037304867561, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84625570624047, + "entry_time": "2024-01-23T00:00:00", + "exit_price": 94.50594333071952, + "exit_reason": "signal", + "exit_time": "2024-01-24T00:00:00", + "pnl": -34.03123755209526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50759103681195, + "entry_time": "2024-01-26T00:00:00", + "exit_price": 94.60423833142119, + "exit_reason": "signal", + "exit_time": "2024-01-27T00:00:00", + "pnl": 9.664729460924718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.58324904624199, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.89219195707862, + "exit_reason": "signal", + "exit_time": "2024-01-30T00:00:00", + "pnl": 30.89429108366494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65911048978346, + "entry_time": "2024-02-01T00:00:00", + "exit_price": 94.7149396953146, + "exit_reason": "signal", + "exit_time": "2024-02-02T00:00:00", + "pnl": 5.5829205531154, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.87432845164757, + "entry_time": "2024-02-04T00:00:00", + "exit_price": 94.68840177129488, + "exit_reason": "signal", + "exit_time": "2024-02-05T00:00:00", + "pnl": -18.592668035269526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.93449198055023, + "entry_time": "2024-02-07T00:00:00", + "exit_price": 95.32948554144308, + "exit_reason": "signal", + "exit_time": "2024-02-08T00:00:00", + "pnl": 39.49935608928536, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.32849848634218, + "entry_time": "2024-02-10T00:00:00", + "exit_price": 95.22062659109166, + "exit_reason": "signal", + "exit_time": "2024-02-11T00:00:00", + "pnl": -10.787189525051872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95224360650606, + "entry_time": "2024-02-13T00:00:00", + "exit_price": 95.11404601693097, + "exit_reason": "signal", + "exit_time": "2024-02-14T00:00:00", + "pnl": 16.180241042491616, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79369852289173, + "entry_time": "2024-02-16T00:00:00", + "exit_price": 94.57121837540416, + "exit_reason": "signal", + "exit_time": "2024-02-17T00:00:00", + "pnl": -22.248014748758578, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70539792020504, + "entry_time": "2024-02-19T00:00:00", + "exit_price": 94.81536726931864, + "exit_reason": "signal", + "exit_time": "2024-02-20T00:00:00", + "pnl": 10.996934911359858, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.66590107949516, + "entry_time": "2024-02-22T00:00:00", + "exit_price": 94.54759559550845, + "exit_reason": "signal", + "exit_time": "2024-02-23T00:00:00", + "pnl": -11.830548398671453, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11939973938362, + "entry_time": "2024-02-25T00:00:00", + "exit_price": 94.21880305870137, + "exit_reason": "signal", + "exit_time": "2024-02-26T00:00:00", + "pnl": 9.940331931773471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79422563292844, + "entry_time": "2024-02-28T00:00:00", + "exit_price": 93.71312689925841, + "exit_reason": "signal", + "exit_time": "2024-02-29T00:00:00", + "pnl": -8.109873367004184, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46426831854224, + "entry_time": "2024-03-02T00:00:00", + "exit_price": 93.10239283352094, + "exit_reason": "signal", + "exit_time": "2024-03-03T00:00:00", + "pnl": -36.187548502130085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.37028780606191, + "entry_time": "2024-03-05T00:00:00", + "exit_price": 93.13498012432488, + "exit_reason": "signal", + "exit_time": "2024-03-06T00:00:00", + "pnl": -23.53076817370311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.38863630293943, + "entry_time": "2024-03-08T00:00:00", + "exit_price": 93.41150008980253, + "exit_reason": "signal", + "exit_time": "2024-03-09T00:00:00", + "pnl": 2.2863786863108544, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.14488289984781, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.17802365337732, + "exit_reason": "signal", + "exit_time": "2024-03-12T00:00:00", + "pnl": 3.314075352951477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27104619189048, + "entry_time": "2024-03-14T00:00:00", + "exit_price": 92.98787909982833, + "exit_reason": "signal", + "exit_time": "2024-03-15T00:00:00", + "pnl": -28.316709206214, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11321145433928, + "entry_time": "2024-03-17T00:00:00", + "exit_price": 93.23295576374296, + "exit_reason": "signal", + "exit_time": "2024-03-18T00:00:00", + "pnl": 11.97443094036862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.85697546574279, + "entry_time": "2024-03-20T00:00:00", + "exit_price": 92.7517321560528, + "exit_reason": "signal", + "exit_time": "2024-03-21T00:00:00", + "pnl": -10.524330968999493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50551757491745, + "entry_time": "2024-03-23T00:00:00", + "exit_price": 92.62546167858358, + "exit_reason": "signal", + "exit_time": "2024-03-24T00:00:00", + "pnl": 11.99441036661301, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86332633060258, + "entry_time": "2024-03-26T00:00:00", + "exit_price": 92.76299264885851, + "exit_reason": "signal", + "exit_time": "2024-03-27T00:00:00", + "pnl": -10.03336817440686, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78913797285577, + "entry_time": "2024-03-29T00:00:00", + "exit_price": 93.00024160373006, + "exit_reason": "signal", + "exit_time": "2024-03-30T00:00:00", + "pnl": 21.110363087429505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9168412948554, + "entry_time": "2024-04-01T00:00:00", + "exit_price": 92.7772709282975, + "exit_reason": "signal", + "exit_time": "2024-04-02T00:00:00", + "pnl": -13.957036655790944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99344762670124, + "entry_time": "2024-04-04T00:00:00", + "exit_price": 92.45458704231757, + "exit_reason": "signal", + "exit_time": "2024-04-05T00:00:00", + "pnl": -53.8860584383674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.40001356367094, + "entry_time": "2024-04-07T00:00:00", + "exit_price": 91.97082046191717, + "exit_reason": "signal", + "exit_time": "2024-04-08T00:00:00", + "pnl": -42.91931017537718, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01206001173375, + "entry_time": "2024-04-10T00:00:00", + "exit_price": 92.08005345968613, + "exit_reason": "signal", + "exit_time": "2024-04-11T00:00:00", + "pnl": 6.79934479523763, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.22217203577799, + "entry_time": "2024-04-13T00:00:00", + "exit_price": 92.2425856744218, + "exit_reason": "signal", + "exit_time": "2024-04-14T00:00:00", + "pnl": 2.0413638643822196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.46073627278375, + "entry_time": "2024-04-16T00:00:00", + "exit_price": 92.58143591458905, + "exit_reason": "signal", + "exit_time": "2024-04-17T00:00:00", + "pnl": 12.069964180531315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95177802714637, + "entry_time": "2024-04-19T00:00:00", + "exit_price": 92.56745694254103, + "exit_reason": "signal", + "exit_time": "2024-04-20T00:00:00", + "pnl": -38.43210846053444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81253269752307, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 92.86554139490539, + "exit_reason": "signal", + "exit_time": "2024-04-23T00:00:00", + "pnl": 5.300869738231995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90464875740813, + "entry_time": "2024-04-25T00:00:00", + "exit_price": 92.96373746132312, + "exit_reason": "signal", + "exit_time": "2024-04-26T00:00:00", + "pnl": 5.908870391500386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09789228558353, + "entry_time": "2024-04-28T00:00:00", + "exit_price": 93.19003786584736, + "exit_reason": "signal", + "exit_time": "2024-04-29T00:00:00", + "pnl": 9.214558026382292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66999752477344, + "entry_time": "2024-05-01T00:00:00", + "exit_price": 92.45706703230238, + "exit_reason": "signal", + "exit_time": "2024-05-02T00:00:00", + "pnl": -21.293049247105955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2209401021726, + "entry_time": "2024-05-04T00:00:00", + "exit_price": 93.26995519560073, + "exit_reason": "signal", + "exit_time": "2024-05-05T00:00:00", + "pnl": 4.901509342811551, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23034844043512, + "entry_time": "2024-05-07T00:00:00", + "exit_price": 93.41387280572972, + "exit_reason": "signal", + "exit_time": "2024-05-08T00:00:00", + "pnl": 18.352436529459737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33303611955198, + "entry_time": "2024-05-10T00:00:00", + "exit_price": 93.52307299324875, + "exit_reason": "signal", + "exit_time": "2024-05-11T00:00:00", + "pnl": 19.00368736967721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.67190914597171, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.29815694731651, + "exit_reason": "signal", + "exit_time": "2024-05-14T00:00:00", + "pnl": -37.375219865520194, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.11959184333037, + "entry_time": "2024-05-16T00:00:00", + "exit_price": 92.78483612314953, + "exit_reason": "signal", + "exit_time": "2024-05-17T00:00:00", + "pnl": -33.47557201808377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92001295323621, + "entry_time": "2024-05-19T00:00:00", + "exit_price": 92.94709162208174, + "exit_reason": "signal", + "exit_time": "2024-05-20T00:00:00", + "pnl": 2.7078668845515494, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06260774305197, + "entry_time": "2024-05-22T00:00:00", + "exit_price": 93.1459174166961, + "exit_reason": "signal", + "exit_time": "2024-05-23T00:00:00", + "pnl": 8.330967364412572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06618787236135, + "entry_time": "2024-05-25T00:00:00", + "exit_price": 93.61303967582782, + "exit_reason": "signal", + "exit_time": "2024-05-26T00:00:00", + "pnl": 54.68518034664703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.941078352886, + "entry_time": "2024-05-28T00:00:00", + "exit_price": 94.01481054814181, + "exit_reason": "signal", + "exit_time": "2024-05-29T00:00:00", + "pnl": 7.3732195255815896, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92069860353018, + "entry_time": "2024-05-31T00:00:00", + "exit_price": 93.87432907187284, + "exit_reason": "signal", + "exit_time": "2024-06-01T00:00:00", + "pnl": -4.636953165734667, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88014313205952, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.43750435674885, + "exit_reason": "signal", + "exit_time": "2024-06-04T00:00:00", + "pnl": -44.2638775310661, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.46298718335747, + "entry_time": "2024-06-06T00:00:00", + "exit_price": 93.92373570713617, + "exit_reason": "signal", + "exit_time": "2024-06-07T00:00:00", + "pnl": 46.07485237786932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93253015033825, + "entry_time": "2024-06-09T00:00:00", + "exit_price": 93.89138819536463, + "exit_reason": "signal", + "exit_time": "2024-06-10T00:00:00", + "pnl": -4.1141954973609245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6779918521803, + "entry_time": "2024-06-12T00:00:00", + "exit_price": 93.51002812881958, + "exit_reason": "signal", + "exit_time": "2024-06-13T00:00:00", + "pnl": -16.796372336071727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.285974590119, + "entry_time": "2024-06-15T00:00:00", + "exit_price": 93.32248822367578, + "exit_reason": "signal", + "exit_time": "2024-06-16T00:00:00", + "pnl": 3.651363355676949, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35524577583958, + "entry_time": "2024-06-18T00:00:00", + "exit_price": 93.73566009456992, + "exit_reason": "signal", + "exit_time": "2024-06-19T00:00:00", + "pnl": 38.041431873034526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.6866778828559, + "entry_time": "2024-06-21T00:00:00", + "exit_price": 93.84911622521342, + "exit_reason": "signal", + "exit_time": "2024-06-22T00:00:00", + "pnl": 16.24383423575091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68254626297609, + "entry_time": "2024-06-24T00:00:00", + "exit_price": 93.53753290340698, + "exit_reason": "signal", + "exit_time": "2024-06-25T00:00:00", + "pnl": -14.501335956909315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.40541279646611, + "entry_time": "2024-06-27T00:00:00", + "exit_price": 93.71834890975212, + "exit_reason": "signal", + "exit_time": "2024-06-28T00:00:00", + "pnl": 31.2936113286014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.75716070422646, + "entry_time": "2024-06-30T00:00:00", + "exit_price": 93.82803454081426, + "exit_reason": "signal", + "exit_time": "2024-07-01T00:00:00", + "pnl": 7.0873836587798, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73900139072163, + "entry_time": "2024-07-03T00:00:00", + "exit_price": 93.58423325500644, + "exit_reason": "signal", + "exit_time": "2024-07-04T00:00:00", + "pnl": -15.476813571518505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16188235681071, + "entry_time": "2024-07-06T00:00:00", + "exit_price": 93.02650792631081, + "exit_reason": "signal", + "exit_time": "2024-07-07T00:00:00", + "pnl": -13.537443049990543, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00049424696184, + "entry_time": "2024-07-09T00:00:00", + "exit_price": 93.27869714616556, + "exit_reason": "signal", + "exit_time": "2024-07-10T00:00:00", + "pnl": 27.82028992037158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.18595899862997, + "entry_time": "2024-07-12T00:00:00", + "exit_price": 93.03056917274476, + "exit_reason": "signal", + "exit_time": "2024-07-13T00:00:00", + "pnl": -15.538982588521321, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.6959315804981, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.29325844026822, + "exit_reason": "signal", + "exit_time": "2024-07-16T00:00:00", + "pnl": -40.26731402298719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24617524245163, + "entry_time": "2024-07-18T00:00:00", + "exit_price": 92.27923511016385, + "exit_reason": "signal", + "exit_time": "2024-07-19T00:00:00", + "pnl": 3.3059867712217965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24377176084563, + "entry_time": "2024-07-21T00:00:00", + "exit_price": 91.84290901749984, + "exit_reason": "signal", + "exit_time": "2024-07-22T00:00:00", + "pnl": -40.086274334578775, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.45792359801233, + "entry_time": "2024-07-24T00:00:00", + "exit_price": 91.61079046047253, + "exit_reason": "signal", + "exit_time": "2024-07-25T00:00:00", + "pnl": 15.286686246019599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59272403631071, + "entry_time": "2024-07-27T00:00:00", + "exit_price": 91.6658144632232, + "exit_reason": "signal", + "exit_time": "2024-07-28T00:00:00", + "pnl": 7.309042691247669, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76765880138052, + "entry_time": "2024-07-30T00:00:00", + "exit_price": 91.83153611139085, + "exit_reason": "signal", + "exit_time": "2024-07-31T00:00:00", + "pnl": 6.387731001033899, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47875371686978, + "entry_time": "2024-08-02T00:00:00", + "exit_price": 91.54124524065837, + "exit_reason": "signal", + "exit_time": "2024-08-03T00:00:00", + "pnl": 6.249152378859435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.99233076398606, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.9529292158228, + "exit_reason": "signal", + "exit_time": "2024-08-06T00:00:00", + "pnl": -3.9401548163259577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9845811375129, + "entry_time": "2024-08-08T00:00:00", + "exit_price": 92.0553452779518, + "exit_reason": "signal", + "exit_time": "2024-08-09T00:00:00", + "pnl": 7.076414043889599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96933895446485, + "entry_time": "2024-08-11T00:00:00", + "exit_price": 92.33843538273938, + "exit_reason": "signal", + "exit_time": "2024-08-12T00:00:00", + "pnl": 36.909642827453354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7587929540311, + "entry_time": "2024-08-14T00:00:00", + "exit_price": 92.61541170919818, + "exit_reason": "signal", + "exit_time": "2024-08-15T00:00:00", + "pnl": -14.338124483290812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.48109292079488, + "entry_time": "2024-08-17T00:00:00", + "exit_price": 92.584127260661, + "exit_reason": "signal", + "exit_time": "2024-08-18T00:00:00", + "pnl": 10.303433986613527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73326548896145, + "entry_time": "2024-08-20T00:00:00", + "exit_price": 92.63121700232358, + "exit_reason": "signal", + "exit_time": "2024-08-21T00:00:00", + "pnl": -10.204848663786834, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06360781499562, + "entry_time": "2024-08-23T00:00:00", + "exit_price": 92.8561585876055, + "exit_reason": "signal", + "exit_time": "2024-08-24T00:00:00", + "pnl": -20.74492273900978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92284538933916, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.11237349539573, + "exit_reason": "signal", + "exit_time": "2024-08-27T00:00:00", + "pnl": 18.95281060565685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07021236134935, + "entry_time": "2024-08-29T00:00:00", + "exit_price": 93.17184698357968, + "exit_reason": "signal", + "exit_time": "2024-08-30T00:00:00", + "pnl": 10.163462223034003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.31228518791787, + "entry_time": "2024-09-01T00:00:00", + "exit_price": 92.33590023205818, + "exit_reason": "signal", + "exit_time": "2024-09-02T00:00:00", + "pnl": 2.361504414031515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50027778498863, + "entry_time": "2024-09-04T00:00:00", + "exit_price": 92.54209415864854, + "exit_reason": "signal", + "exit_time": "2024-09-05T00:00:00", + "pnl": 4.181637365991264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3677893725537, + "entry_time": "2024-09-07T00:00:00", + "exit_price": 92.22925202091126, + "exit_reason": "signal", + "exit_time": "2024-09-08T00:00:00", + "pnl": -13.853735164244426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09309676612556, + "entry_time": "2024-09-10T00:00:00", + "exit_price": 92.15732000186526, + "exit_reason": "signal", + "exit_time": "2024-09-11T00:00:00", + "pnl": 6.422323573970061, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68995738997093, + "entry_time": "2024-09-13T00:00:00", + "exit_price": 91.28297081793372, + "exit_reason": "signal", + "exit_time": "2024-09-14T00:00:00", + "pnl": -40.69865720372218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.49225030811706, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.33431283007668, + "exit_reason": "signal", + "exit_time": "2024-09-17T00:00:00", + "pnl": -15.793747804038503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00621404043055, + "entry_time": "2024-09-19T00:00:00", + "exit_price": 90.92641929792215, + "exit_reason": "signal", + "exit_time": "2024-09-20T00:00:00", + "pnl": -7.979474250840212, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.07027528339762, + "entry_time": "2024-09-22T00:00:00", + "exit_price": 91.13008155599323, + "exit_reason": "signal", + "exit_time": "2024-09-23T00:00:00", + "pnl": 5.9806272595615155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.00907183642319, + "entry_time": "2024-09-25T00:00:00", + "exit_price": 91.23094904986101, + "exit_reason": "signal", + "exit_time": "2024-09-26T00:00:00", + "pnl": 22.18772134378196, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.2825480931582, + "entry_time": "2024-09-28T00:00:00", + "exit_price": 90.91271666538603, + "exit_reason": "signal", + "exit_time": "2024-09-29T00:00:00", + "pnl": -36.983142777216926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05360990148436, + "entry_time": "2024-10-01T00:00:00", + "exit_price": 91.28838235720163, + "exit_reason": "signal", + "exit_time": "2024-10-02T00:00:00", + "pnl": 23.4772455717266, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79116186423771, + "entry_time": "2024-10-04T00:00:00", + "exit_price": 90.76779759668747, + "exit_reason": "signal", + "exit_time": "2024-10-05T00:00:00", + "pnl": -2.3364267550241493, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66567440561238, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 90.70161264561204, + "exit_reason": "signal", + "exit_time": "2024-10-08T00:00:00", + "pnl": 3.593823999966844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83214429583118, + "entry_time": "2024-10-10T00:00:00", + "exit_price": 90.77606667466077, + "exit_reason": "signal", + "exit_time": "2024-10-11T00:00:00", + "pnl": -5.607762117042512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.66108486881463, + "entry_time": "2024-10-13T00:00:00", + "exit_price": 90.66515259357669, + "exit_reason": "signal", + "exit_time": "2024-10-14T00:00:00", + "pnl": 0.4067724762062426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.16857543076497, + "entry_time": "2024-10-16T00:00:00", + "exit_price": 90.40982511738886, + "exit_reason": "signal", + "exit_time": "2024-10-17T00:00:00", + "pnl": 24.12496866238871, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.06344300783007, + "entry_time": "2024-10-19T00:00:00", + "exit_price": 89.82444237040852, + "exit_reason": "signal", + "exit_time": "2024-10-20T00:00:00", + "pnl": -23.90006374215409, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.59077974741996, + "entry_time": "2024-10-22T00:00:00", + "exit_price": 89.57824858967784, + "exit_reason": "signal", + "exit_time": "2024-10-23T00:00:00", + "pnl": -1.2531157742123469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.18599707786814, + "entry_time": "2024-10-25T00:00:00", + "exit_price": 89.23587599762591, + "exit_reason": "signal", + "exit_time": "2024-10-26T00:00:00", + "pnl": 4.987891975777529, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.52520755360774, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.53896573427002, + "exit_reason": "signal", + "exit_time": "2024-10-29T00:00:00", + "pnl": 1.375818066228021, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32372356389571, + "entry_time": "2024-10-31T00:00:00", + "exit_price": 89.39723460318574, + "exit_reason": "signal", + "exit_time": "2024-11-01T00:00:00", + "pnl": 7.35110392900242, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.42867761884308, + "entry_time": "2024-11-03T00:00:00", + "exit_price": 89.41468909557778, + "exit_reason": "signal", + "exit_time": "2024-11-04T00:00:00", + "pnl": -1.3988523265306867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37521291073797, + "entry_time": "2024-11-06T00:00:00", + "exit_price": 89.28061929510595, + "exit_reason": "signal", + "exit_time": "2024-11-07T00:00:00", + "pnl": -9.459361563202037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.37421531457154, + "entry_time": "2024-11-09T00:00:00", + "exit_price": 89.42880794685172, + "exit_reason": "signal", + "exit_time": "2024-11-10T00:00:00", + "pnl": 5.459263228018244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.10075544827296, + "entry_time": "2024-11-12T00:00:00", + "exit_price": 89.08909178471053, + "exit_reason": "signal", + "exit_time": "2024-11-13T00:00:00", + "pnl": -1.1663663562430884, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.9283105563295, + "entry_time": "2024-11-15T00:00:00", + "exit_price": 88.97631673436179, + "exit_reason": "signal", + "exit_time": "2024-11-16T00:00:00", + "pnl": 4.800617803228306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.83969795208085, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.97701708069182, + "exit_reason": "signal", + "exit_time": "2024-11-19T00:00:00", + "pnl": 13.731912861096134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.24948915106788, + "entry_time": "2024-11-21T00:00:00", + "exit_price": 89.31081866218918, + "exit_reason": "signal", + "exit_time": "2024-11-22T00:00:00", + "pnl": 6.132951112129376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.15663810787721, + "entry_time": "2024-11-24T00:00:00", + "exit_price": 89.05359196348086, + "exit_reason": "signal", + "exit_time": "2024-11-25T00:00:00", + "pnl": -10.30461443963577, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.89974340615646, + "entry_time": "2024-11-27T00:00:00", + "exit_price": 88.86736216937868, + "exit_reason": "signal", + "exit_time": "2024-11-28T00:00:00", + "pnl": -3.238123677778276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.02917974715604, + "entry_time": "2024-11-30T00:00:00", + "exit_price": 89.10061155400963, + "exit_reason": "signal", + "exit_time": "2024-12-01T00:00:00", + "pnl": 7.143180685359766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.71230009060692, + "entry_time": "2024-12-03T00:00:00", + "exit_price": 88.55956047576315, + "exit_reason": "signal", + "exit_time": "2024-12-04T00:00:00", + "pnl": -15.273961484375832, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.vectorbt_oss", + "path": "validation/frameworks/vectorbt_oss.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "ce6e7cf59f08a661ad5efc075866be9e9a9e33011f59b12a18a187c00585a1ac", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" + }, + "framework_target": { + "actual_version": "1.1.0", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "version": "1.1.0" + }, + "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "record_counts": { + "bars": 1800, + "entry_signals": 600, + "exit_signals": 600, + "framework_closed_trades": 600, + "framework_fills": 1200, + "framework_intents": 1200, + "framework_orders": null, + "ml4t_closed_trades": 600, + "ml4t_fills": 1200, + "ml4t_intents": 1200, + "ml4t_orders": null + } + }, + "release_blocking": false, + "required": true, + "scenario_id": "17", + "scenario_name": "High Event Count", "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98208.50651014279, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 1.4551915228366852e-11, + "expected": 98208.50651014278, + "message": "Backtrader=$98,208.5065101428, ML4T=$98,208.5065101428 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1791.49348985721, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 1.4551915228366852e-11, + "expected": -1791.4934898572246, + "message": "Backtrader=$-1,791.4934898572, ML4T=$-1,791.4934898572 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1016.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.0946220352507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -266.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -615.6728551091792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 232.59521379023863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -32.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 4.394524157898559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 148.3674917782546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.03400444082854, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 805.8409540009691, + "pnlcomm": 805.8409540009691, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1016.3741264942132, + "pnlcomm": -1016.3741264942132, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -548.0946220352507, + "pnlcomm": -548.0946220352507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -266.14606876230056, + "pnlcomm": -266.14606876230056, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -615.6728551091788, + "pnlcomm": -615.6728551091788, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 232.59521379023766, + "pnlcomm": 232.59521379023766, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -32.36999674283254, + "pnlcomm": -32.36999674283254, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": 4.394524157898161, + "pnlcomm": 4.394524157898161, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 148.36749177825368, + "pnlcomm": 148.36749177825368, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -504.0340044408296, + "pnlcomm": -504.0340044408296, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "01" + }, "detail": null, + "duration_seconds": 0.19540617195889354, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 0.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98208.50651014278, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": -1791.4934898572246, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 805.8409540009691, + "pnlcomm": 805.8409540009691, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1016.3741264942132, + "pnlcomm": -1016.3741264942132, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -548.0946220352507, + "pnlcomm": -548.0946220352507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -266.14606876230056, + "pnlcomm": -266.14606876230056, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -615.6728551091788, + "pnlcomm": -615.6728551091788, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 232.59521379023766, + "pnlcomm": 232.59521379023766, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -32.36999674283254, + "pnlcomm": -32.36999674283254, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": 4.394524157898161, + "pnlcomm": 4.394524157898161, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 148.36749177825368, + "pnlcomm": 148.36749177825368, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -504.0340044408296, + "pnlcomm": -504.0340044408296, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98208.50651014279, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1791.49348985721, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1016.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.0946220352507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -266.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -615.6728551091792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 232.59521379023863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -32.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 4.394524157898559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 148.3674917782546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.03400444082854, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "01", @@ -330,8 +164228,1371 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98208.50651014279, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 1.4551915228366852e-11, + "expected": 98208.50651014278, + "message": "Backtrader=$98,208.5065101428, ML4T=$98,208.5065101428 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1791.49348985721, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 1.4551915228366852e-11, + "expected": -1791.4934898572246, + "message": "Backtrader=$-1,791.4934898572, ML4T=$-1,791.4934898572 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1016.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.0946220352507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -266.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -615.6728551091792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 232.59521379023863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -32.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 4.394524157898559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 148.3674917782546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.03400444082854, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 805.8409540009691, + "pnlcomm": 805.8409540009691, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1016.3741264942132, + "pnlcomm": -1016.3741264942132, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -548.0946220352507, + "pnlcomm": -548.0946220352507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -266.14606876230056, + "pnlcomm": -266.14606876230056, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -615.6728551091788, + "pnlcomm": -615.6728551091788, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 232.59521379023766, + "pnlcomm": 232.59521379023766, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -32.36999674283254, + "pnlcomm": -32.36999674283254, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": 4.394524157898161, + "pnlcomm": 4.394524157898161, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 148.36749177825368, + "pnlcomm": 148.36749177825368, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -504.0340044408296, + "pnlcomm": -504.0340044408296, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "02" + }, "detail": null, + "duration_seconds": 0.19547894108109176, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 0.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98208.50651014278, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": -1791.4934898572246, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 805.8409540009691, + "pnlcomm": 805.8409540009691, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1016.3741264942132, + "pnlcomm": -1016.3741264942132, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -548.0946220352507, + "pnlcomm": -548.0946220352507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -266.14606876230056, + "pnlcomm": -266.14606876230056, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -615.6728551091788, + "pnlcomm": -615.6728551091788, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 232.59521379023766, + "pnlcomm": 232.59521379023766, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -32.36999674283254, + "pnlcomm": -32.36999674283254, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": 4.394524157898161, + "pnlcomm": 4.394524157898161, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 148.36749177825368, + "pnlcomm": 148.36749177825368, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -504.0340044408296, + "pnlcomm": -504.0340044408296, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98208.50651014279, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1791.49348985721, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1016.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.0946220352507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -266.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -615.6728551091792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 232.59521379023863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -32.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 4.394524157898559, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 148.3674917782546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.03400444082854, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "02", @@ -339,8 +165600,319 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Backtrader=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99550.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99550.0, + "message": "Backtrader=$99,550.0000000000, ML4T=$99,550.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -450.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -450.0, + "message": "Backtrader=$-450.0000000000, ML4T=$-450.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 95.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 95.0, + "message": "Backtrader=$95.0000000000, ML4T=$95.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-07T00:00:00", + "pnl": -450.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-07T00:00:00", + "gross_pnl": -450.0, + "pnl": -450.0, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "03" + }, "detail": null, + "duration_seconds": 0.1770279430784285, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 95.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99550.0, + "framework": "Backtrader", + "num_trades": 1, + "total_pnl": -450.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-07T00:00:00", + "gross_pnl": -450.0, + "pnl": -450.0, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 95.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99550.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -450.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-07T00:00:00", + "pnl": -450.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 20, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "03", @@ -348,8 +165920,319 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Backtrader=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 101000.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 101000.0, + "message": "Backtrader=$101,000.0000000000, ML4T=$101,000.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1000.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 1000.0, + "message": "Backtrader=$1,000.0000000000, ML4T=$1,000.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 110.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 110.5, + "message": "Backtrader=$110.5000000000, ML4T=$110.5000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 110.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-08T00:00:00", + "pnl": 1000.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 110.5, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 1000.0, + "pnl": 1000.0, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "04" + }, "detail": null, + "duration_seconds": 0.17615905008278787, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 110.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 101000.0, + "framework": "Backtrader", + "num_trades": 1, + "total_pnl": 1000.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 110.5, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 1000.0, + "pnl": 1000.0, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 110.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 110.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 101000.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 1000.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 110.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-08T00:00:00", + "pnl": 1000.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 20, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "04", @@ -357,8 +166240,1383 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98031.0184897941, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 2.9103830456733704e-11, + "expected": 98031.01848979408, + "message": "Backtrader=$98,031.0184897941, ML4T=$98,031.0184897941 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1968.9815102058928, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 2.9103830456733704e-11, + "expected": -1968.981510205922, + "message": "Backtrader=$-1,968.9815102059, ML4T=$-1,968.9815102059 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 177.48802034865972, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 177.48802034865972, + "message": "Backtrader=$177.4880203487, ML4T=$177.4880203487 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 20.907368893968922, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.9335851069999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.453032384567653, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1036.8271588787804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.509258015076554, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6038800503272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.057609263326825, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -284.2036780256271, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.595073015246818, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -632.267928124426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.203508441212602, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 216.39170534902604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.42507057068743, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -48.79506731352031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.137909844792375, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": -12.743385686893816, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.52805247625691, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 131.8394393019977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.67113744352359, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.7051418843521, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 20.907368893968922, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 784.9335851070001, + "pnlcomm": 784.9335851070001, + "size": 100 + }, + { + "asset": "TEST", + "commission": 20.453032384567653, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1036.827158878781, + "pnlcomm": -1036.827158878781, + "size": 100 + }, + { + "asset": "TEST", + "commission": 18.509258015076554, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -566.6038800503272, + "pnlcomm": -566.6038800503272, + "size": 100 + }, + { + "asset": "TEST", + "commission": 18.057609263326825, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -284.20367802562737, + "pnlcomm": -284.20367802562737, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.595073015246818, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -632.2679281244257, + "pnlcomm": -632.2679281244257, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.203508441212602, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 216.39170534902507, + "pnlcomm": 216.39170534902507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.42507057068743, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -48.79506731351997, + "pnlcomm": -48.79506731351997, + "size": 100 + }, + { + "asset": "TEST", + "commission": 17.137909844792375, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": -12.743385686894214, + "pnlcomm": -12.743385686894214, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.52805247625691, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 131.83943930199678, + "pnlcomm": 131.83943930199678, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.67113744352359, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -520.7051418843532, + "pnlcomm": -520.7051418843532, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 10.050763969983976, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.856604923984944, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.734703255530933, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.71832912903672, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.528676318555902, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.980581696520652, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.161877666044562, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.895731597282262, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.605372935177998, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.989700080068819, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.9854566137111815, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.218051827501421, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.228720283715132, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.196350286972299, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.566757660317238, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.571152184475137, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.189842492239329, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.338209984017583, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.58758572398221, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.083551719541381, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 10.050763969983976, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.856604923984944, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.734703255530933, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.71832912903672, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.528676318555902, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.980581696520652, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.161877666044562, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.895731597282262, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.605372935178, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.989700080068819, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.985456613711182, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.21805182750142, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.228720283715132, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.1963502869723, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.566757660317238, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.571152184475137, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.189842492239329, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.338209984017583, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.58758572398221, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.083551719541381, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "05" + }, "detail": null, + "duration_seconds": 0.19230420584790409, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 177.48802034865972 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.050763969983976, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.856604923984944, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.734703255530933, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.71832912903672, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.528676318555902, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.980581696520652, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.161877666044562, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.895731597282262, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.605372935178, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.989700080068819, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.985456613711182, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.21805182750142, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.228720283715132, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.1963502869723, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.566757660317238, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.571152184475137, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.189842492239329, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.338209984017583, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.58758572398221, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.083551719541381, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98031.01848979408, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": -1968.981510205922, + "trades": [ + { + "asset": "TEST", + "commission": 20.907368893968922, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 784.9335851070001, + "pnlcomm": 784.9335851070001, + "size": 100 + }, + { + "asset": "TEST", + "commission": 20.453032384567653, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1036.827158878781, + "pnlcomm": -1036.827158878781, + "size": 100 + }, + { + "asset": "TEST", + "commission": 18.509258015076554, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -566.6038800503272, + "pnlcomm": -566.6038800503272, + "size": 100 + }, + { + "asset": "TEST", + "commission": 18.057609263326825, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -284.20367802562737, + "pnlcomm": -284.20367802562737, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.595073015246818, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -632.2679281244257, + "pnlcomm": -632.2679281244257, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.203508441212602, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 216.39170534902507, + "pnlcomm": 216.39170534902507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.42507057068743, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -48.79506731351997, + "pnlcomm": -48.79506731351997, + "size": 100 + }, + { + "asset": "TEST", + "commission": 17.137909844792375, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": -12.743385686894214, + "pnlcomm": -12.743385686894214, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.52805247625691, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 131.83943930199678, + "pnlcomm": 131.83943930199678, + "size": 100 + }, + { + "asset": "TEST", + "commission": 16.67113744352359, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -520.7051418843532, + "pnlcomm": -520.7051418843532, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 177.48802034865972 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.050763969983976, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.856604923984944, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.734703255530933, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.71832912903672, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.528676318555902, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.980581696520652, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.161877666044562, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.895731597282262, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.605372935177998, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.989700080068819, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 7.9854566137111815, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.218051827501421, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.228720283715132, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.196350286972299, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.566757660317238, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.571152184475137, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.189842492239329, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.338209984017583, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.58758572398221, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.083551719541381, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98031.0184897941, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1968.9815102058928, + "trades": [ + { + "asset": "TEST", + "commission": 20.907368893968922, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.9335851069999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 20.453032384567653, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1036.8271588787804, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.509258015076554, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6038800503272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.057609263326825, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -284.2036780256271, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.595073015246818, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -632.267928124426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.203508441212602, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 216.39170534902604, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.42507057068743, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -48.79506731352031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 17.137909844792375, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": -12.743385686893816, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.52805247625691, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 131.8394393019977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.67113744352359, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.7051418843521, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "05", @@ -366,8 +167624,1383 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98198.50651014279, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 2.9103830456733704e-11, + "expected": 98198.50651014276, + "message": "Backtrader=$98,198.5065101428, ML4T=$98,198.5065101428 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1801.49348985721, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 2.9103830456733704e-11, + "expected": -1801.4934898572392, + "message": "Backtrader=$-1,801.4934898572, ML4T=$-1,801.4934898572 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 10.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 10.0, + "message": "Backtrader=$10.0000000000, ML4T=$10.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 804.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1017.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -549.0946220352507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -267.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -616.6728551091792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 231.59521379023863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -33.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 3.3945241578985588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 147.3674917782546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -505.03400444082854, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 804.8409540009691, + "pnlcomm": 804.8409540009691, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1017.3741264942132, + "pnlcomm": -1017.3741264942132, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -549.0946220352507, + "pnlcomm": -549.0946220352507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -267.14606876230056, + "pnlcomm": -267.14606876230056, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -616.6728551091788, + "pnlcomm": -616.6728551091788, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 231.59521379023766, + "pnlcomm": 231.59521379023766, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -33.36999674283254, + "pnlcomm": -33.36999674283254, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": 3.394524157898161, + "pnlcomm": 3.394524157898161, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 147.36749177825368, + "pnlcomm": 147.36749177825368, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -505.0340044408296, + "pnlcomm": -505.0340044408296, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.5, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "06" + }, "detail": null, + "duration_seconds": 0.19070344720967114, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 10.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.5, + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 86.05372935177998, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.18051827501421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.71152184475137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 83.38209984017584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98198.50651014276, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": -1801.4934898572392, + "trades": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 805.8409540009691, + "pnl": 804.8409540009691, + "pnlcomm": 804.8409540009691, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1016.3741264942132, + "pnl": -1017.3741264942132, + "pnlcomm": -1017.3741264942132, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -548.0946220352507, + "pnl": -549.0946220352507, + "pnlcomm": -549.0946220352507, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -266.14606876230056, + "pnl": -267.14606876230056, + "pnlcomm": -267.14606876230056, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.05372935177998, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -615.6728551091788, + "pnl": -616.6728551091788, + "pnlcomm": -616.6728551091788, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 232.59521379023766, + "pnl": 231.59521379023766, + "pnlcomm": 231.59521379023766, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -32.36999674283254, + "pnl": -33.36999674283254, + "pnlcomm": -33.36999674283254, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 4.394524157898161, + "pnl": 3.394524157898161, + "pnlcomm": 3.394524157898161, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 148.36749177825368, + "pnl": 147.36749177825368, + "pnlcomm": 147.36749177825368, + "size": 100 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -504.0340044408296, + "pnl": -505.0340044408296, + "pnlcomm": -505.0340044408296, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 10.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 100.50763969983974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 108.56604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 107.34703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 97.1832912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 95.28676318555902, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 89.80581696520652, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 91.61877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 88.95731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 86.05372935177999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 79.89700080068819, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 79.85456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 82.1805182750142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 82.28720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 81.963502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.66757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 85.71152184475136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 81.89842492239329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 83.38209984017583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.8758572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 80.8355171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98198.50651014279, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1801.49348985721, + "trades": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.50763969983974, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.56604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 804.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 107.34703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.1832912903672, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1017.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.28676318555902, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.80581696520652, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -549.0946220352507, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 91.61877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.95731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -267.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.05372935177999, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.89700080068819, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -616.6728551091792, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 79.85456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.1805182750142, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 231.59521379023863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.28720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.963502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -33.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.66757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.71152184475136, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 3.3945241578985588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 81.89842492239329, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.38209984017583, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 147.3674917782546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.8758572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8355171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -505.03400444082854, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "523af2137e8233ef65d03ffb841e91525f65f7c3057b3111e86aedbf0a973fb7" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "06", @@ -375,8 +169008,1371 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98188.50651014278, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 1.4551915228366852e-11, + "expected": 98188.50651014276, + "message": "Backtrader=$98,188.5065101428, ML4T=$98,188.5065101428 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1811.4934898572246, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 1.4551915228366852e-11, + "expected": -1811.4934898572392, + "message": "Backtrader=$-1,811.4934898572, ML4T=$-1,811.4934898572 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.51763969983975, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.55604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 803.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.35703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.17329129036719, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1018.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29676318555903, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.79581696520651, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -550.0946220352525, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.94731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -268.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06372935178, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.88700080068818, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -617.6728551091819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.86456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.17051827501419, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 230.5952137902359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.953502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -34.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.67757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.70152184475135, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 2.39452415789674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.9084249223933, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.37209984017582, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 146.36749177825186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8858572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8255171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -506.03400444083127, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.51763969983975, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.55604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 803.8409540009682, + "pnl": 803.8409540009682, + "pnlcomm": 803.8409540009682, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.35703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.17329129036719, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1018.3741264942142, + "pnl": -1018.3741264942142, + "pnlcomm": -1018.3741264942142, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29676318555903, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.79581696520651, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -550.0946220352517, + "pnl": -550.0946220352517, + "pnlcomm": -550.0946220352517, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.94731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -268.1460687623016, + "pnl": -268.1460687623016, + "pnlcomm": -268.1460687623016, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06372935178, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.88700080068818, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -617.6728551091812, + "pnl": -617.6728551091812, + "pnlcomm": -617.6728551091812, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.86456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.17051827501419, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 230.59521379023664, + "pnl": 230.59521379023664, + "pnlcomm": 230.59521379023664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.953502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -34.369996742833564, + "pnl": -34.369996742833564, + "pnlcomm": -34.369996742833564, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.67757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.70152184475135, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 2.3945241578971377, + "pnl": 2.3945241578971377, + "pnlcomm": 2.3945241578971377, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.9084249223933, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.37209984017582, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 146.36749177825266, + "pnl": 146.36749177825266, + "pnlcomm": 146.36749177825266, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8858572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8255171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -506.03400444083064, + "pnl": -506.03400444083064, + "pnlcomm": -506.03400444083064, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.51763969983975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.55604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.35703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.17329129036719, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.29676318555903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.79581696520651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.94731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.06372935178, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.88700080068818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.86456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.17051827501419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.29720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.953502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.67757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.70152184475135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.9084249223933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.37209984017582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.8858572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.8255171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.51763969983975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.55604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.35703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1732912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.29676318555903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.7958169652065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.94731597282262, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.06372935178, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.88700080068818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.86456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.17051827501419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.29720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.953502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.67757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.70152184475135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.9084249223933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.37209984017582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.8858572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.8255171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "07" + }, "detail": null, + "duration_seconds": 0.18997658719308674, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 0.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.51763969983975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.55604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.35703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.1732912903672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.29676318555903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.7958169652065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.94731597282262, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.06372935178, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.88700080068818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.86456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.17051827501419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.29720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.953502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.67757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.70152184475135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.9084249223933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.37209984017582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.8858572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.8255171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98188.50651014276, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": -1811.4934898572392, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.51763969983975, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.55604923984943, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 803.8409540009682, + "pnl": 803.8409540009682, + "pnlcomm": 803.8409540009682, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.35703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.17329129036719, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1018.3741264942142, + "pnl": -1018.3741264942142, + "pnlcomm": -1018.3741264942142, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29676318555903, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.79581696520651, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -550.0946220352517, + "pnl": -550.0946220352517, + "pnlcomm": -550.0946220352517, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.94731597282261, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -268.1460687623016, + "pnl": -268.1460687623016, + "pnlcomm": -268.1460687623016, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06372935178, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.88700080068818, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -617.6728551091812, + "pnl": -617.6728551091812, + "pnlcomm": -617.6728551091812, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.86456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.17051827501419, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 230.59521379023664, + "pnl": 230.59521379023664, + "pnlcomm": 230.59521379023664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.953502869723, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -34.369996742833564, + "pnl": -34.369996742833564, + "pnlcomm": -34.369996742833564, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.67757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.70152184475135, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": 2.3945241578971377, + "pnl": 2.3945241578971377, + "pnlcomm": 2.3945241578971377, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.9084249223933, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.37209984017582, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 146.36749177825266, + "pnl": 146.36749177825266, + "pnlcomm": 146.36749177825266, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8858572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8255171954138, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -506.03400444083064, + "pnl": -506.03400444083064, + "pnlcomm": -506.03400444083064, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.51763969983975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.55604923984943, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.35703255530933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.17329129036719, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.29676318555903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.79581696520651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.62877666044562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.94731597282261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.06372935178, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.88700080068818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.86456613711182, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.17051827501419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.29720283715133, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.953502869723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.67757660317238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.70152184475135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.9084249223933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.37209984017582, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.8858572398221, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.8255171954138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98188.50651014278, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1811.4934898572246, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.51763969983975, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.55604923984943, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 803.8409540009688, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.35703255530933, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.17329129036719, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1018.3741264942128, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29676318555903, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.79581696520651, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -550.0946220352525, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.62877666044562, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.94731597282261, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -268.1460687623003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06372935178, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.88700080068818, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -617.6728551091819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.86456613711182, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.17051827501419, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 230.5952137902359, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29720283715133, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.953502869723, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -34.36999674283288, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.67757660317238, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.70152184475135, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 2.39452415789674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.9084249223933, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.37209984017582, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 146.36749177825186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.8858572398221, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.8255171954138, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -506.03400444083127, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "07", @@ -384,8 +170380,1371 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98031.01848979409, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 1.4551915228366852e-11, + "expected": 98031.0184897941, + "message": "Backtrader=$98,031.0184897941, ML4T=$98,031.0184897941 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1968.9815102059074, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 1.4551915228366852e-11, + "expected": -1968.9815102058928, + "message": "Backtrader=$-1,968.9815102059, ML4T=$-1,968.9815102059 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.60814733953958, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.45748319060958, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.9335851069991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.45437958786464, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.08610799907683, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1036.8271588787811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38204994874458, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.71601114824131, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6038800503284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.71039543710606, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.8683586568498, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -284.2036780256258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.13978308113177, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.8171037998875, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -632.2679281244264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.93442070324893, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.09833775673918, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 216.39170534902496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.36949003998848, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.88153936685327, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -48.79506731352103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.75324417977555, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.6258103229066, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": -12.743385686895635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.98032334731569, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.29871774033565, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 131.8394393019953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.96173309706192, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.75468167821839, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.705141884353, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.60814733953957, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.45748319060958, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 784.9335851070009, + "pnl": 784.9335851070009, + "pnlcomm": 784.9335851070009, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.45437958786462, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.08610799907683, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1036.8271588787793, + "pnl": -1036.8271588787793, + "pnlcomm": -1036.8271588787793, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.3820499487446, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.71601114824131, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -566.6038800503287, + "pnl": -566.6038800503287, + "pnlcomm": -566.6038800503287, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.71039543710606, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.8683586568498, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -284.2036780256265, + "pnl": -284.2036780256265, + "pnlcomm": -284.2036780256265, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.13978308113177, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.8171037998875, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -632.2679281244262, + "pnl": -632.2679281244262, + "pnlcomm": -632.2679281244262, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.93442070324892, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.09833775673918, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 216.3917053490266, + "pnl": 216.3917053490266, + "pnlcomm": 216.3917053490266, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.36949003998846, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.88153936685327, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -48.795067313518814, + "pnl": -48.795067313518814, + "pnlcomm": -48.795067313518814, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.75324417977554, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.6258103229066, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": -12.743385686893305, + "pnl": -12.743385686893305, + "pnlcomm": -12.743385686893305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.98032334731568, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.29871774033565, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 131.83943930199717, + "pnl": 131.83943930199717, + "pnlcomm": 131.83943930199717, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.96173309706191, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.75468167821839, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -520.705141884352, + "pnl": -520.705141884352, + "pnlcomm": -520.705141884352, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.60814733953958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.45748319060958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.45437958786464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.08610799907683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.38204994874458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.71601114824131, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.71039543710606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.8683586568498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.13978308113177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.8171037998875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.93442070324893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.09833775673918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.36949003998848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.88153936685327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.75324417977555, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.6258103229066, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.98032334731569, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.29871774033565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.96173309706192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.75468167821839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.60814733953957, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.45748319060958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.45437958786462, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.08610799907683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.3820499487446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.71601114824131, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.71039543710606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.8683586568498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.13978308113177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.8171037998875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.93442070324892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.09833775673918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.36949003998846, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.88153936685327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.75324417977554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.6258103229066, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.98032334731568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.29871774033565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.96173309706191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.75468167821839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "08" + }, "detail": null, + "duration_seconds": 0.19215964106842875, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 0.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.60814733953957, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.45748319060958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 107.45437958786462, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.08610799907683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.3820499487446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.71601114824131, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.71039543710606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.8683586568498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.13978308113177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.8171037998875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.93442070324892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.09833775673918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.36949003998846, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.88153936685327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.75324417977554, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.6258103229066, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.98032334731568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.29871774033565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.96173309706191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.75468167821839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98031.0184897941, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": -1968.9815102058928, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.60814733953957, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.45748319060958, + "exit_time": "2020-01-08T00:00:00", + "gross_pnl": 784.9335851070009, + "pnl": 784.9335851070009, + "pnlcomm": 784.9335851070009, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.45437958786462, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.08610799907683, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": -1036.8271588787793, + "pnl": -1036.8271588787793, + "pnlcomm": -1036.8271588787793, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.3820499487446, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.71601114824131, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -566.6038800503287, + "pnl": -566.6038800503287, + "pnlcomm": -566.6038800503287, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.71039543710606, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.8683586568498, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": -284.2036780256265, + "pnl": -284.2036780256265, + "pnlcomm": -284.2036780256265, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.13978308113177, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.8171037998875, + "exit_time": "2020-02-17T00:00:00", + "gross_pnl": -632.2679281244262, + "pnl": -632.2679281244262, + "pnlcomm": -632.2679281244262, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.93442070324892, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.09833775673918, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": 216.3917053490266, + "pnl": 216.3917053490266, + "pnlcomm": 216.3917053490266, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.36949003998846, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.88153936685327, + "exit_time": "2020-03-08T00:00:00", + "gross_pnl": -48.795067313518814, + "pnl": -48.795067313518814, + "pnlcomm": -48.795067313518814, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.75324417977554, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.6258103229066, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": -12.743385686893305, + "pnl": -12.743385686893305, + "pnlcomm": -12.743385686893305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.98032334731568, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.29871774033565, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": 131.83943930199717, + "pnl": 131.83943930199717, + "pnlcomm": 131.83943930199717, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.96173309706191, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.75468167821839, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": -520.705141884352, + "pnl": -520.705141884352, + "pnlcomm": -520.705141884352, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.60814733953958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.45748319060958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.45437958786464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.08610799907683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.38204994874458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.71601114824131, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.71039543710606, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.8683586568498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.13978308113177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.8171037998875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 79.93442070324893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.09833775673918, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.36949003998848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.88153936685327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.75324417977555, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.6258103229066, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 81.98032334731569, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 83.29871774033565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.96173309706192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.75468167821839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 98031.01848979409, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": -1968.9815102059074, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.60814733953958, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.45748319060958, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.9335851069991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 107.45437958786464, + "entry_time": "2020-01-13T00:00:00", + "exit_price": 97.08610799907683, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": -1036.8271588787811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.38204994874458, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.71601114824131, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6038800503284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.71039543710606, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 88.8683586568498, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": -284.2036780256258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.13978308113177, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 79.8171037998875, + "exit_reason": "signal", + "exit_time": "2020-02-17T00:00:00", + "pnl": -632.2679281244264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 79.93442070324893, + "entry_time": "2020-02-22T00:00:00", + "exit_price": 82.09833775673918, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": 216.39170534902496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.36949003998848, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 81.88153936685327, + "exit_reason": "signal", + "exit_time": "2020-03-08T00:00:00", + "pnl": -48.79506731352103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.75324417977555, + "entry_time": "2020-03-13T00:00:00", + "exit_price": 85.6258103229066, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": -12.743385686895635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 81.98032334731569, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 83.29871774033565, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": 131.8394393019953, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.96173309706192, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.75468167821839, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.705141884353, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "08", @@ -393,8 +171752,421 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "Backtrader=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100156.1115244063, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 100156.1115244063, + "message": "Backtrader=$100,156.1115244063, ML4T=$100,156.1115244063 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 156.11152440629667, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 156.11152440629667, + "message": "Backtrader=$156.1115244063, ML4T=$156.1115244063 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.71081856450044, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 104.29858222929766, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-02T00:00:00", + "pnl": 358.7763664797221, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42950315678222, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 96.4028547360479, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": -202.66484207343092, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.71081856450044, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 104.29858222929766, + "exit_time": "2020-02-02T00:00:00", + "gross_pnl": 358.77636647972224, + "pnl": 358.77636647972224, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42950315678222, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 96.4028547360479, + "exit_time": "2020-03-04T00:00:00", + "gross_pnl": -202.66484207343183, + "pnl": -202.66484207343183, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.71081856450044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.42950315678222, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.4028547360479, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.71081856450044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42950315678222, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.4028547360479, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "09" + }, "detail": null, + "duration_seconds": 0.1874006330035627, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.71081856450044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42950315678222, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.4028547360479, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 100156.1115244063, + "framework": "Backtrader", + "num_trades": 2, + "total_pnl": 156.11152440629667, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.71081856450044, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 104.29858222929766, + "exit_time": "2020-02-02T00:00:00", + "gross_pnl": 358.77636647972224, + "pnl": 358.77636647972224, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42950315678222, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 96.4028547360479, + "exit_time": "2020-03-04T00:00:00", + "gross_pnl": -202.66484207343183, + "pnl": -202.66484207343183, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.71081856450044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 104.29858222929766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.42950315678222, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 96.4028547360479, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 100156.1115244063, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 156.11152440629667, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.71081856450044, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 104.29858222929766, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-02T00:00:00", + "pnl": 358.7763664797221, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42950315678222, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 96.4028547360479, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": -202.66484207343092, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "09", @@ -402,8 +172174,537 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 3, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 3, + "message": "Backtrader=3, ML4T=3, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99746.27846092179, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99746.27846092179, + "message": "Backtrader=$99,746.2784609218, ML4T=$99,746.2784609218 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -253.72153907820757, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -253.72153907820757, + "message": "Backtrader=$-253.7215390782, ML4T=$-253.7215390782 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.26373067097099, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-15T00:00:00", + "pnl": -526.3730670970981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36091810440048, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 100.49905118623735, + "exit_reason": "take_profit", + "exit_time": "2020-02-12T00:00:00", + "pnl": 813.8133081836877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.04551232721302, + "entry_time": "2020-02-27T00:00:00", + "exit_price": 96.63389452556515, + "exit_reason": "stop_loss", + "exit_time": "2020-03-06T00:00:00", + "pnl": -541.1617801647863, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.26373067097099, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-15T00:00:00", + "gross_pnl": -526.3730670970986, + "pnl": -526.3730670970986, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36091810440048, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 100.49905118623735, + "exit_time": "2020-02-12T00:00:00", + "gross_pnl": 813.813308183687, + "pnl": 813.813308183687, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.04551232721302, + "entry_time": "2020-02-27T00:00:00", + "exit_price": 96.63389452556515, + "exit_time": "2020-03-06T00:00:00", + "gross_pnl": -541.1617801647865, + "pnl": -541.1617801647865, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.26373067097099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36091810440048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 102.04551232721302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.26373067097099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36091810440048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 102.04551232721302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "10" + }, "detail": null, + "duration_seconds": 0.18735090689733624, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.26373067097099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36091810440048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 102.04551232721302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "final_value": 99746.27846092179, + "framework": "Backtrader", + "num_trades": 3, + "total_pnl": -253.72153907820757, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.26373067097099, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_time": "2020-01-15T00:00:00", + "gross_pnl": -526.3730670970986, + "pnl": -526.3730670970986, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36091810440048, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 100.49905118623735, + "exit_time": "2020-02-12T00:00:00", + "gross_pnl": 813.813308183687, + "pnl": 813.813308183687, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.04551232721302, + "entry_time": "2020-02-27T00:00:00", + "exit_price": 96.63389452556515, + "exit_time": "2020-03-06T00:00:00", + "gross_pnl": -541.1617801647865, + "pnl": -541.1617801647865, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.26373067097099, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 95.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36091810440048, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 100.49905118623735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 102.04551232721302, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 96.63389452556515, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-06T00:00:00" + } + ], + "final_value": 99746.27846092179, + "framework": "ml4t.backtest", + "num_trades": 3, + "total_pnl": -253.72153907820757, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.26373067097099, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 95.0, + "exit_reason": "stop_loss", + "exit_time": "2020-01-15T00:00:00", + "pnl": -526.3730670970981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36091810440048, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 100.49905118623735, + "exit_reason": "take_profit", + "exit_time": "2020-02-12T00:00:00", + "pnl": 813.8133081836877, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 102.04551232721302, + "entry_time": "2020-02-27T00:00:00", + "exit_price": 96.63389452556515, + "exit_reason": "stop_loss", + "exit_time": "2020-03-06T00:00:00", + "pnl": -541.1617801647863, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "ca329113ef7eae6ef6cb075659587a244d4808ab35df74a891dcea2db9151f0e" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 3, + "exit_signals": 0, + "framework_closed_trades": 3, + "framework_fills": 6, + "framework_intents": 3, + "framework_orders": null, + "ml4t_closed_trades": 3, + "ml4t_fills": 6, + "ml4t_intents": 3, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "10", @@ -411,8 +172712,1349 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 10, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 10, + "message": "Backtrader=10, ML4T=10, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1001647.2716363404, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 0.0, + "expected": 1001647.2716363404, + "message": "Backtrader=$1,001,647.2716363404, ML4T=$1,001,647.2716363404 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1647.271636340418, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 0.0, + "expected": 1647.271636340418, + "message": "Backtrader=$1,647.2716363404, ML4T=$1,647.2716363404 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.71791520752839, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 96.97480503204176, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": 1074.3110175486636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27021475807082, + "entry_time": "2020-01-28T00:00:00", + "exit_price": 88.76448761173079, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": 150.5727146340032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.27967066143849, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 81.7304119228052, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -145.07412613667202, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.02773863577156, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 85.75713194830126, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": -372.9393312529719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.1473889960404, + "entry_time": "2020-03-28T00:00:00", + "exit_price": 81.41346554365083, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": 173.39234523895811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.17900380032793, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 81.66999422482027, + "exit_reason": "signal", + "exit_time": "2020-04-27T00:00:00", + "pnl": -149.09904244923382, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.80008932877531, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 80.01376127293886, + "exit_reason": "signal", + "exit_time": "2020-05-17T00:00:00", + "pnl": 578.6328055836457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 78.56029941307106, + "entry_time": "2020-05-27T00:00:00", + "exit_price": 80.64101214269384, + "exit_reason": "signal", + "exit_time": "2020-06-06T00:00:00", + "pnl": -208.07127296227736, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.47767320205111, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 85.61788283185616, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": -114.02096298050674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.69954840962144, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 86.10387351845584, + "exit_reason": "signal", + "exit_time": "2020-07-16T00:00:00", + "pnl": 659.56748911656, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.71791520752839, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 96.97480503204176, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": 1074.3110175486636, + "pnl": 1074.3110175486636, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27021475807082, + "entry_time": "2020-01-28T00:00:00", + "exit_price": 88.76448761173079, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": 150.57271463400355, + "pnl": 150.57271463400355, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.27967066143849, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 81.7304119228052, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": -145.07412613667157, + "pnl": -145.07412613667157, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.02773863577154, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 85.75713194830126, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": -372.9393312529723, + "pnl": -372.9393312529723, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.1473889960404, + "entry_time": "2020-03-28T00:00:00", + "exit_price": 81.41346554365083, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": 173.39234523895755, + "pnl": 173.39234523895755, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.17900380032793, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 81.66999422482027, + "exit_time": "2020-04-27T00:00:00", + "gross_pnl": -149.09904244923382, + "pnl": -149.09904244923382, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.80008932877531, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 80.01376127293886, + "exit_time": "2020-05-17T00:00:00", + "gross_pnl": 578.632805583645, + "pnl": 578.632805583645, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 78.56029941307106, + "entry_time": "2020-05-27T00:00:00", + "exit_price": 80.64101214269384, + "exit_time": "2020-06-06T00:00:00", + "gross_pnl": -208.07127296227748, + "pnl": -208.07127296227748, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.47767320205111, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 85.61788283185616, + "exit_time": "2020-06-26T00:00:00", + "gross_pnl": -114.02096298050566, + "pnl": -114.02096298050566, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.69954840962144, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 86.10387351845584, + "exit_time": "2020-07-16T00:00:00", + "gross_pnl": 659.5674891165601, + "pnl": 659.5674891165601, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.71791520752839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.97480503204176, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.27021475807082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.76448761173079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.27967066143849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.7304119228052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.02773863577156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.75713194830126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.1473889960404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.41346554365083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.17900380032793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66999422482027, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.80008932877531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.01376127293886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 78.56029941307106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.64101214269384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 84.47767320205111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.61788283185616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.69954840962144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 86.10387351845584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 107.71791520752839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.97480503204174, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.27021475807082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.76448761173079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.27967066143849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.7304119228052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.02773863577154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.75713194830126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.1473889960404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.41346554365083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.17900380032793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66999422482027, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.80008932877531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.01376127293886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 78.56029941307106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.64101214269384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.47767320205111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.61788283185616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69954840962144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.10387351845584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "11" + }, "detail": null, + "duration_seconds": 0.19880032702349126, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 107.71791520752839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.97480503204174, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.27021475807082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.76448761173079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.27967066143849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.7304119228052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.02773863577154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.75713194830126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.1473889960404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.41346554365083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.17900380032793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.66999422482027, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.80008932877531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.01376127293886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 78.56029941307106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.64101214269384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.47767320205111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.61788283185616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69954840962144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.10387351845584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + } + ], + "final_value": 1001647.2716363404, + "framework": "Backtrader", + "num_trades": 10, + "total_pnl": 1647.271636340418, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.71791520752839, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 96.97480503204176, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": 1074.3110175486636, + "pnl": 1074.3110175486636, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27021475807082, + "entry_time": "2020-01-28T00:00:00", + "exit_price": 88.76448761173079, + "exit_time": "2020-02-07T00:00:00", + "gross_pnl": 150.57271463400355, + "pnl": 150.57271463400355, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.27967066143849, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 81.7304119228052, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": -145.07412613667157, + "pnl": -145.07412613667157, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.02773863577154, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 85.75713194830126, + "exit_time": "2020-03-18T00:00:00", + "gross_pnl": -372.9393312529723, + "pnl": -372.9393312529723, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.1473889960404, + "entry_time": "2020-03-28T00:00:00", + "exit_price": 81.41346554365083, + "exit_time": "2020-04-07T00:00:00", + "gross_pnl": 173.39234523895755, + "pnl": 173.39234523895755, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.17900380032793, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 81.66999422482027, + "exit_time": "2020-04-27T00:00:00", + "gross_pnl": -149.09904244923382, + "pnl": -149.09904244923382, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.80008932877531, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 80.01376127293886, + "exit_time": "2020-05-17T00:00:00", + "gross_pnl": 578.632805583645, + "pnl": 578.632805583645, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 78.56029941307106, + "entry_time": "2020-05-27T00:00:00", + "exit_price": 80.64101214269384, + "exit_time": "2020-06-06T00:00:00", + "gross_pnl": -208.07127296227748, + "pnl": -208.07127296227748, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.47767320205111, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 85.61788283185616, + "exit_time": "2020-06-26T00:00:00", + "gross_pnl": -114.02096298050566, + "pnl": -114.02096298050566, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.69954840962144, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 86.10387351845584, + "exit_time": "2020-07-16T00:00:00", + "gross_pnl": 659.5674891165601, + "pnl": 659.5674891165601, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.71791520752839, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.97480503204176, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.27021475807082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.76448761173079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.27967066143849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.7304119228052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.02773863577156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.75713194830126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 83.1473889960404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.41346554365083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.17900380032793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.66999422482027, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.80008932877531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.01376127293886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 78.56029941307106, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.64101214269384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 84.47767320205111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.61788283185616, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.69954840962144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 86.10387351845584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + } + ], + "final_value": 1001647.2716363404, + "framework": "ml4t.backtest", + "num_trades": 10, + "total_pnl": 1647.271636340418, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.71791520752839, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 96.97480503204176, + "exit_reason": "signal", + "exit_time": "2020-01-18T00:00:00", + "pnl": 1074.3110175486636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27021475807082, + "entry_time": "2020-01-28T00:00:00", + "exit_price": 88.76448761173079, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": 150.5727146340032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.27967066143849, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 81.7304119228052, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -145.07412613667202, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.02773863577156, + "entry_time": "2020-03-08T00:00:00", + "exit_price": 85.75713194830126, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": -372.9393312529719, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 83.1473889960404, + "entry_time": "2020-03-28T00:00:00", + "exit_price": 81.41346554365083, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": 173.39234523895811, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.17900380032793, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 81.66999422482027, + "exit_reason": "signal", + "exit_time": "2020-04-27T00:00:00", + "pnl": -149.09904244923382, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 85.80008932877531, + "entry_time": "2020-05-07T00:00:00", + "exit_price": 80.01376127293886, + "exit_reason": "signal", + "exit_time": "2020-05-17T00:00:00", + "pnl": 578.6328055836457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 78.56029941307106, + "entry_time": "2020-05-27T00:00:00", + "exit_price": 80.64101214269384, + "exit_reason": "signal", + "exit_time": "2020-06-06T00:00:00", + "pnl": -208.07127296227736, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.47767320205111, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 85.61788283185616, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": -114.02096298050674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 92.69954840962144, + "entry_time": "2020-07-06T00:00:00", + "exit_price": 86.10387351845584, + "exit_reason": "signal", + "exit_time": "2020-07-16T00:00:00", + "pnl": 659.56748911656, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 200, + "entry_signals": 10, + "exit_signals": 10, + "framework_closed_trades": 10, + "framework_fills": 20, + "framework_intents": 20, + "framework_orders": null, + "ml4t_closed_trades": 10, + "ml4t_fills": 20, + "ml4t_intents": 20, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "11", @@ -420,8 +174062,421 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "Backtrader=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1001492.5493344698, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 1001492.5493344698, + "message": "Backtrader=$1,001,492.5493344698, ML4T=$1,001,492.5493344698 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1492.5493344698334, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 1492.5493344698334, + "message": "Backtrader=$1,492.5493344698, ML4T=$1,492.5493344698 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.71364930598455, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 87.2667981247593, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-03T00:00:00", + "pnl": 1244.6851181225247, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.20038845448721, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 83.7217462910142, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": 247.8642163473014, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.71364930598455, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 87.2667981247593, + "exit_time": "2020-02-03T00:00:00", + "gross_pnl": 1244.6851181225243, + "pnl": 1244.6851181225243, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.20038845448722, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 83.7217462910142, + "exit_time": "2020-03-04T00:00:00", + "gross_pnl": 247.8642163473026, + "pnl": 247.8642163473026, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.71364930598455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.20038845448721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.7217462910142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.71364930598455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.20038845448722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.7217462910142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "12" + }, "detail": null, + "duration_seconds": 0.1857105130329728, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.71364930598455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.20038845448722, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.7217462910142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 1001492.5493344698, + "framework": "Backtrader", + "num_trades": 2, + "total_pnl": 1492.5493344698334, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.71364930598455, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 87.2667981247593, + "exit_time": "2020-02-03T00:00:00", + "gross_pnl": 1244.6851181225243, + "pnl": 1244.6851181225243, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.20038845448722, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 83.7217462910142, + "exit_time": "2020-03-04T00:00:00", + "gross_pnl": 247.8642163473026, + "pnl": 247.8642163473026, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.71364930598455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 87.2667981247593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.20038845448721, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.7217462910142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-04T00:00:00" + } + ], + "final_value": 1001492.5493344698, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 1492.5493344698334, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.71364930598455, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 87.2667981247593, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-03T00:00:00", + "pnl": 1244.6851181225247, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.20038845448721, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 83.7217462910142, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-04T00:00:00", + "pnl": 247.8642163473014, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "55d713605da5bcb48c32d1d1f76e932117b7810ed367ea5f6e354c84503d3363", + "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 100, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "12", @@ -429,8 +174484,305 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Backtrader=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100760.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 100760.0, + "message": "Backtrader=$100,760.0000000000, ML4T=$100,760.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 760.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 760.0, + "message": "Backtrader=$760.0000000000, ML4T=$760.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.39999999999999, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.0, + "exit_reason": "take_profit", + "exit_time": "2020-01-13T00:00:00", + "pnl": 760.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.0, + "exit_time": "2020-01-13T00:00:00", + "gross_pnl": 759.9999999999994, + "pnl": 759.9999999999994, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.39999999999999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "13" + }, "detail": null, + "duration_seconds": 0.18179326900281012, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "final_value": 100760.0, + "framework": "Backtrader", + "num_trades": 1, + "total_pnl": 760.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.0, + "exit_time": "2020-01-13T00:00:00", + "gross_pnl": 759.9999999999994, + "pnl": 759.9999999999994, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.39999999999999, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.0, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + } + ], + "final_value": 100760.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 760.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.39999999999999, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.0, + "exit_reason": "take_profit", + "exit_time": "2020-01-13T00:00:00", + "pnl": 760.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "13", @@ -438,8 +174790,305 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Backtrader=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99859.95449782923, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99859.95449782923, + "message": "Backtrader=$99,859.9544978292, ML4T=$99,859.9544978292 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -140.04550217077485, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -140.04550217077485, + "message": "Backtrader=$-140.0455021708, ML4T=$-140.0455021708 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 98.89954497829228, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-12T00:00:00", + "pnl": -140.04550217077121, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 98.89954497829228, + "exit_time": "2020-01-12T00:00:00", + "gross_pnl": -140.04550217077139, + "pnl": -140.04550217077139, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "14" + }, "detail": null, + "duration_seconds": 0.17859415197744966, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "final_value": 99859.95449782923, + "framework": "Backtrader", + "num_trades": 1, + "total_pnl": -140.04550217077485, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 98.89954497829228, + "exit_time": "2020-01-12T00:00:00", + "gross_pnl": -140.04550217077139, + "pnl": -140.04550217077139, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 98.89954497829228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-12T00:00:00" + } + ], + "final_value": 99859.95449782923, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -140.04550217077485, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 98.89954497829228, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-12T00:00:00", + "pnl": -140.04550217077121, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "14", @@ -447,8 +175096,305 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Backtrader=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99709.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99709.0, + "message": "Backtrader=$99,709.0000000000, ML4T=$99,709.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -291.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": -291.0, + "message": "Backtrader=$-291.0000000000, ML4T=$-291.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 93.79, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-04T00:00:00", + "pnl": -291.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 93.79, + "exit_time": "2020-01-04T00:00:00", + "gross_pnl": -290.99999999999966, + "pnl": -290.99999999999966, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 93.79, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "15" + }, "detail": null, + "duration_seconds": 0.18483930104412138, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + } + ], + "final_value": 99709.0, + "framework": "Backtrader", + "num_trades": 1, + "total_pnl": -291.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 93.79, + "exit_time": "2020-01-04T00:00:00", + "gross_pnl": -290.99999999999966, + "pnl": -290.99999999999966, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 93.79, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + } + ], + "final_value": 99709.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -291.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 93.79, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-04T00:00:00", + "pnl": -291.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 50, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "15", @@ -456,17 +175402,72989 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 9, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 9, + "message": "Backtrader=9, ML4T=9, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 102511.83846305782, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 102511.83846305782, + "message": "Backtrader=$102,511.8384630578, ML4T=$102,511.8384630578 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 2511.838463057822, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 1.0, + "difference": 0.0, + "expected": 2511.838463057822, + "message": "Backtrader=$2,511.8384630578, ML4T=$2,511.8384630578 (exact_diff=$0.0000000000; diagnostic_limit=$1.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88792565869595, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 101.31576810089561, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-18T00:00:00", + "pnl": 42.78424421996533, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 106.57417661234877, + "entry_time": "2020-04-12T00:00:00", + "exit_price": 100.62156894483525, + "exit_reason": "trailing_stop", + "exit_time": "2020-04-22T00:00:00", + "pnl": -595.2607667513512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.04256151123884, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 84.84002198824555, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-21T00:00:00", + "pnl": 1679.7460477006707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 145.76327269857916, + "entry_time": "2021-02-06T00:00:00", + "exit_price": 141.12149237162103, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-12T00:00:00", + "pnl": -464.1780326958142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 116.78041573195996, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 162.02045548941425, + "exit_reason": "trailing_stop", + "exit_time": "2021-08-08T00:00:00", + "pnl": 4524.003975745429, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.8214436031379, + "entry_time": "2021-12-03T00:00:00", + "exit_price": 211.77483585719543, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-05T00:00:00", + "pnl": -1604.6607745942492, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 123.82384824945187, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 117.32485396521913, + "exit_reason": "trailing_stop", + "exit_time": "2022-04-08T00:00:00", + "pnl": -649.899428423274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.97969816322932, + "entry_time": "2022-09-29T00:00:00", + "exit_price": 83.93629293465128, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-07T00:00:00", + "pnl": -304.3405228578031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88588285177968, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 89.72232005892202, + "exit_reason": "trailing_stop", + "exit_time": "2023-05-17T00:00:00", + "pnl": -116.3562792857665, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88792565869595, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 101.31576810089561, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": 42.78424421996618, + "pnl": 42.78424421996618, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 106.57417661234877, + "entry_time": "2020-04-12T00:00:00", + "exit_price": 100.62156894483525, + "exit_time": "2020-04-22T00:00:00", + "gross_pnl": -595.2607667513519, + "pnl": -595.2607667513519, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.04256151123884, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 84.84002198824557, + "exit_time": "2020-09-21T00:00:00", + "gross_pnl": 1679.7460477006723, + "pnl": 1679.7460477006723, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 145.76327269857916, + "entry_time": "2021-02-06T00:00:00", + "exit_price": 141.12149237162103, + "exit_time": "2021-02-12T00:00:00", + "gross_pnl": -464.1780326958127, + "pnl": -464.1780326958127, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 116.78041573195996, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 162.02045548941427, + "exit_time": "2021-08-08T00:00:00", + "gross_pnl": 4524.0039757454315, + "pnl": 4524.0039757454315, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.82144360313794, + "entry_time": "2021-12-03T00:00:00", + "exit_price": 211.77483585719543, + "exit_time": "2021-12-05T00:00:00", + "gross_pnl": -1604.660774594251, + "pnl": -1604.660774594251, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 123.82384824945187, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 117.32485396521913, + "exit_time": "2022-04-08T00:00:00", + "gross_pnl": -649.8994284232737, + "pnl": -649.8994284232737, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.97969816322932, + "entry_time": "2022-09-29T00:00:00", + "exit_price": 83.93629293465128, + "exit_time": "2022-10-07T00:00:00", + "gross_pnl": -304.3405228578038, + "pnl": -304.3405228578038, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88588285177968, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 89.72232005892202, + "exit_time": "2023-05-17T00:00:00", + "gross_pnl": -116.3562792857661, + "pnl": -116.3562792857661, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.88792565869595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.31576810089561, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 106.57417661234877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 100.62156894483525, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 68.04256151123884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 84.84002198824555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 145.76327269857916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 116.78041573195996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 162.02045548941425, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 227.8214436031379, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 211.77483585719543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 123.82384824945187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 117.32485396521913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.97969816322932, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.88588285177968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 89.72232005892202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88792565869595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.3157681008956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 106.57417661234877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.62156894483525, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 68.04256151123884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.84002198824557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 145.76327269857916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 116.78041573195996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 162.02045548941427, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 227.82144360313794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 211.77483585719543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 123.82384824945187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 117.32485396521913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.97969816322932, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.88588285177968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.72232005892201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "16" + }, "detail": null, + "duration_seconds": 0.3405823779758066, "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88792565869595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.3157681008956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 106.57417661234877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.62156894483525, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 68.04256151123884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.84002198824557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 145.76327269857916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 116.78041573195996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 162.02045548941427, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 227.82144360313794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 211.77483585719543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 123.82384824945187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 117.32485396521913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.97969816322932, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.88588285177968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.72232005892201, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + } + ], + "final_value": 102511.83846305782, + "framework": "Backtrader", + "num_trades": 9, + "total_pnl": 2511.838463057822, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88792565869595, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 101.31576810089561, + "exit_time": "2020-01-18T00:00:00", + "gross_pnl": 42.78424421996618, + "pnl": 42.78424421996618, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 106.57417661234877, + "entry_time": "2020-04-12T00:00:00", + "exit_price": 100.62156894483525, + "exit_time": "2020-04-22T00:00:00", + "gross_pnl": -595.2607667513519, + "pnl": -595.2607667513519, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.04256151123884, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 84.84002198824557, + "exit_time": "2020-09-21T00:00:00", + "gross_pnl": 1679.7460477006723, + "pnl": 1679.7460477006723, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 145.76327269857916, + "entry_time": "2021-02-06T00:00:00", + "exit_price": 141.12149237162103, + "exit_time": "2021-02-12T00:00:00", + "gross_pnl": -464.1780326958127, + "pnl": -464.1780326958127, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 116.78041573195996, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 162.02045548941427, + "exit_time": "2021-08-08T00:00:00", + "gross_pnl": 4524.0039757454315, + "pnl": 4524.0039757454315, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.82144360313794, + "entry_time": "2021-12-03T00:00:00", + "exit_price": 211.77483585719543, + "exit_time": "2021-12-05T00:00:00", + "gross_pnl": -1604.660774594251, + "pnl": -1604.660774594251, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 123.82384824945187, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 117.32485396521913, + "exit_time": "2022-04-08T00:00:00", + "gross_pnl": -649.8994284232737, + "pnl": -649.8994284232737, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.97969816322932, + "entry_time": "2022-09-29T00:00:00", + "exit_price": 83.93629293465128, + "exit_time": "2022-10-07T00:00:00", + "gross_pnl": -304.3405228578038, + "pnl": -304.3405228578038, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88588285177968, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 89.72232005892202, + "exit_time": "2023-05-17T00:00:00", + "gross_pnl": -116.3562792857661, + "pnl": -116.3562792857661, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.88792565869595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.31576810089561, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 106.57417661234877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 100.62156894483525, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 68.04256151123884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 84.84002198824555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 145.76327269857916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 141.12149237162103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 116.78041573195996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 162.02045548941425, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 227.8214436031379, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 211.77483585719543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 123.82384824945187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 117.32485396521913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.97969816322932, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 83.93629293465128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.88588285177968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 89.72232005892202, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-17T00:00:00" + } + ], + "final_value": 102511.83846305782, + "framework": "ml4t.backtest", + "num_trades": 9, + "total_pnl": 2511.838463057822, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.88792565869595, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 101.31576810089561, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-18T00:00:00", + "pnl": 42.78424421996533, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 106.57417661234877, + "entry_time": "2020-04-12T00:00:00", + "exit_price": 100.62156894483525, + "exit_reason": "trailing_stop", + "exit_time": "2020-04-22T00:00:00", + "pnl": -595.2607667513512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.04256151123884, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 84.84002198824555, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-21T00:00:00", + "pnl": 1679.7460477006707, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 145.76327269857916, + "entry_time": "2021-02-06T00:00:00", + "exit_price": 141.12149237162103, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-12T00:00:00", + "pnl": -464.1780326958142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 116.78041573195996, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 162.02045548941425, + "exit_reason": "trailing_stop", + "exit_time": "2021-08-08T00:00:00", + "pnl": 4524.003975745429, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.8214436031379, + "entry_time": "2021-12-03T00:00:00", + "exit_price": 211.77483585719543, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-05T00:00:00", + "pnl": -1604.6607745942492, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 123.82384824945187, + "entry_time": "2022-03-13T00:00:00", + "exit_price": 117.32485396521913, + "exit_reason": "trailing_stop", + "exit_time": "2022-04-08T00:00:00", + "pnl": -649.899428423274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.97969816322932, + "entry_time": "2022-09-29T00:00:00", + "exit_price": 83.93629293465128, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-07T00:00:00", + "pnl": -304.3405228578031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.88588285177968, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 89.72232005892202, + "exit_reason": "trailing_stop", + "exit_time": "2023-05-17T00:00:00", + "pnl": -116.3562792857665, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 1500, + "entry_signals": 9, + "exit_signals": 0, + "framework_closed_trades": 9, + "framework_fills": 18, + "framework_intents": 9, + "framework_orders": null, + "ml4t_closed_trades": 9, + "ml4t_fills": 18, + "ml4t_intents": 9, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "16", - "scenario_name": "Stress Test", + "scenario_name": "Regime Path Coverage", "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 600, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 600, + "message": "Backtrader=600, ML4T=600, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98797.57980296039, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 8.731149137020111e-11, + "expected": 98797.5798029603, + "message": "Backtrader=$98,797.5798029603, ML4T=$98,797.5798029604 (exact_diff=$0.0000000001, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1202.4201970396098, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 8.731149137020111e-11, + "expected": -1202.420197039697, + "message": "Backtrader=$-1,202.4201970397, ML4T=$-1,202.4201970396 (exact_diff=$0.0000000001; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.11917253451473, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 99.54841534502786, + "exit_reason": "signal", + "exit_time": "2020-01-04T00:00:00", + "pnl": -157.0757189486867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.03201587878578, + "entry_time": "2020-01-06T00:00:00", + "exit_price": 99.94550278474797, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": -8.651309403781852, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.67183298908238, + "entry_time": "2020-01-09T00:00:00", + "exit_price": 99.86549713479145, + "exit_reason": "signal", + "exit_time": "2020-01-10T00:00:00", + "pnl": 19.36641457090809, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.19160897741419, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 100.48697641782272, + "exit_reason": "signal", + "exit_time": "2020-01-13T00:00:00", + "pnl": 29.536744040851772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.74505140134526, + "entry_time": "2020-01-15T00:00:00", + "exit_price": 99.43249701182592, + "exit_reason": "signal", + "exit_time": "2020-01-16T00:00:00", + "pnl": -31.255438951935503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36317339817481, + "entry_time": "2020-01-18T00:00:00", + "exit_price": 100.3184784020995, + "exit_reason": "signal", + "exit_time": "2020-01-19T00:00:00", + "pnl": 95.53050039246955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.59194698786014, + "entry_time": "2020-01-21T00:00:00", + "exit_price": 99.21300773889088, + "exit_reason": "signal", + "exit_time": "2020-01-22T00:00:00", + "pnl": -37.893924896925455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.93323693635863, + "entry_time": "2020-01-24T00:00:00", + "exit_price": 101.01041702546699, + "exit_reason": "signal", + "exit_time": "2020-01-25T00:00:00", + "pnl": 107.71800891083694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.12882215455511, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 98.82503838919212, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -130.37837653629867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20974209562837, + "entry_time": "2020-01-30T00:00:00", + "exit_price": 99.28418162139361, + "exit_reason": "signal", + "exit_time": "2020-01-31T00:00:00", + "pnl": 7.44395257652468, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91262465479313, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 98.47079432451613, + "exit_reason": "signal", + "exit_time": "2020-02-03T00:00:00", + "pnl": -144.1830330276989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.41396612142576, + "entry_time": "2020-02-05T00:00:00", + "exit_price": 99.74208634353057, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 132.8120222104808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96112016066533, + "entry_time": "2020-02-08T00:00:00", + "exit_price": 99.14757933275934, + "exit_reason": "signal", + "exit_time": "2020-02-09T00:00:00", + "pnl": 18.645917209401887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.33794797010773, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 98.95774776632322, + "exit_reason": "signal", + "exit_time": "2020-02-12T00:00:00", + "pnl": -38.02002037845159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.39809150990904, + "entry_time": "2020-02-14T00:00:00", + "exit_price": 99.29624163714647, + "exit_reason": "signal", + "exit_time": "2020-02-15T00:00:00", + "pnl": -10.184987276257743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98044425919083, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 98.71415014911958, + "exit_reason": "signal", + "exit_time": "2020-02-18T00:00:00", + "pnl": -26.629411007124872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68703409584347, + "entry_time": "2020-02-20T00:00:00", + "exit_price": 99.19660477578049, + "exit_reason": "signal", + "exit_time": "2020-02-21T00:00:00", + "pnl": 50.95706799370237, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.09913803201934, + "entry_time": "2020-02-23T00:00:00", + "exit_price": 99.13975001075532, + "exit_reason": "signal", + "exit_time": "2020-02-24T00:00:00", + "pnl": -95.93880212640215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7525000464393, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 98.67014960303162, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -8.235044340766763, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.16172259245428, + "entry_time": "2020-02-29T00:00:00", + "exit_price": 99.99277550738104, + "exit_reason": "signal", + "exit_time": "2020-03-01T00:00:00", + "pnl": 83.10529149267677, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.726000665382, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 99.27597137389321, + "exit_reason": "signal", + "exit_time": "2020-03-04T00:00:00", + "pnl": 54.99707085112095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.96674656359579, + "entry_time": "2020-03-06T00:00:00", + "exit_price": 99.01407453019127, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -95.2672033404524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01883446140224, + "entry_time": "2020-03-09T00:00:00", + "exit_price": 99.33686580554885, + "exit_reason": "signal", + "exit_time": "2020-03-10T00:00:00", + "pnl": 31.803134414662054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.61379453469056, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 99.44418682978016, + "exit_reason": "signal", + "exit_time": "2020-03-13T00:00:00", + "pnl": -16.96077049103951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.1261570487614, + "entry_time": "2020-03-15T00:00:00", + "exit_price": 98.90367229199478, + "exit_reason": "signal", + "exit_time": "2020-03-16T00:00:00", + "pnl": 77.75152432333743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.48715448535594, + "entry_time": "2020-03-18T00:00:00", + "exit_price": 98.53898885220806, + "exit_reason": "signal", + "exit_time": "2020-03-19T00:00:00", + "pnl": -94.81656331478916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.13695584567007, + "entry_time": "2020-03-21T00:00:00", + "exit_price": 98.74920846022493, + "exit_reason": "signal", + "exit_time": "2020-03-22T00:00:00", + "pnl": -138.77473854451455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.28346179234327, + "entry_time": "2020-03-24T00:00:00", + "exit_price": 99.39446913633991, + "exit_reason": "signal", + "exit_time": "2020-03-25T00:00:00", + "pnl": 11.100734399662542, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38048314487808, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 98.86853857797571, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": -51.19445669023844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.78335766752544, + "entry_time": "2020-03-30T00:00:00", + "exit_price": 100.08258048792489, + "exit_reason": "signal", + "exit_time": "2020-03-31T00:00:00", + "pnl": 29.922282039944548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.04409706752067, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 100.00584315640894, + "exit_reason": "signal", + "exit_time": "2020-04-03T00:00:00", + "pnl": -3.825391111173303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17754603801194, + "entry_time": "2020-04-05T00:00:00", + "exit_price": 99.91386750387461, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": 73.63214658626748, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.07278397148802, + "entry_time": "2020-04-08T00:00:00", + "exit_price": 99.84957817071898, + "exit_reason": "signal", + "exit_time": "2020-04-09T00:00:00", + "pnl": -122.32058007690466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.66685696016805, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 100.29703959359377, + "exit_reason": "signal", + "exit_time": "2020-04-12T00:00:00", + "pnl": 63.01826334257203, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.16284479663989, + "entry_time": "2020-04-14T00:00:00", + "exit_price": 99.59827392536462, + "exit_reason": "signal", + "exit_time": "2020-04-15T00:00:00", + "pnl": -56.45708712752639, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.02427769637677, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 100.02034152325665, + "exit_reason": "signal", + "exit_time": "2020-04-18T00:00:00", + "pnl": -0.39361731201279326, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.10227360972624, + "entry_time": "2020-04-20T00:00:00", + "exit_price": 99.55074957264794, + "exit_reason": "signal", + "exit_time": "2020-04-21T00:00:00", + "pnl": -55.15240370782885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4752285310497, + "entry_time": "2020-04-23T00:00:00", + "exit_price": 100.78482968977629, + "exit_reason": "signal", + "exit_time": "2020-04-24T00:00:00", + "pnl": 30.960115872660026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64550269913406, + "entry_time": "2020-04-26T00:00:00", + "exit_price": 100.75829920829567, + "exit_reason": "signal", + "exit_time": "2020-04-27T00:00:00", + "pnl": 11.2796509161617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.28405624956508, + "entry_time": "2020-04-29T00:00:00", + "exit_price": 100.40750734980367, + "exit_reason": "signal", + "exit_time": "2020-04-30T00:00:00", + "pnl": 12.345110023859888, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.9736108084372, + "entry_time": "2020-05-02T00:00:00", + "exit_price": 99.11719582995507, + "exit_reason": "signal", + "exit_time": "2020-05-03T00:00:00", + "pnl": -185.64149784821348, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4244273841596, + "entry_time": "2020-05-05T00:00:00", + "exit_price": 100.46803368609852, + "exit_reason": "signal", + "exit_time": "2020-05-06T00:00:00", + "pnl": 4.360630193890756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.65390080108091, + "entry_time": "2020-05-08T00:00:00", + "exit_price": 101.55529329412784, + "exit_reason": "signal", + "exit_time": "2020-05-09T00:00:00", + "pnl": 90.1392493046933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.84475344760442, + "entry_time": "2020-05-11T00:00:00", + "exit_price": 101.34547532849058, + "exit_reason": "signal", + "exit_time": "2020-05-12T00:00:00", + "pnl": 50.0721880886158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.83286932713185, + "entry_time": "2020-05-14T00:00:00", + "exit_price": 100.1414110724743, + "exit_reason": "signal", + "exit_time": "2020-05-15T00:00:00", + "pnl": -69.14582546575548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.70880723169135, + "entry_time": "2020-05-17T00:00:00", + "exit_price": 100.37107171120154, + "exit_reason": "signal", + "exit_time": "2020-05-18T00:00:00", + "pnl": -33.77355204898231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17212988349165, + "entry_time": "2020-05-20T00:00:00", + "exit_price": 100.88968353827181, + "exit_reason": "signal", + "exit_time": "2020-05-21T00:00:00", + "pnl": 171.75536547801676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17974473578754, + "entry_time": "2020-05-23T00:00:00", + "exit_price": 99.64495810760246, + "exit_reason": "signal", + "exit_time": "2020-05-24T00:00:00", + "pnl": 46.521337181493436, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86042757757674, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 99.42922022261914, + "exit_reason": "signal", + "exit_time": "2020-05-27T00:00:00", + "pnl": 56.87926450423947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67123710700702, + "entry_time": "2020-05-29T00:00:00", + "exit_price": 99.1262468099545, + "exit_reason": "signal", + "exit_time": "2020-05-30T00:00:00", + "pnl": 45.500970294748186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99803204217791, + "entry_time": "2020-06-01T00:00:00", + "exit_price": 98.0746490327229, + "exit_reason": "signal", + "exit_time": "2020-06-02T00:00:00", + "pnl": 7.661699054498968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68852164950059, + "entry_time": "2020-06-04T00:00:00", + "exit_price": 98.90683245619206, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 21.831080669147923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.69867095887889, + "entry_time": "2020-06-07T00:00:00", + "exit_price": 98.58028409299915, + "exit_reason": "signal", + "exit_time": "2020-06-08T00:00:00", + "pnl": -11.838686587974735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78930171959787, + "entry_time": "2020-06-10T00:00:00", + "exit_price": 99.44349309161046, + "exit_reason": "signal", + "exit_time": "2020-06-11T00:00:00", + "pnl": 65.41913720125922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.63928948741085, + "entry_time": "2020-06-13T00:00:00", + "exit_price": 99.8801021064717, + "exit_reason": "signal", + "exit_time": "2020-06-14T00:00:00", + "pnl": 24.081261906085274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88804895153031, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 98.9129584357738, + "exit_reason": "signal", + "exit_time": "2020-06-17T00:00:00", + "pnl": 2.4909484243489715, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.35911188288489, + "entry_time": "2020-06-19T00:00:00", + "exit_price": 99.55107978610341, + "exit_reason": "signal", + "exit_time": "2020-06-20T00:00:00", + "pnl": 19.19679032185377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.24566283787111, + "entry_time": "2020-06-22T00:00:00", + "exit_price": 99.50854335078685, + "exit_reason": "signal", + "exit_time": "2020-06-23T00:00:00", + "pnl": 26.288051291574448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85972377687798, + "entry_time": "2020-06-25T00:00:00", + "exit_price": 98.94180161552265, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": 8.207783864467274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42256786175979, + "entry_time": "2020-06-28T00:00:00", + "exit_price": 98.39260868907034, + "exit_reason": "signal", + "exit_time": "2020-06-29T00:00:00", + "pnl": -2.9959172689432307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47598985042309, + "entry_time": "2020-07-01T00:00:00", + "exit_price": 98.2217481384577, + "exit_reason": "signal", + "exit_time": "2020-07-02T00:00:00", + "pnl": -25.424171196538737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43771261461686, + "entry_time": "2020-07-04T00:00:00", + "exit_price": 99.25556396259081, + "exit_reason": "signal", + "exit_time": "2020-07-05T00:00:00", + "pnl": -18.214865202604415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27520136851216, + "entry_time": "2020-07-07T00:00:00", + "exit_price": 99.22895283520214, + "exit_reason": "signal", + "exit_time": "2020-07-08T00:00:00", + "pnl": -4.62485333100085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84721164221584, + "entry_time": "2020-07-10T00:00:00", + "exit_price": 98.21690016032666, + "exit_reason": "signal", + "exit_time": "2020-07-11T00:00:00", + "pnl": -63.03114818891845, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98012439288168, + "entry_time": "2020-07-13T00:00:00", + "exit_price": 98.42241300564716, + "exit_reason": "signal", + "exit_time": "2020-07-14T00:00:00", + "pnl": -55.77113872345217, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5234973647714, + "entry_time": "2020-07-16T00:00:00", + "exit_price": 98.84780174120549, + "exit_reason": "signal", + "exit_time": "2020-07-17T00:00:00", + "pnl": -67.56956235658981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78357735159078, + "entry_time": "2020-07-19T00:00:00", + "exit_price": 98.5180376571157, + "exit_reason": "signal", + "exit_time": "2020-07-20T00:00:00", + "pnl": -26.55396944750828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07885735340791, + "entry_time": "2020-07-22T00:00:00", + "exit_price": 98.46287786089891, + "exit_reason": "signal", + "exit_time": "2020-07-23T00:00:00", + "pnl": 38.402050749100454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7806750796624, + "entry_time": "2020-07-25T00:00:00", + "exit_price": 98.99007562374577, + "exit_reason": "signal", + "exit_time": "2020-07-26T00:00:00", + "pnl": 20.940054408336437, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3160405598432, + "entry_time": "2020-07-28T00:00:00", + "exit_price": 97.69515591162462, + "exit_reason": "signal", + "exit_time": "2020-07-29T00:00:00", + "pnl": -62.088464821858, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.9307950005457, + "entry_time": "2020-07-31T00:00:00", + "exit_price": 97.49497584845733, + "exit_reason": "signal", + "exit_time": "2020-08-01T00:00:00", + "pnl": -43.58191520883702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.05277773908539, + "entry_time": "2020-08-03T00:00:00", + "exit_price": 97.63017059410102, + "exit_reason": "signal", + "exit_time": "2020-08-04T00:00:00", + "pnl": -42.260714498435846, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.95560584181007, + "entry_time": "2020-08-06T00:00:00", + "exit_price": 97.85704345214471, + "exit_reason": "signal", + "exit_time": "2020-08-07T00:00:00", + "pnl": -109.85623896653487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.34581983849665, + "entry_time": "2020-08-09T00:00:00", + "exit_price": 98.55148937480453, + "exit_reason": "signal", + "exit_time": "2020-08-10T00:00:00", + "pnl": 120.5669536307887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.83406196186097, + "entry_time": "2020-08-12T00:00:00", + "exit_price": 97.25669377064881, + "exit_reason": "signal", + "exit_time": "2020-08-13T00:00:00", + "pnl": -57.736819121215376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.51637945271536, + "entry_time": "2020-08-15T00:00:00", + "exit_price": 97.57103396676897, + "exit_reason": "signal", + "exit_time": "2020-08-16T00:00:00", + "pnl": 5.465451405361819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43830185841739, + "entry_time": "2020-08-18T00:00:00", + "exit_price": 98.4155507445711, + "exit_reason": "signal", + "exit_time": "2020-08-19T00:00:00", + "pnl": -2.2751113846297812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.92267680402585, + "entry_time": "2020-08-21T00:00:00", + "exit_price": 98.75883349843212, + "exit_reason": "signal", + "exit_time": "2020-08-22T00:00:00", + "pnl": 83.61566944062724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.974264479532, + "entry_time": "2020-08-24T00:00:00", + "exit_price": 99.70988332181, + "exit_reason": "signal", + "exit_time": "2020-08-25T00:00:00", + "pnl": 173.56188422779996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21365266173218, + "entry_time": "2020-08-27T00:00:00", + "exit_price": 98.08294324004585, + "exit_reason": "signal", + "exit_time": "2020-08-28T00:00:00", + "pnl": -113.07094216863334, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11928874045202, + "entry_time": "2020-08-30T00:00:00", + "exit_price": 98.31180164071337, + "exit_reason": "signal", + "exit_time": "2020-08-31T00:00:00", + "pnl": 19.251290026133574, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.00054275724281, + "entry_time": "2020-09-02T00:00:00", + "exit_price": 98.65255133629894, + "exit_reason": "signal", + "exit_time": "2020-09-03T00:00:00", + "pnl": 65.20085790561279, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96503242935937, + "entry_time": "2020-09-05T00:00:00", + "exit_price": 98.79138811772025, + "exit_reason": "signal", + "exit_time": "2020-09-06T00:00:00", + "pnl": -17.364431163910922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.47378044689604, + "entry_time": "2020-09-08T00:00:00", + "exit_price": 98.31284487928606, + "exit_reason": "signal", + "exit_time": "2020-09-09T00:00:00", + "pnl": -116.09355676099767, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.73200506980342, + "entry_time": "2020-09-11T00:00:00", + "exit_price": 98.3363427106496, + "exit_reason": "signal", + "exit_time": "2020-09-12T00:00:00", + "pnl": 60.433764084618815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.56611574901736, + "entry_time": "2020-09-14T00:00:00", + "exit_price": 98.13272204200155, + "exit_reason": "signal", + "exit_time": "2020-09-15T00:00:00", + "pnl": -43.339370701580265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.89963627791985, + "entry_time": "2020-09-17T00:00:00", + "exit_price": 98.38755792776327, + "exit_reason": "signal", + "exit_time": "2020-09-18T00:00:00", + "pnl": 148.79216498434107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.35474381234252, + "entry_time": "2020-09-20T00:00:00", + "exit_price": 98.97868642263799, + "exit_reason": "signal", + "exit_time": "2020-09-21T00:00:00", + "pnl": 62.394261029547124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.11962753041762, + "entry_time": "2020-09-23T00:00:00", + "exit_price": 99.25728100943367, + "exit_reason": "signal", + "exit_time": "2020-09-24T00:00:00", + "pnl": 13.7653479016044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.076645155786, + "entry_time": "2020-09-26T00:00:00", + "exit_price": 99.1361736846976, + "exit_reason": "signal", + "exit_time": "2020-09-27T00:00:00", + "pnl": 5.952852891159637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.95761891143941, + "entry_time": "2020-09-29T00:00:00", + "exit_price": 99.38251520181134, + "exit_reason": "signal", + "exit_time": "2020-09-30T00:00:00", + "pnl": 42.48962903719439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.58405172820402, + "entry_time": "2020-10-02T00:00:00", + "exit_price": 100.1825648349693, + "exit_reason": "signal", + "exit_time": "2020-10-03T00:00:00", + "pnl": 59.851310676529465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31778631274507, + "entry_time": "2020-10-05T00:00:00", + "exit_price": 98.92748490697555, + "exit_reason": "signal", + "exit_time": "2020-10-06T00:00:00", + "pnl": -39.03014057695145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11485299409067, + "entry_time": "2020-10-08T00:00:00", + "exit_price": 97.46828746700024, + "exit_reason": "signal", + "exit_time": "2020-10-09T00:00:00", + "pnl": -64.65655270904244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7892083341232, + "entry_time": "2020-10-11T00:00:00", + "exit_price": 99.2850707768965, + "exit_reason": "signal", + "exit_time": "2020-10-12T00:00:00", + "pnl": 149.58624427733048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.61528686513479, + "entry_time": "2020-10-14T00:00:00", + "exit_price": 98.16045065160826, + "exit_reason": "signal", + "exit_time": "2020-10-15T00:00:00", + "pnl": 54.516378647347665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98923853245553, + "entry_time": "2020-10-17T00:00:00", + "exit_price": 97.78083136801966, + "exit_reason": "signal", + "exit_time": "2020-10-18T00:00:00", + "pnl": -20.840716443586643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98736762370623, + "entry_time": "2020-10-20T00:00:00", + "exit_price": 98.41242668783207, + "exit_reason": "signal", + "exit_time": "2020-10-21T00:00:00", + "pnl": 42.5059064125835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7821059253462, + "entry_time": "2020-10-23T00:00:00", + "exit_price": 98.01676230346942, + "exit_reason": "signal", + "exit_time": "2020-10-24T00:00:00", + "pnl": -76.5343621876782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.90986422948514, + "entry_time": "2020-10-26T00:00:00", + "exit_price": 98.85698353324744, + "exit_reason": "signal", + "exit_time": "2020-10-27T00:00:00", + "pnl": -5.288069623769843, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.72982041802001, + "entry_time": "2020-10-29T00:00:00", + "exit_price": 98.60761748093444, + "exit_reason": "signal", + "exit_time": "2020-10-30T00:00:00", + "pnl": -12.22029370855671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.0385605171193, + "entry_time": "2020-11-01T00:00:00", + "exit_price": 99.09198940082088, + "exit_reason": "signal", + "exit_time": "2020-11-02T00:00:00", + "pnl": 5.342888370158107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21597248424331, + "entry_time": "2020-11-04T00:00:00", + "exit_price": 98.490691270523, + "exit_reason": "signal", + "exit_time": "2020-11-05T00:00:00", + "pnl": -72.52812137203, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.2706953210234, + "entry_time": "2020-11-07T00:00:00", + "exit_price": 98.23704650718707, + "exit_reason": "signal", + "exit_time": "2020-11-08T00:00:00", + "pnl": -3.364881383631655, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30522444084696, + "entry_time": "2020-11-10T00:00:00", + "exit_price": 97.82731858826378, + "exit_reason": "signal", + "exit_time": "2020-11-11T00:00:00", + "pnl": 52.20941474168103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91407429365688, + "entry_time": "2020-11-13T00:00:00", + "exit_price": 98.5460351903365, + "exit_reason": "signal", + "exit_time": "2020-11-14T00:00:00", + "pnl": -36.80391033203887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.93028933684711, + "entry_time": "2020-11-16T00:00:00", + "exit_price": 99.0553633238757, + "exit_reason": "signal", + "exit_time": "2020-11-17T00:00:00", + "pnl": 12.507398702859064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47484452500944, + "entry_time": "2020-11-19T00:00:00", + "exit_price": 98.10094020807114, + "exit_reason": "signal", + "exit_time": "2020-11-20T00:00:00", + "pnl": -37.39043169383149, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01428360585088, + "entry_time": "2020-11-22T00:00:00", + "exit_price": 97.38292648890776, + "exit_reason": "signal", + "exit_time": "2020-11-23T00:00:00", + "pnl": -163.13571169431088, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48513559668872, + "entry_time": "2020-11-25T00:00:00", + "exit_price": 97.27497370614257, + "exit_reason": "signal", + "exit_time": "2020-11-26T00:00:00", + "pnl": -121.0161890546151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.14886606297294, + "entry_time": "2020-11-28T00:00:00", + "exit_price": 98.29611163730506, + "exit_reason": "signal", + "exit_time": "2020-11-29T00:00:00", + "pnl": 14.724557433211885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.23350982317787, + "entry_time": "2020-12-01T00:00:00", + "exit_price": 97.79948982072462, + "exit_reason": "signal", + "exit_time": "2020-12-02T00:00:00", + "pnl": 56.597999754674674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98472225444857, + "entry_time": "2020-12-04T00:00:00", + "exit_price": 97.71079305814114, + "exit_reason": "signal", + "exit_time": "2020-12-05T00:00:00", + "pnl": -27.392919630743563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3396263042363, + "entry_time": "2020-12-07T00:00:00", + "exit_price": 97.98172498582129, + "exit_reason": "signal", + "exit_time": "2020-12-08T00:00:00", + "pnl": -35.790131841500624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.42795373397291, + "entry_time": "2020-12-10T00:00:00", + "exit_price": 96.6321305493393, + "exit_reason": "signal", + "exit_time": "2020-12-11T00:00:00", + "pnl": -79.58231846336275, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76479352938595, + "entry_time": "2020-12-13T00:00:00", + "exit_price": 98.48958247666039, + "exit_reason": "signal", + "exit_time": "2020-12-14T00:00:00", + "pnl": 172.47889472744282, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.73111789636548, + "entry_time": "2020-12-16T00:00:00", + "exit_price": 97.61885876679554, + "exit_reason": "signal", + "exit_time": "2020-12-17T00:00:00", + "pnl": 88.77408704300797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.85401562603096, + "entry_time": "2020-12-19T00:00:00", + "exit_price": 96.49175141105385, + "exit_reason": "signal", + "exit_time": "2020-12-20T00:00:00", + "pnl": -136.22642149771127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.84289871423181, + "entry_time": "2020-12-22T00:00:00", + "exit_price": 96.99377199128872, + "exit_reason": "signal", + "exit_time": "2020-12-23T00:00:00", + "pnl": -84.91267229430923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76186428614056, + "entry_time": "2020-12-25T00:00:00", + "exit_price": 96.48850513355184, + "exit_reason": "signal", + "exit_time": "2020-12-26T00:00:00", + "pnl": -27.335915258872774, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.12395315196963, + "entry_time": "2020-12-28T00:00:00", + "exit_price": 97.53863571252707, + "exit_reason": "signal", + "exit_time": "2020-12-29T00:00:00", + "pnl": 41.46825605574304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6026762767146, + "entry_time": "2020-12-31T00:00:00", + "exit_price": 97.09752132137899, + "exit_reason": "signal", + "exit_time": "2021-01-01T00:00:00", + "pnl": -50.51549553356199, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.49274636123849, + "entry_time": "2021-01-03T00:00:00", + "exit_price": 96.82226372897985, + "exit_reason": "signal", + "exit_time": "2021-01-04T00:00:00", + "pnl": -67.0482632258645, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.79148532437996, + "entry_time": "2021-01-06T00:00:00", + "exit_price": 97.11483711173116, + "exit_reason": "signal", + "exit_time": "2021-01-07T00:00:00", + "pnl": 32.33517873512028, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.80033950220172, + "entry_time": "2021-01-09T00:00:00", + "exit_price": 96.63729064888537, + "exit_reason": "signal", + "exit_time": "2021-01-10T00:00:00", + "pnl": 83.69511466836593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.11575917668634, + "entry_time": "2021-01-12T00:00:00", + "exit_price": 96.28032546622858, + "exit_reason": "signal", + "exit_time": "2021-01-13T00:00:00", + "pnl": 16.45662895422356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.53344904132359, + "entry_time": "2021-01-15T00:00:00", + "exit_price": 97.29557459823668, + "exit_reason": "signal", + "exit_time": "2021-01-16T00:00:00", + "pnl": 76.21255569131063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.01730754421833, + "entry_time": "2021-01-18T00:00:00", + "exit_price": 96.07935604760307, + "exit_reason": "signal", + "exit_time": "2021-01-19T00:00:00", + "pnl": 6.204850338473989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.79620422510413, + "entry_time": "2021-01-21T00:00:00", + "exit_price": 95.24797305894252, + "exit_reason": "signal", + "exit_time": "2021-01-22T00:00:00", + "pnl": -54.823116616162224, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.19373825703377, + "entry_time": "2021-01-24T00:00:00", + "exit_price": 95.40514794332339, + "exit_reason": "signal", + "exit_time": "2021-01-25T00:00:00", + "pnl": 21.140968628962582, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.55648566288775, + "entry_time": "2021-01-27T00:00:00", + "exit_price": 96.55716667120137, + "exit_reason": "signal", + "exit_time": "2021-01-28T00:00:00", + "pnl": 100.06810083136224, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.91494018138198, + "entry_time": "2021-01-30T00:00:00", + "exit_price": 95.48501201892987, + "exit_reason": "signal", + "exit_time": "2021-01-31T00:00:00", + "pnl": 57.00718375478937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.90008526748946, + "entry_time": "2021-02-02T00:00:00", + "exit_price": 95.83721845974864, + "exit_reason": "signal", + "exit_time": "2021-02-03T00:00:00", + "pnl": -6.2866807740829245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26504549069784, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 96.06840340797214, + "exit_reason": "signal", + "exit_time": "2021-02-06T00:00:00", + "pnl": 80.33579172742975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26053581327312, + "entry_time": "2021-02-08T00:00:00", + "exit_price": 95.42454996605802, + "exit_reason": "signal", + "exit_time": "2021-02-09T00:00:00", + "pnl": 16.401415278489367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94825682250637, + "entry_time": "2021-02-11T00:00:00", + "exit_price": 95.05109746301979, + "exit_reason": "signal", + "exit_time": "2021-02-12T00:00:00", + "pnl": 10.284064051340465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1969266603545, + "entry_time": "2021-02-14T00:00:00", + "exit_price": 96.27193710609464, + "exit_reason": "signal", + "exit_time": "2021-02-15T00:00:00", + "pnl": 7.5010445740135765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97039812035842, + "entry_time": "2021-02-17T00:00:00", + "exit_price": 96.34802647272141, + "exit_reason": "signal", + "exit_time": "2021-02-18T00:00:00", + "pnl": -62.237164763701, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.07904244701469, + "entry_time": "2021-02-20T00:00:00", + "exit_price": 96.79316819026657, + "exit_reason": "signal", + "exit_time": "2021-02-21T00:00:00", + "pnl": -28.58742567481204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5721771606179, + "entry_time": "2021-02-23T00:00:00", + "exit_price": 95.6253449835299, + "exit_reason": "signal", + "exit_time": "2021-02-24T00:00:00", + "pnl": 5.31678229120007, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88599336671724, + "entry_time": "2021-02-26T00:00:00", + "exit_price": 93.9167314813735, + "exit_reason": "signal", + "exit_time": "2021-02-27T00:00:00", + "pnl": -96.92618853437489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23555143341264, + "entry_time": "2021-03-01T00:00:00", + "exit_price": 94.69172330670986, + "exit_reason": "signal", + "exit_time": "2021-03-02T00:00:00", + "pnl": -54.38281267027742, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.40326355089037, + "entry_time": "2021-03-04T00:00:00", + "exit_price": 94.32320287324674, + "exit_reason": "signal", + "exit_time": "2021-03-05T00:00:00", + "pnl": -8.006067764363252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32022315669315, + "entry_time": "2021-03-07T00:00:00", + "exit_price": 94.22613575397045, + "exit_reason": "signal", + "exit_time": "2021-03-08T00:00:00", + "pnl": -9.408740272268915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.08195298394907, + "entry_time": "2021-03-10T00:00:00", + "exit_price": 94.5883765126535, + "exit_reason": "signal", + "exit_time": "2021-03-11T00:00:00", + "pnl": -49.357647129556426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6323490375275, + "entry_time": "2021-03-13T00:00:00", + "exit_price": 95.0747399163529, + "exit_reason": "signal", + "exit_time": "2021-03-14T00:00:00", + "pnl": 44.239087882539025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.55723413541229, + "entry_time": "2021-03-16T00:00:00", + "exit_price": 94.78282068603487, + "exit_reason": "signal", + "exit_time": "2021-03-17T00:00:00", + "pnl": 22.558655062257458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66145085922012, + "entry_time": "2021-03-19T00:00:00", + "exit_price": 95.46346097050873, + "exit_reason": "signal", + "exit_time": "2021-03-20T00:00:00", + "pnl": 180.20101112886005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.00404625454874, + "entry_time": "2021-03-22T00:00:00", + "exit_price": 94.66092881844988, + "exit_reason": "signal", + "exit_time": "2021-03-23T00:00:00", + "pnl": -34.311743609885525, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.49919123199935, + "entry_time": "2021-03-25T00:00:00", + "exit_price": 93.97621398907071, + "exit_reason": "signal", + "exit_time": "2021-03-26T00:00:00", + "pnl": -152.29772429286277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41257974165285, + "entry_time": "2021-03-28T00:00:00", + "exit_price": 95.05124864668421, + "exit_reason": "signal", + "exit_time": "2021-03-29T00:00:00", + "pnl": 63.866890503137256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01899188310071, + "entry_time": "2021-03-31T00:00:00", + "exit_price": 94.2559389154428, + "exit_reason": "signal", + "exit_time": "2021-04-01T00:00:00", + "pnl": 23.694703234208646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12609495739093, + "entry_time": "2021-04-03T00:00:00", + "exit_price": 94.25576346468043, + "exit_reason": "signal", + "exit_time": "2021-04-04T00:00:00", + "pnl": 12.966850728949794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.47050530514431, + "entry_time": "2021-04-06T00:00:00", + "exit_price": 93.72410136704386, + "exit_reason": "signal", + "exit_time": "2021-04-07T00:00:00", + "pnl": 25.35960618995523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19884636287922, + "entry_time": "2021-04-09T00:00:00", + "exit_price": 93.86432033375576, + "exit_reason": "signal", + "exit_time": "2021-04-10T00:00:00", + "pnl": 66.54739708765192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34050558738045, + "entry_time": "2021-04-12T00:00:00", + "exit_price": 94.10587138419956, + "exit_reason": "signal", + "exit_time": "2021-04-13T00:00:00", + "pnl": 76.53657968191146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72930751574246, + "entry_time": "2021-04-15T00:00:00", + "exit_price": 93.2563942182136, + "exit_reason": "signal", + "exit_time": "2021-04-16T00:00:00", + "pnl": -47.29132975288485, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59980860135867, + "entry_time": "2021-04-18T00:00:00", + "exit_price": 94.54277270362402, + "exit_reason": "signal", + "exit_time": "2021-04-19T00:00:00", + "pnl": 94.29641022653595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92591784638046, + "entry_time": "2021-04-21T00:00:00", + "exit_price": 94.14258894906092, + "exit_reason": "signal", + "exit_time": "2021-04-22T00:00:00", + "pnl": 121.6671102680466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11423308566697, + "entry_time": "2021-04-24T00:00:00", + "exit_price": 93.03147452036931, + "exit_reason": "signal", + "exit_time": "2021-04-25T00:00:00", + "pnl": -108.2758565297645, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.97245173381131, + "entry_time": "2021-04-27T00:00:00", + "exit_price": 93.49318704896336, + "exit_reason": "signal", + "exit_time": "2021-04-28T00:00:00", + "pnl": -147.92646848479308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68468709145579, + "entry_time": "2021-04-30T00:00:00", + "exit_price": 93.32003795658395, + "exit_reason": "signal", + "exit_time": "2021-05-01T00:00:00", + "pnl": -36.46491348718337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26674166444458, + "entry_time": "2021-05-03T00:00:00", + "exit_price": 94.26630934814936, + "exit_reason": "signal", + "exit_time": "2021-05-04T00:00:00", + "pnl": -0.04323162952096027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4153331981033, + "entry_time": "2021-05-06T00:00:00", + "exit_price": 93.36350758058099, + "exit_reason": "signal", + "exit_time": "2021-05-07T00:00:00", + "pnl": -5.182561752229958, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.16332285120929, + "entry_time": "2021-05-09T00:00:00", + "exit_price": 94.34043899579565, + "exit_reason": "signal", + "exit_time": "2021-05-10T00:00:00", + "pnl": 17.711614458636177, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74219820454567, + "entry_time": "2021-05-12T00:00:00", + "exit_price": 94.55413171456674, + "exit_reason": "signal", + "exit_time": "2021-05-13T00:00:00", + "pnl": 81.19335100210628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58180279933771, + "entry_time": "2021-05-15T00:00:00", + "exit_price": 94.02408626223293, + "exit_reason": "signal", + "exit_time": "2021-05-16T00:00:00", + "pnl": 44.22834628952114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87657341045227, + "entry_time": "2021-05-18T00:00:00", + "exit_price": 94.55590567361484, + "exit_reason": "signal", + "exit_time": "2021-05-19T00:00:00", + "pnl": 67.93322631625779, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08074161986468, + "entry_time": "2021-05-21T00:00:00", + "exit_price": 93.80457382221171, + "exit_reason": "signal", + "exit_time": "2021-05-22T00:00:00", + "pnl": 72.38322023470391, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8131686939551, + "entry_time": "2021-05-24T00:00:00", + "exit_price": 93.25793142134573, + "exit_reason": "signal", + "exit_time": "2021-05-25T00:00:00", + "pnl": 44.47627273906255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95253144170447, + "entry_time": "2021-05-27T00:00:00", + "exit_price": 93.14743781912107, + "exit_reason": "signal", + "exit_time": "2021-05-28T00:00:00", + "pnl": 19.490637741659157, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8783564574023, + "entry_time": "2021-05-30T00:00:00", + "exit_price": 92.9764387193147, + "exit_reason": "signal", + "exit_time": "2021-05-31T00:00:00", + "pnl": 9.808226191240465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94516537050167, + "entry_time": "2021-06-02T00:00:00", + "exit_price": 92.89603764932446, + "exit_reason": "signal", + "exit_time": "2021-06-03T00:00:00", + "pnl": -4.912772117721033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63800292429943, + "entry_time": "2021-06-05T00:00:00", + "exit_price": 93.24337208101042, + "exit_reason": "signal", + "exit_time": "2021-06-06T00:00:00", + "pnl": 160.53691567109854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59556244009269, + "entry_time": "2021-06-08T00:00:00", + "exit_price": 91.28446378378608, + "exit_reason": "signal", + "exit_time": "2021-06-09T00:00:00", + "pnl": -31.10986563066035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13025499622808, + "entry_time": "2021-06-11T00:00:00", + "exit_price": 92.23383791902404, + "exit_reason": "signal", + "exit_time": "2021-06-12T00:00:00", + "pnl": -89.64170772040234, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3328854638381, + "entry_time": "2021-06-14T00:00:00", + "exit_price": 92.96067846320523, + "exit_reason": "signal", + "exit_time": "2021-06-15T00:00:00", + "pnl": 62.77929993671205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94965457520627, + "entry_time": "2021-06-17T00:00:00", + "exit_price": 92.16625059748041, + "exit_reason": "signal", + "exit_time": "2021-06-18T00:00:00", + "pnl": 21.659602227415235, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8269642033066, + "entry_time": "2021-06-20T00:00:00", + "exit_price": 91.81310669049036, + "exit_reason": "signal", + "exit_time": "2021-06-21T00:00:00", + "pnl": -1.3857512816248345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2555442210953, + "entry_time": "2021-06-23T00:00:00", + "exit_price": 92.45622372930102, + "exit_reason": "signal", + "exit_time": "2021-06-24T00:00:00", + "pnl": 20.06795082057215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.83947343135847, + "entry_time": "2021-06-26T00:00:00", + "exit_price": 92.43135259957857, + "exit_reason": "signal", + "exit_time": "2021-06-27T00:00:00", + "pnl": 59.187916822009356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.53295655650527, + "entry_time": "2021-06-29T00:00:00", + "exit_price": 91.78816229160894, + "exit_reason": "signal", + "exit_time": "2021-06-30T00:00:00", + "pnl": 25.520573510366376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9413213129086, + "entry_time": "2021-07-02T00:00:00", + "exit_price": 92.40648296911729, + "exit_reason": "signal", + "exit_time": "2021-07-03T00:00:00", + "pnl": 146.5161656208693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30279435197399, + "entry_time": "2021-07-05T00:00:00", + "exit_price": 90.65263067129818, + "exit_reason": "signal", + "exit_time": "2021-07-06T00:00:00", + "pnl": -65.01636806758142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8239628759463, + "entry_time": "2021-07-08T00:00:00", + "exit_price": 91.7795218814571, + "exit_reason": "signal", + "exit_time": "2021-07-09T00:00:00", + "pnl": -4.444099448919587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36068460994301, + "entry_time": "2021-07-11T00:00:00", + "exit_price": 91.47451059527033, + "exit_reason": "signal", + "exit_time": "2021-07-12T00:00:00", + "pnl": 11.382598532733027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09791235411565, + "entry_time": "2021-07-14T00:00:00", + "exit_price": 91.64232209133355, + "exit_reason": "signal", + "exit_time": "2021-07-15T00:00:00", + "pnl": 54.440973721790215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9960341944844, + "entry_time": "2021-07-17T00:00:00", + "exit_price": 90.86057544771678, + "exit_reason": "signal", + "exit_time": "2021-07-18T00:00:00", + "pnl": -13.545874676761741, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03722443992689, + "entry_time": "2021-07-20T00:00:00", + "exit_price": 91.02540027670304, + "exit_reason": "signal", + "exit_time": "2021-07-21T00:00:00", + "pnl": -101.1824163223846, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23831571579666, + "entry_time": "2021-07-23T00:00:00", + "exit_price": 91.61642884685872, + "exit_reason": "signal", + "exit_time": "2021-07-24T00:00:00", + "pnl": 37.81131310620731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9587336040414, + "entry_time": "2021-07-26T00:00:00", + "exit_price": 91.78520963834742, + "exit_reason": "signal", + "exit_time": "2021-07-27T00:00:00", + "pnl": -17.35239656939666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12207131713245, + "entry_time": "2021-07-29T00:00:00", + "exit_price": 93.030634236321, + "exit_reason": "signal", + "exit_time": "2021-07-30T00:00:00", + "pnl": 90.85629191885528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2580641252632, + "entry_time": "2021-08-01T00:00:00", + "exit_price": 92.57471719502651, + "exit_reason": "signal", + "exit_time": "2021-08-02T00:00:00", + "pnl": 31.665306976330612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16033087447512, + "entry_time": "2021-08-04T00:00:00", + "exit_price": 91.64298714231596, + "exit_reason": "signal", + "exit_time": "2021-08-05T00:00:00", + "pnl": -51.734373215917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75555986268627, + "entry_time": "2021-08-07T00:00:00", + "exit_price": 93.29534460790408, + "exit_reason": "signal", + "exit_time": "2021-08-08T00:00:00", + "pnl": 53.9784745217803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8204301569652, + "entry_time": "2021-08-10T00:00:00", + "exit_price": 93.34161824742394, + "exit_reason": "signal", + "exit_time": "2021-08-11T00:00:00", + "pnl": 52.118809045874514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.61753779742976, + "entry_time": "2021-08-13T00:00:00", + "exit_price": 94.15624068230731, + "exit_reason": "signal", + "exit_time": "2021-08-14T00:00:00", + "pnl": 53.870288487754806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25917455813928, + "entry_time": "2021-08-16T00:00:00", + "exit_price": 93.5936848786624, + "exit_reason": "signal", + "exit_time": "2021-08-17T00:00:00", + "pnl": -66.54896794768683, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98045633035186, + "entry_time": "2021-08-19T00:00:00", + "exit_price": 93.98797939638727, + "exit_reason": "signal", + "exit_time": "2021-08-20T00:00:00", + "pnl": 100.752306603541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35827005631805, + "entry_time": "2021-08-22T00:00:00", + "exit_price": 93.69155799194061, + "exit_reason": "signal", + "exit_time": "2021-08-23T00:00:00", + "pnl": 33.32879356225567, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68091309416992, + "entry_time": "2021-08-25T00:00:00", + "exit_price": 92.70456318827733, + "exit_reason": "signal", + "exit_time": "2021-08-26T00:00:00", + "pnl": 2.36500941074155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16469231313611, + "entry_time": "2021-08-28T00:00:00", + "exit_price": 92.8799099382491, + "exit_reason": "signal", + "exit_time": "2021-08-29T00:00:00", + "pnl": -28.47823748870178, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11566093967609, + "entry_time": "2021-08-31T00:00:00", + "exit_price": 93.80161139315015, + "exit_reason": "signal", + "exit_time": "2021-09-01T00:00:00", + "pnl": -31.404954652593005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15377445359951, + "entry_time": "2021-09-03T00:00:00", + "exit_price": 94.15715297991916, + "exit_reason": "signal", + "exit_time": "2021-09-04T00:00:00", + "pnl": 100.33785263196478, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86962603101973, + "entry_time": "2021-09-06T00:00:00", + "exit_price": 93.72926386277882, + "exit_reason": "signal", + "exit_time": "2021-09-07T00:00:00", + "pnl": -14.036216824091753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1579385275225, + "entry_time": "2021-09-09T00:00:00", + "exit_price": 93.74116822603294, + "exit_reason": "signal", + "exit_time": "2021-09-10T00:00:00", + "pnl": -41.67703014895778, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31971390482752, + "entry_time": "2021-09-12T00:00:00", + "exit_price": 93.20782644697857, + "exit_reason": "signal", + "exit_time": "2021-09-13T00:00:00", + "pnl": -11.188745784895218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01885490875779, + "entry_time": "2021-09-15T00:00:00", + "exit_price": 94.42230012835577, + "exit_reason": "signal", + "exit_time": "2021-09-16T00:00:00", + "pnl": -59.65547804020207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.99288411883724, + "entry_time": "2021-09-18T00:00:00", + "exit_price": 94.082184046767, + "exit_reason": "signal", + "exit_time": "2021-09-19T00:00:00", + "pnl": 8.9299927929751, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.85101362331126, + "entry_time": "2021-09-21T00:00:00", + "exit_price": 94.98564664788431, + "exit_reason": "signal", + "exit_time": "2021-09-22T00:00:00", + "pnl": 113.46330245730496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86959357102904, + "entry_time": "2021-09-24T00:00:00", + "exit_price": 94.20013868958425, + "exit_reason": "signal", + "exit_time": "2021-09-25T00:00:00", + "pnl": 33.05451185552192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84924924581607, + "entry_time": "2021-09-27T00:00:00", + "exit_price": 93.31289310035527, + "exit_reason": "signal", + "exit_time": "2021-09-28T00:00:00", + "pnl": -153.63561454607952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30858201402589, + "entry_time": "2021-09-30T00:00:00", + "exit_price": 93.99373607498532, + "exit_reason": "signal", + "exit_time": "2021-10-01T00:00:00", + "pnl": -31.484593904056965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.18572768435918, + "entry_time": "2021-10-03T00:00:00", + "exit_price": 94.33439114940059, + "exit_reason": "signal", + "exit_time": "2021-10-04T00:00:00", + "pnl": -85.13365349585911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07429869254726, + "entry_time": "2021-10-06T00:00:00", + "exit_price": 94.04790943044297, + "exit_reason": "signal", + "exit_time": "2021-10-07T00:00:00", + "pnl": -2.6389262104275986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64069907229371, + "entry_time": "2021-10-09T00:00:00", + "exit_price": 94.26235855896988, + "exit_reason": "signal", + "exit_time": "2021-10-10T00:00:00", + "pnl": 62.16594866761625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50379403067527, + "entry_time": "2021-10-12T00:00:00", + "exit_price": 94.43691170957882, + "exit_reason": "signal", + "exit_time": "2021-10-13T00:00:00", + "pnl": -6.688232109645469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37005197510278, + "entry_time": "2021-10-15T00:00:00", + "exit_price": 94.27057437223934, + "exit_reason": "signal", + "exit_time": "2021-10-16T00:00:00", + "pnl": -9.947760286344419, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09337235241868, + "entry_time": "2021-10-18T00:00:00", + "exit_price": 94.71128565229746, + "exit_reason": "signal", + "exit_time": "2021-10-19T00:00:00", + "pnl": -38.20867001212173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02883456195461, + "entry_time": "2021-10-21T00:00:00", + "exit_price": 94.80490335979458, + "exit_reason": "signal", + "exit_time": "2021-10-22T00:00:00", + "pnl": 77.60687978399619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9287597961482, + "entry_time": "2021-10-24T00:00:00", + "exit_price": 95.17470692964342, + "exit_reason": "signal", + "exit_time": "2021-10-25T00:00:00", + "pnl": 124.59471334952104, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2493152678643, + "entry_time": "2021-10-27T00:00:00", + "exit_price": 93.60050033989026, + "exit_reason": "signal", + "exit_time": "2021-10-28T00:00:00", + "pnl": -64.88149279740537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09469925407369, + "entry_time": "2021-10-30T00:00:00", + "exit_price": 94.3111349289259, + "exit_reason": "signal", + "exit_time": "2021-10-31T00:00:00", + "pnl": 21.643567485220046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18816369089684, + "entry_time": "2021-11-02T00:00:00", + "exit_price": 94.42938460793316, + "exit_reason": "signal", + "exit_time": "2021-11-03T00:00:00", + "pnl": 24.122091703631668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.41602741852829, + "entry_time": "2021-11-05T00:00:00", + "exit_price": 93.42310978968692, + "exit_reason": "signal", + "exit_time": "2021-11-06T00:00:00", + "pnl": 0.7082371158630849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50953693273829, + "entry_time": "2021-11-08T00:00:00", + "exit_price": 93.33123427861662, + "exit_reason": "signal", + "exit_time": "2021-11-09T00:00:00", + "pnl": 82.16973458783286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96020937715257, + "entry_time": "2021-11-11T00:00:00", + "exit_price": 93.53068640749544, + "exit_reason": "signal", + "exit_time": "2021-11-12T00:00:00", + "pnl": 57.047703034286315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5609164087555, + "entry_time": "2021-11-14T00:00:00", + "exit_price": 92.89910933295498, + "exit_reason": "signal", + "exit_time": "2021-11-15T00:00:00", + "pnl": 33.81929241994658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.4272707886787, + "entry_time": "2021-11-17T00:00:00", + "exit_price": 92.19572149206287, + "exit_reason": "signal", + "exit_time": "2021-11-18T00:00:00", + "pnl": -23.154929661581264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68137345397398, + "entry_time": "2021-11-20T00:00:00", + "exit_price": 92.48011498833463, + "exit_reason": "signal", + "exit_time": "2021-11-21T00:00:00", + "pnl": -20.12584656393483, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73481537380023, + "entry_time": "2021-11-23T00:00:00", + "exit_price": 93.9817766831428, + "exit_reason": "signal", + "exit_time": "2021-11-24T00:00:00", + "pnl": 124.69613093425687, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62422399002075, + "entry_time": "2021-11-26T00:00:00", + "exit_price": 92.25402747101043, + "exit_reason": "signal", + "exit_time": "2021-11-27T00:00:00", + "pnl": -37.019651901031466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78794113614683, + "entry_time": "2021-11-29T00:00:00", + "exit_price": 92.51565520344022, + "exit_reason": "signal", + "exit_time": "2021-11-30T00:00:00", + "pnl": -27.228593270659985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81994141877884, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 91.73569183010366, + "exit_reason": "signal", + "exit_time": "2021-12-03T00:00:00", + "pnl": -8.42495886751749, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89304084668578, + "entry_time": "2021-12-05T00:00:00", + "exit_price": 91.94563028017612, + "exit_reason": "signal", + "exit_time": "2021-12-06T00:00:00", + "pnl": 5.258943349033871, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.70380536433252, + "entry_time": "2021-12-08T00:00:00", + "exit_price": 92.18321579529317, + "exit_reason": "signal", + "exit_time": "2021-12-09T00:00:00", + "pnl": 47.94104309606337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75634960957339, + "entry_time": "2021-12-11T00:00:00", + "exit_price": 92.99346542277752, + "exit_reason": "signal", + "exit_time": "2021-12-12T00:00:00", + "pnl": 23.711581320412733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07784715364147, + "entry_time": "2021-12-14T00:00:00", + "exit_price": 92.82473368702337, + "exit_reason": "signal", + "exit_time": "2021-12-15T00:00:00", + "pnl": -25.311346661810603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80939097372557, + "entry_time": "2021-12-17T00:00:00", + "exit_price": 93.56855092683492, + "exit_reason": "signal", + "exit_time": "2021-12-18T00:00:00", + "pnl": -24.084004689064386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22637736311736, + "entry_time": "2021-12-20T00:00:00", + "exit_price": 93.04989016451177, + "exit_reason": "signal", + "exit_time": "2021-12-21T00:00:00", + "pnl": -17.64871986056096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06688407845617, + "entry_time": "2021-12-23T00:00:00", + "exit_price": 93.11481000895263, + "exit_reason": "signal", + "exit_time": "2021-12-24T00:00:00", + "pnl": 4.792593049645802, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27282277875311, + "entry_time": "2021-12-26T00:00:00", + "exit_price": 92.10549027383173, + "exit_reason": "signal", + "exit_time": "2021-12-27T00:00:00", + "pnl": -116.73325049213781, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02590143870165, + "entry_time": "2021-12-29T00:00:00", + "exit_price": 93.0111357952797, + "exit_reason": "signal", + "exit_time": "2021-12-30T00:00:00", + "pnl": 98.52343565780393, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36789726372409, + "entry_time": "2022-01-01T00:00:00", + "exit_price": 91.16759918928896, + "exit_reason": "signal", + "exit_time": "2022-01-02T00:00:00", + "pnl": -20.029807443512254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02364437811006, + "entry_time": "2022-01-04T00:00:00", + "exit_price": 91.64247835816664, + "exit_reason": "signal", + "exit_time": "2022-01-05T00:00:00", + "pnl": -38.11660199434118, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20232839714718, + "entry_time": "2022-01-07T00:00:00", + "exit_price": 92.51418676739564, + "exit_reason": "signal", + "exit_time": "2022-01-08T00:00:00", + "pnl": 31.185837024846478, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81320041849361, + "entry_time": "2022-01-10T00:00:00", + "exit_price": 92.27166607324205, + "exit_reason": "signal", + "exit_time": "2022-01-11T00:00:00", + "pnl": 45.84656547484337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2545983932022, + "entry_time": "2022-01-13T00:00:00", + "exit_price": 91.97497228207648, + "exit_reason": "signal", + "exit_time": "2022-01-14T00:00:00", + "pnl": -27.962611112570812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67780842750179, + "entry_time": "2022-01-16T00:00:00", + "exit_price": 91.45906966920411, + "exit_reason": "signal", + "exit_time": "2022-01-17T00:00:00", + "pnl": -21.873875829767712, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76345480442126, + "entry_time": "2022-01-19T00:00:00", + "exit_price": 91.43197465037622, + "exit_reason": "signal", + "exit_time": "2022-01-20T00:00:00", + "pnl": -33.148015404503894, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3600604543369, + "entry_time": "2022-01-22T00:00:00", + "exit_price": 92.44350843545416, + "exit_reason": "signal", + "exit_time": "2022-01-23T00:00:00", + "pnl": 8.34479811172605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39757672508603, + "entry_time": "2022-01-25T00:00:00", + "exit_price": 91.85230151275863, + "exit_reason": "signal", + "exit_time": "2022-01-26T00:00:00", + "pnl": 45.47247876726033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.81407145534195, + "entry_time": "2022-01-28T00:00:00", + "exit_price": 91.01128875382821, + "exit_reason": "signal", + "exit_time": "2022-01-29T00:00:00", + "pnl": 19.721729848626637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67591197573066, + "entry_time": "2022-01-31T00:00:00", + "exit_price": 90.51279666702179, + "exit_reason": "signal", + "exit_time": "2022-02-01T00:00:00", + "pnl": -116.31153087088569, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98461279621962, + "entry_time": "2022-02-03T00:00:00", + "exit_price": 91.18776220832692, + "exit_reason": "signal", + "exit_time": "2022-02-04T00:00:00", + "pnl": -79.68505878927135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68365711276127, + "entry_time": "2022-02-06T00:00:00", + "exit_price": 92.52965334263803, + "exit_reason": "signal", + "exit_time": "2022-02-07T00:00:00", + "pnl": -15.400377012323588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97018528191016, + "entry_time": "2022-02-09T00:00:00", + "exit_price": 92.1704075246973, + "exit_reason": "signal", + "exit_time": "2022-02-10T00:00:00", + "pnl": 20.02222427871311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.4092834971355, + "entry_time": "2022-02-12T00:00:00", + "exit_price": 91.80397108470675, + "exit_reason": "signal", + "exit_time": "2022-02-13T00:00:00", + "pnl": 39.468758757124306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7224658447326, + "entry_time": "2022-02-15T00:00:00", + "exit_price": 91.15638220769824, + "exit_reason": "signal", + "exit_time": "2022-02-16T00:00:00", + "pnl": -56.608363703435316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66063113797075, + "entry_time": "2022-02-18T00:00:00", + "exit_price": 91.93674170823937, + "exit_reason": "signal", + "exit_time": "2022-02-19T00:00:00", + "pnl": 27.61105702686109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.02426166276656, + "entry_time": "2022-02-21T00:00:00", + "exit_price": 92.2868521233569, + "exit_reason": "signal", + "exit_time": "2022-02-22T00:00:00", + "pnl": 126.2590460590327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06798590582005, + "entry_time": "2022-02-24T00:00:00", + "exit_price": 91.35136606041436, + "exit_reason": "signal", + "exit_time": "2022-02-25T00:00:00", + "pnl": 28.338015459430608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99746534424483, + "entry_time": "2022-02-27T00:00:00", + "exit_price": 91.56303029535638, + "exit_reason": "signal", + "exit_time": "2022-02-28T00:00:00", + "pnl": 56.55649511115553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.0942536160811, + "entry_time": "2022-03-02T00:00:00", + "exit_price": 91.42070005109457, + "exit_reason": "signal", + "exit_time": "2022-03-03T00:00:00", + "pnl": -67.35535649865233, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41089068186189, + "entry_time": "2022-03-05T00:00:00", + "exit_price": 90.18677881527823, + "exit_reason": "signal", + "exit_time": "2022-03-06T00:00:00", + "pnl": -122.4111866583662, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43901544778934, + "entry_time": "2022-03-08T00:00:00", + "exit_price": 91.5260369404649, + "exit_reason": "signal", + "exit_time": "2022-03-09T00:00:00", + "pnl": 8.702149267555797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.01177208564718, + "entry_time": "2022-03-11T00:00:00", + "exit_price": 91.36159823018748, + "exit_reason": "signal", + "exit_time": "2022-03-12T00:00:00", + "pnl": 34.982614454031136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8208251198108, + "entry_time": "2022-03-14T00:00:00", + "exit_price": 91.28071492977152, + "exit_reason": "signal", + "exit_time": "2022-03-15T00:00:00", + "pnl": 45.988980996071405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9250036260453, + "entry_time": "2022-03-17T00:00:00", + "exit_price": 90.6150063093046, + "exit_reason": "signal", + "exit_time": "2022-03-18T00:00:00", + "pnl": -130.99973167406824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.61363931969464, + "entry_time": "2022-03-20T00:00:00", + "exit_price": 90.38004154259693, + "exit_reason": "signal", + "exit_time": "2022-03-21T00:00:00", + "pnl": -23.35977770977297, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.96467806287603, + "entry_time": "2022-03-23T00:00:00", + "exit_price": 90.70041523761671, + "exit_reason": "signal", + "exit_time": "2022-03-24T00:00:00", + "pnl": -26.426282525932038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.62074541364396, + "entry_time": "2022-03-26T00:00:00", + "exit_price": 90.95651159207543, + "exit_reason": "signal", + "exit_time": "2022-03-27T00:00:00", + "pnl": 33.57661784314587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05267669381955, + "entry_time": "2022-03-29T00:00:00", + "exit_price": 91.69416855510607, + "exit_reason": "signal", + "exit_time": "2022-03-30T00:00:00", + "pnl": 64.14918612865222, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8695133244266, + "entry_time": "2022-04-01T00:00:00", + "exit_price": 90.61012799594212, + "exit_reason": "signal", + "exit_time": "2022-04-02T00:00:00", + "pnl": -25.93853284844772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05464751490084, + "entry_time": "2022-04-04T00:00:00", + "exit_price": 90.46681240023963, + "exit_reason": "signal", + "exit_time": "2022-04-05T00:00:00", + "pnl": 41.216488533878874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63067407291008, + "entry_time": "2022-04-07T00:00:00", + "exit_price": 89.96046847840074, + "exit_reason": "signal", + "exit_time": "2022-04-08T00:00:00", + "pnl": -67.02055945093343, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56273021751427, + "entry_time": "2022-04-10T00:00:00", + "exit_price": 90.14638715063298, + "exit_reason": "signal", + "exit_time": "2022-04-11T00:00:00", + "pnl": -41.63430668812907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75859326793318, + "entry_time": "2022-04-13T00:00:00", + "exit_price": 90.97823499949781, + "exit_reason": "signal", + "exit_time": "2022-04-14T00:00:00", + "pnl": 121.96417315646431, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.15637756363428, + "entry_time": "2022-04-16T00:00:00", + "exit_price": 89.71453147899727, + "exit_reason": "signal", + "exit_time": "2022-04-17T00:00:00", + "pnl": -44.18460846370181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.00941330347686, + "entry_time": "2022-04-19T00:00:00", + "exit_price": 90.97249110306038, + "exit_reason": "signal", + "exit_time": "2022-04-20T00:00:00", + "pnl": 96.3077799583516, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.44900384555615, + "entry_time": "2022-04-22T00:00:00", + "exit_price": 90.26380626108603, + "exit_reason": "signal", + "exit_time": "2022-04-23T00:00:00", + "pnl": -18.519758447011554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9389490074607, + "entry_time": "2022-04-25T00:00:00", + "exit_price": 90.91676356991597, + "exit_reason": "signal", + "exit_time": "2022-04-26T00:00:00", + "pnl": 97.78145624552599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.13685393625028, + "entry_time": "2022-04-28T00:00:00", + "exit_price": 90.92025914672816, + "exit_reason": "signal", + "exit_time": "2022-04-29T00:00:00", + "pnl": 78.34052104778675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9636459548143, + "entry_time": "2022-05-01T00:00:00", + "exit_price": 90.9470309766908, + "exit_reason": "signal", + "exit_time": "2022-05-02T00:00:00", + "pnl": 98.3385021876511, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23464868145118, + "entry_time": "2022-05-04T00:00:00", + "exit_price": 92.16095300836626, + "exit_reason": "signal", + "exit_time": "2022-05-05T00:00:00", + "pnl": 92.63043269150876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86371979002092, + "entry_time": "2022-05-07T00:00:00", + "exit_price": 90.1658806519524, + "exit_reason": "signal", + "exit_time": "2022-05-08T00:00:00", + "pnl": -69.78391380685025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80999909964301, + "entry_time": "2022-05-10T00:00:00", + "exit_price": 91.3916052906719, + "exit_reason": "signal", + "exit_time": "2022-05-11T00:00:00", + "pnl": 58.16061910288954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79830122498419, + "entry_time": "2022-05-13T00:00:00", + "exit_price": 91.92464426243117, + "exit_reason": "signal", + "exit_time": "2022-05-14T00:00:00", + "pnl": 12.634303744698627, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74084404129732, + "entry_time": "2022-05-16T00:00:00", + "exit_price": 91.77591195761288, + "exit_reason": "signal", + "exit_time": "2022-05-17T00:00:00", + "pnl": 3.5067916315565526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129082151163, + "entry_time": "2022-05-19T00:00:00", + "exit_price": 91.29443539538282, + "exit_reason": "signal", + "exit_time": "2022-05-20T00:00:00", + "pnl": 16.535324421982295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.49821093674116, + "entry_time": "2022-05-22T00:00:00", + "exit_price": 90.52895961614624, + "exit_reason": "signal", + "exit_time": "2022-05-23T00:00:00", + "pnl": 103.07486794050783, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.50773769923417, + "entry_time": "2022-05-25T00:00:00", + "exit_price": 90.20586243304412, + "exit_reason": "signal", + "exit_time": "2022-05-26T00:00:00", + "pnl": -30.18752661900544, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1593251595947, + "entry_time": "2022-05-28T00:00:00", + "exit_price": 90.8652392547076, + "exit_reason": "signal", + "exit_time": "2022-05-29T00:00:00", + "pnl": -29.408590488710615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.88148378297518, + "entry_time": "2022-05-31T00:00:00", + "exit_price": 90.54298539634833, + "exit_reason": "signal", + "exit_time": "2022-06-01T00:00:00", + "pnl": 66.15016133731478, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.97268456538903, + "entry_time": "2022-06-03T00:00:00", + "exit_price": 91.62712854780935, + "exit_reason": "signal", + "exit_time": "2022-06-04T00:00:00", + "pnl": 65.44439824203255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.74146887774299, + "entry_time": "2022-06-06T00:00:00", + "exit_price": 90.42853595632805, + "exit_reason": "signal", + "exit_time": "2022-06-07T00:00:00", + "pnl": -31.29329214149402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84848168731004, + "entry_time": "2022-06-09T00:00:00", + "exit_price": 90.83668379255865, + "exit_reason": "signal", + "exit_time": "2022-06-10T00:00:00", + "pnl": -1.1797894751398417, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.47241973433749, + "entry_time": "2022-06-12T00:00:00", + "exit_price": 89.89842730786603, + "exit_reason": "signal", + "exit_time": "2022-06-13T00:00:00", + "pnl": -57.39924264714682, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82455441317694, + "entry_time": "2022-06-15T00:00:00", + "exit_price": 90.16986826544031, + "exit_reason": "signal", + "exit_time": "2022-06-16T00:00:00", + "pnl": -65.46861477366292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1811588929617, + "entry_time": "2022-06-18T00:00:00", + "exit_price": 90.09911654611165, + "exit_reason": "signal", + "exit_time": "2022-06-19T00:00:00", + "pnl": 91.79576531499515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.55257557802233, + "entry_time": "2022-06-21T00:00:00", + "exit_price": 90.6008717295654, + "exit_reason": "signal", + "exit_time": "2022-06-22T00:00:00", + "pnl": 4.829615154307248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.68671023186488, + "entry_time": "2022-06-24T00:00:00", + "exit_price": 89.96517472835333, + "exit_reason": "signal", + "exit_time": "2022-06-25T00:00:00", + "pnl": -72.15355035115317, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05260562521785, + "entry_time": "2022-06-27T00:00:00", + "exit_price": 90.08006582461334, + "exit_reason": "signal", + "exit_time": "2022-06-28T00:00:00", + "pnl": 2.746019939548205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79432064186736, + "entry_time": "2022-06-30T00:00:00", + "exit_price": 92.41108821991375, + "exit_reason": "signal", + "exit_time": "2022-07-01T00:00:00", + "pnl": 161.67675780463833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87347025830266, + "entry_time": "2022-07-03T00:00:00", + "exit_price": 91.20564533828777, + "exit_reason": "signal", + "exit_time": "2022-07-04T00:00:00", + "pnl": 33.21750799850997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30309517181773, + "entry_time": "2022-07-06T00:00:00", + "exit_price": 90.1406611037728, + "exit_reason": "signal", + "exit_time": "2022-07-07T00:00:00", + "pnl": -116.24340680449313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.24392591685461, + "entry_time": "2022-07-09T00:00:00", + "exit_price": 91.10896639776044, + "exit_reason": "signal", + "exit_time": "2022-07-10T00:00:00", + "pnl": 86.50404809058273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43429707485602, + "entry_time": "2022-07-12T00:00:00", + "exit_price": 90.99823744300166, + "exit_reason": "signal", + "exit_time": "2022-07-13T00:00:00", + "pnl": -43.60596318543685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51160983247296, + "entry_time": "2022-07-15T00:00:00", + "exit_price": 91.15695774047701, + "exit_reason": "signal", + "exit_time": "2022-07-16T00:00:00", + "pnl": 64.53479080040597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.25313076740179, + "entry_time": "2022-07-18T00:00:00", + "exit_price": 90.3503914171167, + "exit_reason": "signal", + "exit_time": "2022-07-19T00:00:00", + "pnl": -90.27393502850828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47393608345517, + "entry_time": "2022-07-21T00:00:00", + "exit_price": 89.98751697992218, + "exit_reason": "signal", + "exit_time": "2022-07-22T00:00:00", + "pnl": -148.64191035329895, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.0545116492653, + "entry_time": "2022-07-24T00:00:00", + "exit_price": 91.01799823084976, + "exit_reason": "signal", + "exit_time": "2022-07-25T00:00:00", + "pnl": -103.65134184155431, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05081241841744, + "entry_time": "2022-07-27T00:00:00", + "exit_price": 91.31407916672543, + "exit_reason": "signal", + "exit_time": "2022-07-28T00:00:00", + "pnl": 26.326674830799675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80885265421585, + "entry_time": "2022-07-30T00:00:00", + "exit_price": 91.15205975168703, + "exit_reason": "signal", + "exit_time": "2022-07-31T00:00:00", + "pnl": 34.32070974711678, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47241880815605, + "entry_time": "2022-08-02T00:00:00", + "exit_price": 91.54172600484964, + "exit_reason": "signal", + "exit_time": "2022-08-03T00:00:00", + "pnl": 6.93071966935895, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8976774720573, + "entry_time": "2022-08-05T00:00:00", + "exit_price": 91.58791087448299, + "exit_reason": "signal", + "exit_time": "2022-08-06T00:00:00", + "pnl": -30.976659757430753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02271267015783, + "entry_time": "2022-08-08T00:00:00", + "exit_price": 91.10459083951521, + "exit_reason": "signal", + "exit_time": "2022-08-09T00:00:00", + "pnl": -91.81218306426308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24414870008319, + "entry_time": "2022-08-11T00:00:00", + "exit_price": 92.69109127617371, + "exit_reason": "signal", + "exit_time": "2022-08-12T00:00:00", + "pnl": 44.69425760905142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.65306278042236, + "entry_time": "2022-08-14T00:00:00", + "exit_price": 92.39816620647916, + "exit_reason": "signal", + "exit_time": "2022-08-15T00:00:00", + "pnl": 74.51034260568122, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1810606061523, + "entry_time": "2022-08-17T00:00:00", + "exit_price": 92.49470462633181, + "exit_reason": "signal", + "exit_time": "2022-08-18T00:00:00", + "pnl": -68.63559798204915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01504374556126, + "entry_time": "2022-08-20T00:00:00", + "exit_price": 92.67904663244455, + "exit_reason": "signal", + "exit_time": "2022-08-21T00:00:00", + "pnl": 66.40028868832997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74908045175502, + "entry_time": "2022-08-23T00:00:00", + "exit_price": 93.28081352108578, + "exit_reason": "signal", + "exit_time": "2022-08-24T00:00:00", + "pnl": -46.826693066923326, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72430502818085, + "entry_time": "2022-08-26T00:00:00", + "exit_price": 92.91000509633356, + "exit_reason": "signal", + "exit_time": "2022-08-27T00:00:00", + "pnl": -81.42999318472721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0266388958905, + "entry_time": "2022-08-29T00:00:00", + "exit_price": 93.06932306108122, + "exit_reason": "signal", + "exit_time": "2022-08-30T00:00:00", + "pnl": 4.268416519071252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2669116718157, + "entry_time": "2022-09-01T00:00:00", + "exit_price": 93.31911690207038, + "exit_reason": "signal", + "exit_time": "2022-09-02T00:00:00", + "pnl": 5.220523025467628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01378736632232, + "entry_time": "2022-09-04T00:00:00", + "exit_price": 92.69057272581715, + "exit_reason": "signal", + "exit_time": "2022-09-05T00:00:00", + "pnl": -32.321464050517534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86605080021333, + "entry_time": "2022-09-07T00:00:00", + "exit_price": 93.54829275642138, + "exit_reason": "signal", + "exit_time": "2022-09-08T00:00:00", + "pnl": 68.2241956208054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92761316198515, + "entry_time": "2022-09-10T00:00:00", + "exit_price": 92.07281692163534, + "exit_reason": "signal", + "exit_time": "2022-09-11T00:00:00", + "pnl": -185.4796240349824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2809228591007, + "entry_time": "2022-09-13T00:00:00", + "exit_price": 94.11130793179962, + "exit_reason": "signal", + "exit_time": "2022-09-14T00:00:00", + "pnl": -16.961492730108148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78210365621943, + "entry_time": "2022-09-16T00:00:00", + "exit_price": 94.99114272050637, + "exit_reason": "signal", + "exit_time": "2022-09-17T00:00:00", + "pnl": 20.903906428693517, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26603620619441, + "entry_time": "2022-09-19T00:00:00", + "exit_price": 95.26895473010688, + "exit_reason": "signal", + "exit_time": "2022-09-20T00:00:00", + "pnl": 100.29185239124672, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88756691851471, + "entry_time": "2022-09-22T00:00:00", + "exit_price": 94.90535085923925, + "exit_reason": "signal", + "exit_time": "2022-09-23T00:00:00", + "pnl": 1.7783940724530112, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.86627784439669, + "entry_time": "2022-09-25T00:00:00", + "exit_price": 94.27678234231546, + "exit_reason": "signal", + "exit_time": "2022-09-26T00:00:00", + "pnl": -58.94955020812449, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21120724189035, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 93.62182381785365, + "exit_reason": "signal", + "exit_time": "2022-09-29T00:00:00", + "pnl": -58.938342403669594, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70089986040492, + "entry_time": "2022-10-01T00:00:00", + "exit_price": 94.98061841891752, + "exit_reason": "signal", + "exit_time": "2022-10-02T00:00:00", + "pnl": 27.971855851259534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.63730668221625, + "entry_time": "2022-10-04T00:00:00", + "exit_price": 95.21809213108293, + "exit_reason": "signal", + "exit_time": "2022-10-05T00:00:00", + "pnl": 58.07854488666817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62513446883317, + "entry_time": "2022-10-07T00:00:00", + "exit_price": 95.0550792423482, + "exit_reason": "signal", + "exit_time": "2022-10-08T00:00:00", + "pnl": 42.99447735150352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71116560219859, + "entry_time": "2022-10-10T00:00:00", + "exit_price": 94.70112878957045, + "exit_reason": "signal", + "exit_time": "2022-10-11T00:00:00", + "pnl": 98.99631873718499, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22008595203475, + "entry_time": "2022-10-13T00:00:00", + "exit_price": 95.26583380518775, + "exit_reason": "signal", + "exit_time": "2022-10-14T00:00:00", + "pnl": 104.57478531530069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84031644841893, + "entry_time": "2022-10-16T00:00:00", + "exit_price": 94.76253265375746, + "exit_reason": "signal", + "exit_time": "2022-10-17T00:00:00", + "pnl": -7.778379466146362, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36921450181964, + "entry_time": "2022-10-19T00:00:00", + "exit_price": 94.38751561741323, + "exit_reason": "signal", + "exit_time": "2022-10-20T00:00:00", + "pnl": 101.83011155935856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7594276079707, + "entry_time": "2022-10-22T00:00:00", + "exit_price": 94.20505090808615, + "exit_reason": "signal", + "exit_time": "2022-10-23T00:00:00", + "pnl": -55.43766998845422, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01993010545006, + "entry_time": "2022-10-25T00:00:00", + "exit_price": 94.25253006691226, + "exit_reason": "signal", + "exit_time": "2022-10-26T00:00:00", + "pnl": -76.74000385377985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9292129294191, + "entry_time": "2022-10-28T00:00:00", + "exit_price": 95.45831791808807, + "exit_reason": "signal", + "exit_time": "2022-10-29T00:00:00", + "pnl": 52.91049886689689, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01874761761506, + "entry_time": "2022-10-31T00:00:00", + "exit_price": 95.70179579177142, + "exit_reason": "signal", + "exit_time": "2022-11-01T00:00:00", + "pnl": 68.30481741563563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.45782648578765, + "entry_time": "2022-11-03T00:00:00", + "exit_price": 95.9654506293958, + "exit_reason": "signal", + "exit_time": "2022-11-04T00:00:00", + "pnl": -49.237585639184545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.69543160906309, + "entry_time": "2022-11-06T00:00:00", + "exit_price": 96.23626703373414, + "exit_reason": "signal", + "exit_time": "2022-11-07T00:00:00", + "pnl": 54.08354246710405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23730582460071, + "entry_time": "2022-11-09T00:00:00", + "exit_price": 94.58630669240723, + "exit_reason": "signal", + "exit_time": "2022-11-10T00:00:00", + "pnl": -65.09991321934831, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.24411442253736, + "entry_time": "2022-11-12T00:00:00", + "exit_price": 94.80412345904836, + "exit_reason": "signal", + "exit_time": "2022-11-13T00:00:00", + "pnl": -43.99909634890173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33266826608637, + "entry_time": "2022-11-15T00:00:00", + "exit_price": 94.08584208568091, + "exit_reason": "signal", + "exit_time": "2022-11-16T00:00:00", + "pnl": -24.682618040546004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20511704388718, + "entry_time": "2022-11-18T00:00:00", + "exit_price": 93.73586252939168, + "exit_reason": "signal", + "exit_time": "2022-11-19T00:00:00", + "pnl": -46.925451449549655, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6229802242446, + "entry_time": "2022-11-21T00:00:00", + "exit_price": 93.66558700926207, + "exit_reason": "signal", + "exit_time": "2022-11-22T00:00:00", + "pnl": -95.73932149825305, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74677062129318, + "entry_time": "2022-11-24T00:00:00", + "exit_price": 93.54017463980657, + "exit_reason": "signal", + "exit_time": "2022-11-25T00:00:00", + "pnl": -20.659598148660734, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.730138438308, + "entry_time": "2022-11-27T00:00:00", + "exit_price": 93.49572076787184, + "exit_reason": "signal", + "exit_time": "2022-11-28T00:00:00", + "pnl": -23.441767043615982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77203615539878, + "entry_time": "2022-11-30T00:00:00", + "exit_price": 92.91635203682458, + "exit_reason": "signal", + "exit_time": "2022-12-01T00:00:00", + "pnl": -85.56841185742087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91294155802173, + "entry_time": "2022-12-03T00:00:00", + "exit_price": 92.85493736088272, + "exit_reason": "signal", + "exit_time": "2022-12-04T00:00:00", + "pnl": -105.80041971389983, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07037492573126, + "entry_time": "2022-12-06T00:00:00", + "exit_price": 93.35918129576551, + "exit_reason": "signal", + "exit_time": "2022-12-07T00:00:00", + "pnl": -71.11936299657646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21752684184962, + "entry_time": "2022-12-09T00:00:00", + "exit_price": 93.82182795562746, + "exit_reason": "signal", + "exit_time": "2022-12-10T00:00:00", + "pnl": 60.43011137778376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91554181329224, + "entry_time": "2022-12-12T00:00:00", + "exit_price": 93.2637454877203, + "exit_reason": "signal", + "exit_time": "2022-12-13T00:00:00", + "pnl": -65.17963255719405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42377971468683, + "entry_time": "2022-12-15T00:00:00", + "exit_price": 92.9956096009709, + "exit_reason": "signal", + "exit_time": "2022-12-16T00:00:00", + "pnl": -42.81701137159325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95024629295155, + "entry_time": "2022-12-18T00:00:00", + "exit_price": 92.02384747382928, + "exit_reason": "signal", + "exit_time": "2022-12-19T00:00:00", + "pnl": -92.63988191222597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.73848563922941, + "entry_time": "2022-12-21T00:00:00", + "exit_price": 91.78634727970504, + "exit_reason": "signal", + "exit_time": "2022-12-22T00:00:00", + "pnl": 104.78616404756394, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.46503843997183, + "entry_time": "2022-12-24T00:00:00", + "exit_price": 91.75198886376967, + "exit_reason": "signal", + "exit_time": "2022-12-25T00:00:00", + "pnl": 28.695042379784354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.39876122857235, + "entry_time": "2022-12-27T00:00:00", + "exit_price": 92.11567284541557, + "exit_reason": "signal", + "exit_time": "2022-12-28T00:00:00", + "pnl": -28.30883831567735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77091533493147, + "entry_time": "2022-12-30T00:00:00", + "exit_price": 93.3485194106044, + "exit_reason": "signal", + "exit_time": "2022-12-31T00:00:00", + "pnl": 57.76040756729344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04122370969267, + "entry_time": "2023-01-02T00:00:00", + "exit_price": 92.97807111210727, + "exit_reason": "signal", + "exit_time": "2023-01-03T00:00:00", + "pnl": 93.68474024146053, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82297627909733, + "entry_time": "2023-01-05T00:00:00", + "exit_price": 92.88908258807695, + "exit_reason": "signal", + "exit_time": "2023-01-06T00:00:00", + "pnl": 6.610630897961528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.02494822567454, + "entry_time": "2023-01-08T00:00:00", + "exit_price": 92.52813633390632, + "exit_reason": "signal", + "exit_time": "2023-01-09T00:00:00", + "pnl": -49.681189176822954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77607586946252, + "entry_time": "2023-01-11T00:00:00", + "exit_price": 92.84906975105618, + "exit_reason": "signal", + "exit_time": "2023-01-12T00:00:00", + "pnl": 7.299388159366572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10682536410768, + "entry_time": "2023-01-14T00:00:00", + "exit_price": 92.60098332710814, + "exit_reason": "signal", + "exit_time": "2023-01-15T00:00:00", + "pnl": -50.58420369995474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16477240647922, + "entry_time": "2023-01-17T00:00:00", + "exit_price": 93.64464350405021, + "exit_reason": "signal", + "exit_time": "2023-01-18T00:00:00", + "pnl": 47.98710975709764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34853961981467, + "entry_time": "2023-01-20T00:00:00", + "exit_price": 92.90164291858915, + "exit_reason": "signal", + "exit_time": "2023-01-21T00:00:00", + "pnl": 55.31032987744766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52920571661875, + "entry_time": "2023-01-23T00:00:00", + "exit_price": 92.96718442791747, + "exit_reason": "signal", + "exit_time": "2023-01-24T00:00:00", + "pnl": -56.202128870127126, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1449985691514, + "entry_time": "2023-01-26T00:00:00", + "exit_price": 93.09214526901171, + "exit_reason": "signal", + "exit_time": "2023-01-27T00:00:00", + "pnl": -105.28533001396863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08808617199072, + "entry_time": "2023-01-29T00:00:00", + "exit_price": 93.57735843418071, + "exit_reason": "signal", + "exit_time": "2023-01-30T00:00:00", + "pnl": -51.07277378100116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.03374091329063, + "entry_time": "2023-02-01T00:00:00", + "exit_price": 92.67153521214688, + "exit_reason": "signal", + "exit_time": "2023-02-02T00:00:00", + "pnl": -136.2205701143739, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90721494360177, + "entry_time": "2023-02-04T00:00:00", + "exit_price": 92.94800270723887, + "exit_reason": "signal", + "exit_time": "2023-02-05T00:00:00", + "pnl": 4.078776363709039, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77341143396697, + "entry_time": "2023-02-07T00:00:00", + "exit_price": 93.16810608211969, + "exit_reason": "signal", + "exit_time": "2023-02-08T00:00:00", + "pnl": -60.53053518472916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1295561924666, + "entry_time": "2023-02-10T00:00:00", + "exit_price": 93.6109897663897, + "exit_reason": "signal", + "exit_time": "2023-02-11T00:00:00", + "pnl": 48.143357392309554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09160273927316, + "entry_time": "2023-02-13T00:00:00", + "exit_price": 93.33166346007059, + "exit_reason": "signal", + "exit_time": "2023-02-14T00:00:00", + "pnl": -75.99392792025537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53620789150742, + "entry_time": "2023-02-16T00:00:00", + "exit_price": 94.21568894504843, + "exit_reason": "signal", + "exit_time": "2023-02-17T00:00:00", + "pnl": -32.051894645899665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93343913761625, + "entry_time": "2023-02-19T00:00:00", + "exit_price": 94.02299067534886, + "exit_reason": "signal", + "exit_time": "2023-02-20T00:00:00", + "pnl": 8.955153773262282, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18544500815403, + "entry_time": "2023-02-22T00:00:00", + "exit_price": 93.98907937476646, + "exit_reason": "signal", + "exit_time": "2023-02-23T00:00:00", + "pnl": -19.636563338757696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45348785433026, + "entry_time": "2023-02-25T00:00:00", + "exit_price": 95.02085687929099, + "exit_reason": "signal", + "exit_time": "2023-02-26T00:00:00", + "pnl": 56.73690249607171, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84830391916218, + "entry_time": "2023-02-28T00:00:00", + "exit_price": 94.43699045607909, + "exit_reason": "signal", + "exit_time": "2023-03-01T00:00:00", + "pnl": -41.13134630830791, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.95759166912262, + "entry_time": "2023-03-03T00:00:00", + "exit_price": 93.47551491598016, + "exit_reason": "signal", + "exit_time": "2023-03-04T00:00:00", + "pnl": -48.20767531424826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66498305754212, + "entry_time": "2023-03-06T00:00:00", + "exit_price": 93.36643618283398, + "exit_reason": "signal", + "exit_time": "2023-03-07T00:00:00", + "pnl": -29.854687470813587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3496449568648, + "entry_time": "2023-03-09T00:00:00", + "exit_price": 93.06229907806569, + "exit_reason": "signal", + "exit_time": "2023-03-10T00:00:00", + "pnl": -28.734587879909668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93784310790696, + "entry_time": "2023-03-12T00:00:00", + "exit_price": 92.96780942003683, + "exit_reason": "signal", + "exit_time": "2023-03-13T00:00:00", + "pnl": -97.00336878701273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88445131540618, + "entry_time": "2023-03-15T00:00:00", + "exit_price": 94.08186481058257, + "exit_reason": "signal", + "exit_time": "2023-03-16T00:00:00", + "pnl": 19.74134951763881, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20796655389181, + "entry_time": "2023-03-18T00:00:00", + "exit_price": 91.9654081254928, + "exit_reason": "signal", + "exit_time": "2023-03-19T00:00:00", + "pnl": -24.25584283990065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49393791749024, + "entry_time": "2023-03-21T00:00:00", + "exit_price": 92.05007592523164, + "exit_reason": "signal", + "exit_time": "2023-03-22T00:00:00", + "pnl": -44.386199225860764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.84518996211608, + "entry_time": "2023-03-24T00:00:00", + "exit_price": 92.32190345568543, + "exit_reason": "signal", + "exit_time": "2023-03-25T00:00:00", + "pnl": 47.671349356935025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32827178627502, + "entry_time": "2023-03-27T00:00:00", + "exit_price": 93.26562867244172, + "exit_reason": "signal", + "exit_time": "2023-03-28T00:00:00", + "pnl": -6.264311383329186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9489490131078, + "entry_time": "2023-03-30T00:00:00", + "exit_price": 93.54756230484855, + "exit_reason": "signal", + "exit_time": "2023-03-31T00:00:00", + "pnl": 59.861329174074854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52695826109523, + "entry_time": "2023-04-02T00:00:00", + "exit_price": 93.16120912048845, + "exit_reason": "signal", + "exit_time": "2023-04-03T00:00:00", + "pnl": -36.57491406067675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73109278013733, + "entry_time": "2023-04-05T00:00:00", + "exit_price": 92.12967158946792, + "exit_reason": "signal", + "exit_time": "2023-04-06T00:00:00", + "pnl": -60.14211906694072, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66144197243285, + "entry_time": "2023-04-08T00:00:00", + "exit_price": 92.35105870140517, + "exit_reason": "signal", + "exit_time": "2023-04-09T00:00:00", + "pnl": -31.038327102769472, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32497954050243, + "entry_time": "2023-04-11T00:00:00", + "exit_price": 92.404028525945, + "exit_reason": "signal", + "exit_time": "2023-04-12T00:00:00", + "pnl": -92.09510145574313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5596224194739, + "entry_time": "2023-04-14T00:00:00", + "exit_price": 93.06373732644884, + "exit_reason": "signal", + "exit_time": "2023-04-15T00:00:00", + "pnl": 50.41149069749554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82924854494932, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 92.63616550173667, + "exit_reason": "signal", + "exit_time": "2023-04-18T00:00:00", + "pnl": -19.308304321264586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79933273190036, + "entry_time": "2023-04-20T00:00:00", + "exit_price": 92.95120755426662, + "exit_reason": "signal", + "exit_time": "2023-04-21T00:00:00", + "pnl": 15.187482236626238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56403816854014, + "entry_time": "2023-04-23T00:00:00", + "exit_price": 92.35426808914588, + "exit_reason": "signal", + "exit_time": "2023-04-24T00:00:00", + "pnl": -20.977007939425675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35865607168631, + "entry_time": "2023-04-26T00:00:00", + "exit_price": 92.90482034285156, + "exit_reason": "signal", + "exit_time": "2023-04-27T00:00:00", + "pnl": -45.3835728834747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9985787957225, + "entry_time": "2023-04-29T00:00:00", + "exit_price": 92.8768940380532, + "exit_reason": "signal", + "exit_time": "2023-04-30T00:00:00", + "pnl": -12.168475766929987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86502942650776, + "entry_time": "2023-05-02T00:00:00", + "exit_price": 92.82867955654159, + "exit_reason": "signal", + "exit_time": "2023-05-03T00:00:00", + "pnl": -3.634986996616135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06669061925808, + "entry_time": "2023-05-05T00:00:00", + "exit_price": 93.05805100493505, + "exit_reason": "signal", + "exit_time": "2023-05-06T00:00:00", + "pnl": -0.8639614323019487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19478081630376, + "entry_time": "2023-05-08T00:00:00", + "exit_price": 92.4726753044577, + "exit_reason": "signal", + "exit_time": "2023-05-09T00:00:00", + "pnl": -72.21055118460572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87741920594638, + "entry_time": "2023-05-11T00:00:00", + "exit_price": 93.47630925649874, + "exit_reason": "signal", + "exit_time": "2023-05-12T00:00:00", + "pnl": 159.88900505523452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67940992744533, + "entry_time": "2023-05-14T00:00:00", + "exit_price": 93.83387030747774, + "exit_reason": "signal", + "exit_time": "2023-05-15T00:00:00", + "pnl": 115.44603800323966, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77541066961662, + "entry_time": "2023-05-17T00:00:00", + "exit_price": 93.21806909335821, + "exit_reason": "signal", + "exit_time": "2023-05-18T00:00:00", + "pnl": 44.26584237415955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2116719393634, + "entry_time": "2023-05-20T00:00:00", + "exit_price": 93.63189068076446, + "exit_reason": "signal", + "exit_time": "2023-05-21T00:00:00", + "pnl": 42.021874140105865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31676028980675, + "entry_time": "2023-05-23T00:00:00", + "exit_price": 93.96917376263126, + "exit_reason": "signal", + "exit_time": "2023-05-24T00:00:00", + "pnl": 65.24134728245008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.3332407570871, + "entry_time": "2023-05-26T00:00:00", + "exit_price": 94.63597205774145, + "exit_reason": "signal", + "exit_time": "2023-05-27T00:00:00", + "pnl": 30.273130065435907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00130198273087, + "entry_time": "2023-05-29T00:00:00", + "exit_price": 94.05926832590498, + "exit_reason": "signal", + "exit_time": "2023-05-30T00:00:00", + "pnl": 5.79663431741028, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76190103073331, + "entry_time": "2023-06-01T00:00:00", + "exit_price": 94.24963627943364, + "exit_reason": "signal", + "exit_time": "2023-06-02T00:00:00", + "pnl": 148.77352487003373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.73904226779082, + "entry_time": "2023-06-04T00:00:00", + "exit_price": 94.53198582108524, + "exit_reason": "signal", + "exit_time": "2023-06-05T00:00:00", + "pnl": -20.705644670559195, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29391446442062, + "entry_time": "2023-06-07T00:00:00", + "exit_price": 94.60323551607766, + "exit_reason": "signal", + "exit_time": "2023-06-08T00:00:00", + "pnl": 30.932105165702524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.17535379161295, + "entry_time": "2023-06-10T00:00:00", + "exit_price": 94.95745054254392, + "exit_reason": "signal", + "exit_time": "2023-06-11T00:00:00", + "pnl": 78.20967509309776, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65432843266518, + "entry_time": "2023-06-13T00:00:00", + "exit_price": 94.33856790601594, + "exit_reason": "signal", + "exit_time": "2023-06-14T00:00:00", + "pnl": -31.576052664924646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.36956060356385, + "entry_time": "2023-06-16T00:00:00", + "exit_price": 95.2507487739047, + "exit_reason": "signal", + "exit_time": "2023-06-17T00:00:00", + "pnl": 88.11881703408471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.98092766917739, + "entry_time": "2023-06-19T00:00:00", + "exit_price": 94.16338627425559, + "exit_reason": "signal", + "exit_time": "2023-06-20T00:00:00", + "pnl": -81.75413949218091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95283790294347, + "entry_time": "2023-06-22T00:00:00", + "exit_price": 94.37363985497257, + "exit_reason": "signal", + "exit_time": "2023-06-23T00:00:00", + "pnl": -57.919804797089455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41734797456819, + "entry_time": "2023-06-25T00:00:00", + "exit_price": 94.46879833485087, + "exit_reason": "signal", + "exit_time": "2023-06-26T00:00:00", + "pnl": 5.145036028268805, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89779171625212, + "entry_time": "2023-06-28T00:00:00", + "exit_price": 94.56566914846213, + "exit_reason": "signal", + "exit_time": "2023-06-29T00:00:00", + "pnl": 66.78774322100071, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12295330761387, + "entry_time": "2023-07-01T00:00:00", + "exit_price": 94.47229523041987, + "exit_reason": "signal", + "exit_time": "2023-07-02T00:00:00", + "pnl": 34.934192280601565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01642931045993, + "entry_time": "2023-07-04T00:00:00", + "exit_price": 94.97899403484826, + "exit_reason": "signal", + "exit_time": "2023-07-05T00:00:00", + "pnl": 96.25647243883213, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29040521639678, + "entry_time": "2023-07-07T00:00:00", + "exit_price": 94.62958711128005, + "exit_reason": "signal", + "exit_time": "2023-07-08T00:00:00", + "pnl": -66.0818105116723, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94114223449, + "entry_time": "2023-07-10T00:00:00", + "exit_price": 94.38592136937638, + "exit_reason": "signal", + "exit_time": "2023-07-11T00:00:00", + "pnl": -55.52208651136243, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493222435549, + "entry_time": "2023-07-13T00:00:00", + "exit_price": 94.3474523152517, + "exit_reason": "signal", + "exit_time": "2023-07-14T00:00:00", + "pnl": -14.577012029729303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.84805377401344, + "entry_time": "2023-07-16T00:00:00", + "exit_price": 93.24313248176318, + "exit_reason": "signal", + "exit_time": "2023-07-17T00:00:00", + "pnl": -60.492129225025565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23716867785055, + "entry_time": "2023-07-19T00:00:00", + "exit_price": 94.3344550507391, + "exit_reason": "signal", + "exit_time": "2023-07-20T00:00:00", + "pnl": 109.72863728885386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25058017257405, + "entry_time": "2023-07-22T00:00:00", + "exit_price": 94.26148603669161, + "exit_reason": "signal", + "exit_time": "2023-07-23T00:00:00", + "pnl": 1.090586411755794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78124566715694, + "entry_time": "2023-07-25T00:00:00", + "exit_price": 93.30392352510412, + "exit_reason": "signal", + "exit_time": "2023-07-26T00:00:00", + "pnl": -147.7322142052817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05471403229689, + "entry_time": "2023-07-28T00:00:00", + "exit_price": 93.26889976544973, + "exit_reason": "signal", + "exit_time": "2023-07-29T00:00:00", + "pnl": -78.58142668471555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.97149252732743, + "entry_time": "2023-07-31T00:00:00", + "exit_price": 92.49652862514738, + "exit_reason": "signal", + "exit_time": "2023-08-01T00:00:00", + "pnl": -147.4963902180043, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49761686858754, + "entry_time": "2023-08-03T00:00:00", + "exit_price": 93.96133483843103, + "exit_reason": "signal", + "exit_time": "2023-08-04T00:00:00", + "pnl": 46.3717969843492, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60373115569557, + "entry_time": "2023-08-06T00:00:00", + "exit_price": 94.43278823558683, + "exit_reason": "signal", + "exit_time": "2023-08-07T00:00:00", + "pnl": 82.90570798912631, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.216186422251, + "entry_time": "2023-08-09T00:00:00", + "exit_price": 93.22790913521419, + "exit_reason": "signal", + "exit_time": "2023-08-10T00:00:00", + "pnl": -98.8277287036799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5392105794396, + "entry_time": "2023-08-12T00:00:00", + "exit_price": 93.3857390941578, + "exit_reason": "signal", + "exit_time": "2023-08-13T00:00:00", + "pnl": -115.3471485281807, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0337408175209, + "entry_time": "2023-08-15T00:00:00", + "exit_price": 94.39823678210567, + "exit_reason": "signal", + "exit_time": "2023-08-16T00:00:00", + "pnl": 136.44959645847666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08940418013472, + "entry_time": "2023-08-18T00:00:00", + "exit_price": 92.65920217896303, + "exit_reason": "signal", + "exit_time": "2023-08-19T00:00:00", + "pnl": -143.02020011716922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39853539402684, + "entry_time": "2023-08-21T00:00:00", + "exit_price": 93.65048655775455, + "exit_reason": "signal", + "exit_time": "2023-08-22T00:00:00", + "pnl": 25.195116372769917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79873760769597, + "entry_time": "2023-08-24T00:00:00", + "exit_price": 93.68828575617101, + "exit_reason": "signal", + "exit_time": "2023-08-25T00:00:00", + "pnl": 88.95481484750417, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87251964203307, + "entry_time": "2023-08-27T00:00:00", + "exit_price": 93.5300255114375, + "exit_reason": "signal", + "exit_time": "2023-08-28T00:00:00", + "pnl": -34.2494130595569, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79086592344467, + "entry_time": "2023-08-30T00:00:00", + "exit_price": 92.57270931229704, + "exit_reason": "signal", + "exit_time": "2023-08-31T00:00:00", + "pnl": -121.81566111476423, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88859692291733, + "entry_time": "2023-09-02T00:00:00", + "exit_price": 93.80271734344691, + "exit_reason": "signal", + "exit_time": "2023-09-03T00:00:00", + "pnl": -8.587957947042014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04073002158317, + "entry_time": "2023-09-05T00:00:00", + "exit_price": 94.46828834544144, + "exit_reason": "signal", + "exit_time": "2023-09-06T00:00:00", + "pnl": 142.75583238582658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23692924750448, + "entry_time": "2023-09-08T00:00:00", + "exit_price": 94.43771978777833, + "exit_reason": "signal", + "exit_time": "2023-09-09T00:00:00", + "pnl": 20.0790540273847, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09517649815284, + "entry_time": "2023-09-11T00:00:00", + "exit_price": 94.97835234626153, + "exit_reason": "signal", + "exit_time": "2023-09-12T00:00:00", + "pnl": 88.31758481086945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79133291522645, + "entry_time": "2023-09-14T00:00:00", + "exit_price": 94.02945945000636, + "exit_reason": "signal", + "exit_time": "2023-09-15T00:00:00", + "pnl": -76.18734652200874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45235296621496, + "entry_time": "2023-09-17T00:00:00", + "exit_price": 94.63061442838703, + "exit_reason": "signal", + "exit_time": "2023-09-18T00:00:00", + "pnl": 17.82614621720677, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1729530420449, + "entry_time": "2023-09-20T00:00:00", + "exit_price": 93.58327824763774, + "exit_reason": "signal", + "exit_time": "2023-09-21T00:00:00", + "pnl": -58.96747944071649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53629152727201, + "entry_time": "2023-09-23T00:00:00", + "exit_price": 93.30651397849368, + "exit_reason": "signal", + "exit_time": "2023-09-24T00:00:00", + "pnl": -22.977754877832922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69842586893596, + "entry_time": "2023-09-26T00:00:00", + "exit_price": 93.16248763742118, + "exit_reason": "signal", + "exit_time": "2023-09-27T00:00:00", + "pnl": -53.59382315147741, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49605102540508, + "entry_time": "2023-09-29T00:00:00", + "exit_price": 94.25313944944546, + "exit_reason": "signal", + "exit_time": "2023-09-30T00:00:00", + "pnl": 75.70884240403757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8421663218519, + "entry_time": "2023-10-02T00:00:00", + "exit_price": 92.97561455613513, + "exit_reason": "signal", + "exit_time": "2023-10-03T00:00:00", + "pnl": 13.344823428322343, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01878568439928, + "entry_time": "2023-10-05T00:00:00", + "exit_price": 92.7731623418128, + "exit_reason": "signal", + "exit_time": "2023-10-06T00:00:00", + "pnl": -24.562334258647752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3031103300392, + "entry_time": "2023-10-08T00:00:00", + "exit_price": 92.82895908639827, + "exit_reason": "signal", + "exit_time": "2023-10-09T00:00:00", + "pnl": -47.41512436409357, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34460637435383, + "entry_time": "2023-10-11T00:00:00", + "exit_price": 92.32181327562058, + "exit_reason": "signal", + "exit_time": "2023-10-12T00:00:00", + "pnl": -2.2793098733236548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.52607935640549, + "entry_time": "2023-10-14T00:00:00", + "exit_price": 92.2357948297768, + "exit_reason": "signal", + "exit_time": "2023-10-15T00:00:00", + "pnl": 70.97154733712887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68746434551585, + "entry_time": "2023-10-17T00:00:00", + "exit_price": 91.58592175261929, + "exit_reason": "signal", + "exit_time": "2023-10-18T00:00:00", + "pnl": -10.154259289656693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.4669708006904, + "entry_time": "2023-10-20T00:00:00", + "exit_price": 91.654447961068, + "exit_reason": "signal", + "exit_time": "2023-10-21T00:00:00", + "pnl": 18.747716037760256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3612670935331, + "entry_time": "2023-10-23T00:00:00", + "exit_price": 91.01031054901587, + "exit_reason": "signal", + "exit_time": "2023-10-24T00:00:00", + "pnl": -135.09565445172302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.37919304454006, + "entry_time": "2023-10-26T00:00:00", + "exit_price": 91.41169786096938, + "exit_reason": "signal", + "exit_time": "2023-10-27T00:00:00", + "pnl": -96.74951835706815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.29381617044329, + "entry_time": "2023-10-29T00:00:00", + "exit_price": 90.70386499802939, + "exit_reason": "signal", + "exit_time": "2023-10-30T00:00:00", + "pnl": -58.9951172413912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.42981226133158, + "entry_time": "2023-11-01T00:00:00", + "exit_price": 91.13311787546733, + "exit_reason": "signal", + "exit_time": "2023-11-02T00:00:00", + "pnl": -29.669438586422984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41698336938475, + "entry_time": "2023-11-04T00:00:00", + "exit_price": 91.39366908316057, + "exit_reason": "signal", + "exit_time": "2023-11-05T00:00:00", + "pnl": -2.3314286224194802, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89356698837386, + "entry_time": "2023-11-07T00:00:00", + "exit_price": 91.60226357609555, + "exit_reason": "signal", + "exit_time": "2023-11-08T00:00:00", + "pnl": -29.130341227830286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.41574363121151, + "entry_time": "2023-11-10T00:00:00", + "exit_price": 91.77307124686526, + "exit_reason": "signal", + "exit_time": "2023-11-11T00:00:00", + "pnl": -64.26723843462605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32527272706531, + "entry_time": "2023-11-13T00:00:00", + "exit_price": 94.02617500869306, + "exit_reason": "signal", + "exit_time": "2023-11-14T00:00:00", + "pnl": 170.09022816277502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94533987249052, + "entry_time": "2023-11-16T00:00:00", + "exit_price": 92.0185892574846, + "exit_reason": "signal", + "exit_time": "2023-11-17T00:00:00", + "pnl": -92.67506150059126, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.30963127571127, + "entry_time": "2023-11-19T00:00:00", + "exit_price": 92.25489319248068, + "exit_reason": "signal", + "exit_time": "2023-11-20T00:00:00", + "pnl": -5.47380832305862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74391567498765, + "entry_time": "2023-11-22T00:00:00", + "exit_price": 93.20889480054281, + "exit_reason": "signal", + "exit_time": "2023-11-23T00:00:00", + "pnl": 46.49791255551463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11263111652507, + "entry_time": "2023-11-25T00:00:00", + "exit_price": 93.10139698703692, + "exit_reason": "signal", + "exit_time": "2023-11-26T00:00:00", + "pnl": -101.1234129488148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71015543952899, + "entry_time": "2023-11-28T00:00:00", + "exit_price": 92.47583632063913, + "exit_reason": "signal", + "exit_time": "2023-11-29T00:00:00", + "pnl": -123.43191188898527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75986386635343, + "entry_time": "2023-12-01T00:00:00", + "exit_price": 94.27037620813209, + "exit_reason": "signal", + "exit_time": "2023-12-02T00:00:00", + "pnl": 151.05123417786672, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44774661355898, + "entry_time": "2023-12-04T00:00:00", + "exit_price": 93.99875783176927, + "exit_reason": "signal", + "exit_time": "2023-12-05T00:00:00", + "pnl": 55.101121821029665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58344310898, + "entry_time": "2023-12-07T00:00:00", + "exit_price": 94.14439051922356, + "exit_reason": "signal", + "exit_time": "2023-12-08T00:00:00", + "pnl": 56.094741024355244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.54039819515216, + "entry_time": "2023-12-10T00:00:00", + "exit_price": 92.9236778577475, + "exit_reason": "signal", + "exit_time": "2023-12-11T00:00:00", + "pnl": 38.32796625953415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05584126819757, + "entry_time": "2023-12-13T00:00:00", + "exit_price": 93.35601781114134, + "exit_reason": "signal", + "exit_time": "2023-12-14T00:00:00", + "pnl": 130.01765429437728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81351651597147, + "entry_time": "2023-12-16T00:00:00", + "exit_price": 92.84701543791368, + "exit_reason": "signal", + "exit_time": "2023-12-17T00:00:00", + "pnl": 3.3498921942209563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72332949821384, + "entry_time": "2023-12-19T00:00:00", + "exit_price": 92.51107159043487, + "exit_reason": "signal", + "exit_time": "2023-12-20T00:00:00", + "pnl": -21.22579077789851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91369044105626, + "entry_time": "2023-12-22T00:00:00", + "exit_price": 93.12129104458734, + "exit_reason": "signal", + "exit_time": "2023-12-23T00:00:00", + "pnl": -79.2399396468918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.14884637460803, + "entry_time": "2023-12-25T00:00:00", + "exit_price": 92.89417488264915, + "exit_reason": "signal", + "exit_time": "2023-12-26T00:00:00", + "pnl": 74.53285080411297, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12845985022912, + "entry_time": "2023-12-28T00:00:00", + "exit_price": 93.6597993052993, + "exit_reason": "signal", + "exit_time": "2023-12-29T00:00:00", + "pnl": 53.133945507017415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96178874818798, + "entry_time": "2023-12-31T00:00:00", + "exit_price": 94.4511703887473, + "exit_reason": "signal", + "exit_time": "2024-01-01T00:00:00", + "pnl": 48.93816405593134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.89229345893365, + "entry_time": "2024-01-03T00:00:00", + "exit_price": 94.58860576042824, + "exit_reason": "signal", + "exit_time": "2024-01-04T00:00:00", + "pnl": -30.368769850541867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.04178116383622, + "entry_time": "2024-01-06T00:00:00", + "exit_price": 94.4578576609693, + "exit_reason": "signal", + "exit_time": "2024-01-07T00:00:00", + "pnl": -58.39235028669282, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.86053478009173, + "entry_time": "2024-01-09T00:00:00", + "exit_price": 94.76430023458303, + "exit_reason": "signal", + "exit_time": "2024-01-10T00:00:00", + "pnl": -9.62345455087052, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8053175522895, + "entry_time": "2024-01-12T00:00:00", + "exit_price": 94.40836408730765, + "exit_reason": "signal", + "exit_time": "2024-01-13T00:00:00", + "pnl": -39.695346498183426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.85612524977265, + "entry_time": "2024-01-15T00:00:00", + "exit_price": 94.40863693697362, + "exit_reason": "signal", + "exit_time": "2024-01-16T00:00:00", + "pnl": -44.74883127990324, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09196518919534, + "entry_time": "2024-01-18T00:00:00", + "exit_price": 94.91994528712154, + "exit_reason": "signal", + "exit_time": "2024-01-19T00:00:00", + "pnl": -17.20199020738073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.4574772984541, + "entry_time": "2024-01-21T00:00:00", + "exit_price": 95.40486331313025, + "exit_reason": "signal", + "exit_time": "2024-01-22T00:00:00", + "pnl": -5.261398532384192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8856295626394, + "entry_time": "2024-01-24T00:00:00", + "exit_price": 95.41673292493975, + "exit_reason": "signal", + "exit_time": "2024-01-25T00:00:00", + "pnl": 53.11033623003641, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.3011515367656, + "entry_time": "2024-01-27T00:00:00", + "exit_price": 94.50993042362319, + "exit_reason": "signal", + "exit_time": "2024-01-28T00:00:00", + "pnl": -79.12211131424192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8443544450889, + "entry_time": "2024-01-30T00:00:00", + "exit_price": 94.58646684173618, + "exit_reason": "signal", + "exit_time": "2024-01-31T00:00:00", + "pnl": -25.788760335271945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.51863942815191, + "entry_time": "2024-02-02T00:00:00", + "exit_price": 95.02582579018504, + "exit_reason": "signal", + "exit_time": "2024-02-03T00:00:00", + "pnl": -49.28136379668649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.64624335712315, + "entry_time": "2024-02-05T00:00:00", + "exit_price": 95.62478266594604, + "exit_reason": "signal", + "exit_time": "2024-02-06T00:00:00", + "pnl": -2.1460691177107947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.97351592845855, + "entry_time": "2024-02-08T00:00:00", + "exit_price": 96.2565162152012, + "exit_reason": "signal", + "exit_time": "2024-02-09T00:00:00", + "pnl": 128.3000286742663, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32379857764126, + "entry_time": "2024-02-11T00:00:00", + "exit_price": 93.96151236382953, + "exit_reason": "signal", + "exit_time": "2024-02-12T00:00:00", + "pnl": -36.22862138117307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38409820559012, + "entry_time": "2024-02-14T00:00:00", + "exit_price": 94.76791246698865, + "exit_reason": "signal", + "exit_time": "2024-02-15T00:00:00", + "pnl": 38.38142613985292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.15204268625024, + "entry_time": "2024-02-17T00:00:00", + "exit_price": 94.14536275879573, + "exit_reason": "signal", + "exit_time": "2024-02-18T00:00:00", + "pnl": -100.66799274545156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92555424660308, + "entry_time": "2024-02-20T00:00:00", + "exit_price": 95.28378367357755, + "exit_reason": "signal", + "exit_time": "2024-02-21T00:00:00", + "pnl": 35.822942697446706, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6447277617356, + "entry_time": "2024-02-23T00:00:00", + "exit_price": 93.94359099606793, + "exit_reason": "signal", + "exit_time": "2024-02-24T00:00:00", + "pnl": -70.11367656676703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.63169426987818, + "entry_time": "2024-02-26T00:00:00", + "exit_price": 93.61709548381037, + "exit_reason": "signal", + "exit_time": "2024-02-27T00:00:00", + "pnl": -101.45987860678179, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99406223655019, + "entry_time": "2024-02-29T00:00:00", + "exit_price": 93.51586581649707, + "exit_reason": "signal", + "exit_time": "2024-03-01T00:00:00", + "pnl": 52.18035799468635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88355978598187, + "entry_time": "2024-03-03T00:00:00", + "exit_price": 93.59210068726338, + "exit_reason": "signal", + "exit_time": "2024-03-04T00:00:00", + "pnl": 70.85409012815035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.20766791171343, + "entry_time": "2024-03-06T00:00:00", + "exit_price": 93.03526629028748, + "exit_reason": "signal", + "exit_time": "2024-03-07T00:00:00", + "pnl": -17.24016214259609, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73917319444821, + "entry_time": "2024-03-09T00:00:00", + "exit_price": 93.21019311262798, + "exit_reason": "signal", + "exit_time": "2024-03-10T00:00:00", + "pnl": -52.89800818202275, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87224010683995, + "entry_time": "2024-03-12T00:00:00", + "exit_price": 93.42438731231145, + "exit_reason": "signal", + "exit_time": "2024-03-13T00:00:00", + "pnl": -44.78527945284986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32218202085551, + "entry_time": "2024-03-15T00:00:00", + "exit_price": 92.84840341954816, + "exit_reason": "signal", + "exit_time": "2024-03-16T00:00:00", + "pnl": -47.377860130734916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74542752078266, + "entry_time": "2024-03-18T00:00:00", + "exit_price": 93.97099698374726, + "exit_reason": "signal", + "exit_time": "2024-03-19T00:00:00", + "pnl": 22.55694629646132, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5673298293271, + "entry_time": "2024-03-21T00:00:00", + "exit_price": 90.9938401219299, + "exit_reason": "signal", + "exit_time": "2024-03-22T00:00:00", + "pnl": -157.34897073972024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89305134977978, + "entry_time": "2024-03-24T00:00:00", + "exit_price": 92.62217998545916, + "exit_reason": "signal", + "exit_time": "2024-03-25T00:00:00", + "pnl": -27.087136432062835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36509094658045, + "entry_time": "2024-03-27T00:00:00", + "exit_price": 92.88634389481254, + "exit_reason": "signal", + "exit_time": "2024-03-28T00:00:00", + "pnl": 52.125294823208606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09706919037085, + "entry_time": "2024-03-30T00:00:00", + "exit_price": 92.26411816919232, + "exit_reason": "signal", + "exit_time": "2024-03-31T00:00:00", + "pnl": -83.29510211785237, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87466770876313, + "entry_time": "2024-04-02T00:00:00", + "exit_price": 92.60479889553623, + "exit_reason": "signal", + "exit_time": "2024-04-03T00:00:00", + "pnl": -26.986881322687623, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20308651861096, + "entry_time": "2024-04-05T00:00:00", + "exit_price": 92.03254850546956, + "exit_reason": "signal", + "exit_time": "2024-04-06T00:00:00", + "pnl": -17.05380131413949, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.38853458659054, + "entry_time": "2024-04-08T00:00:00", + "exit_price": 92.15112623454131, + "exit_reason": "signal", + "exit_time": "2024-04-09T00:00:00", + "pnl": -23.740835204922405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96842409215192, + "entry_time": "2024-04-11T00:00:00", + "exit_price": 91.88812859002927, + "exit_reason": "signal", + "exit_time": "2024-04-12T00:00:00", + "pnl": -8.029550212266258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24664780939709, + "entry_time": "2024-04-14T00:00:00", + "exit_price": 92.55850895917358, + "exit_reason": "signal", + "exit_time": "2024-04-15T00:00:00", + "pnl": 31.186114977648685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87161322114831, + "entry_time": "2024-04-17T00:00:00", + "exit_price": 92.00535793552656, + "exit_reason": "signal", + "exit_time": "2024-04-18T00:00:00", + "pnl": -86.62552856217553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.4480286140058, + "entry_time": "2024-04-20T00:00:00", + "exit_price": 93.06090359266081, + "exit_reason": "signal", + "exit_time": "2024-04-21T00:00:00", + "pnl": 61.28749786549997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86729712174954, + "entry_time": "2024-04-23T00:00:00", + "exit_price": 91.52050959132679, + "exit_reason": "signal", + "exit_time": "2024-04-24T00:00:00", + "pnl": -234.67875304227528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.61545833641877, + "entry_time": "2024-04-26T00:00:00", + "exit_price": 93.11576558511285, + "exit_reason": "signal", + "exit_time": "2024-04-27T00:00:00", + "pnl": 50.03072486940982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.83965947403613, + "entry_time": "2024-04-29T00:00:00", + "exit_price": 92.12256163749144, + "exit_reason": "signal", + "exit_time": "2024-04-30T00:00:00", + "pnl": -71.70978365446899, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01797419460767, + "entry_time": "2024-05-02T00:00:00", + "exit_price": 93.19504665832812, + "exit_reason": "signal", + "exit_time": "2024-05-03T00:00:00", + "pnl": 117.70724637204512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.52501223027797, + "entry_time": "2024-05-05T00:00:00", + "exit_price": 93.70543373709387, + "exit_reason": "signal", + "exit_time": "2024-05-06T00:00:00", + "pnl": -81.95784931841081, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.76145907090128, + "entry_time": "2024-05-08T00:00:00", + "exit_price": 93.99231970762736, + "exit_reason": "signal", + "exit_time": "2024-05-09T00:00:00", + "pnl": 23.08606367260836, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72601264375818, + "entry_time": "2024-05-11T00:00:00", + "exit_price": 94.17294252688178, + "exit_reason": "signal", + "exit_time": "2024-05-12T00:00:00", + "pnl": 144.69298831235938, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66991995260973, + "entry_time": "2024-05-14T00:00:00", + "exit_price": 93.29227941579406, + "exit_reason": "signal", + "exit_time": "2024-05-15T00:00:00", + "pnl": -37.76405368156702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05260425345361, + "entry_time": "2024-05-17T00:00:00", + "exit_price": 93.08641894302396, + "exit_reason": "signal", + "exit_time": "2024-05-18T00:00:00", + "pnl": 3.381468957035395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89786622090341, + "entry_time": "2024-05-20T00:00:00", + "exit_price": 93.19281076082636, + "exit_reason": "signal", + "exit_time": "2024-05-21T00:00:00", + "pnl": 29.49445399229444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00268172437694, + "entry_time": "2024-05-23T00:00:00", + "exit_price": 93.8031782169886, + "exit_reason": "signal", + "exit_time": "2024-05-24T00:00:00", + "pnl": 80.04964926116554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30303744020942, + "entry_time": "2024-05-26T00:00:00", + "exit_price": 93.96047444085842, + "exit_reason": "signal", + "exit_time": "2024-05-27T00:00:00", + "pnl": -34.2562999351012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53102238294964, + "entry_time": "2024-05-29T00:00:00", + "exit_price": 93.55135190498416, + "exit_reason": "signal", + "exit_time": "2024-05-30T00:00:00", + "pnl": 2.032952203451714, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73320965755092, + "entry_time": "2024-06-01T00:00:00", + "exit_price": 93.83108861382613, + "exit_reason": "signal", + "exit_time": "2024-06-02T00:00:00", + "pnl": 9.787895627519902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66116571648418, + "entry_time": "2024-06-04T00:00:00", + "exit_price": 93.37760682748707, + "exit_reason": "signal", + "exit_time": "2024-06-05T00:00:00", + "pnl": 71.64411110028959, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73832896665387, + "entry_time": "2024-06-07T00:00:00", + "exit_price": 93.55125645985115, + "exit_reason": "signal", + "exit_time": "2024-06-08T00:00:00", + "pnl": -18.70725068027241, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05801072220544, + "entry_time": "2024-06-10T00:00:00", + "exit_price": 93.19615016955767, + "exit_reason": "signal", + "exit_time": "2024-06-11T00:00:00", + "pnl": -86.18605526477586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71612053106102, + "entry_time": "2024-06-13T00:00:00", + "exit_price": 92.35363412291727, + "exit_reason": "signal", + "exit_time": "2024-06-14T00:00:00", + "pnl": -36.248640814375904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89683728827593, + "entry_time": "2024-06-16T00:00:00", + "exit_price": 93.45394449656699, + "exit_reason": "signal", + "exit_time": "2024-06-17T00:00:00", + "pnl": 55.71072082910541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64711251538863, + "entry_time": "2024-06-19T00:00:00", + "exit_price": 94.20425342905766, + "exit_reason": "signal", + "exit_time": "2024-06-20T00:00:00", + "pnl": 55.71409136690272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27286775878677, + "entry_time": "2024-06-22T00:00:00", + "exit_price": 93.11098684044114, + "exit_reason": "signal", + "exit_time": "2024-06-23T00:00:00", + "pnl": -16.188091834563238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82344576152076, + "entry_time": "2024-06-25T00:00:00", + "exit_price": 93.85991046136218, + "exit_reason": "signal", + "exit_time": "2024-06-26T00:00:00", + "pnl": 3.6464699841417314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76944869834962, + "entry_time": "2024-06-28T00:00:00", + "exit_price": 94.49443525385506, + "exit_reason": "signal", + "exit_time": "2024-06-29T00:00:00", + "pnl": 172.49865555054384, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26714007172914, + "entry_time": "2024-07-01T00:00:00", + "exit_price": 93.55312747617486, + "exit_reason": "signal", + "exit_time": "2024-07-02T00:00:00", + "pnl": -71.4012595554268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21338289364272, + "entry_time": "2024-07-04T00:00:00", + "exit_price": 93.50082066300278, + "exit_reason": "signal", + "exit_time": "2024-07-05T00:00:00", + "pnl": -71.25622306399418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2831851440446, + "entry_time": "2024-07-07T00:00:00", + "exit_price": 92.64838687037759, + "exit_reason": "signal", + "exit_time": "2024-07-08T00:00:00", + "pnl": -63.47982736670019, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7216517557643, + "entry_time": "2024-07-10T00:00:00", + "exit_price": 92.97199380174195, + "exit_reason": "signal", + "exit_time": "2024-07-11T00:00:00", + "pnl": -74.96579540223684, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55110234448432, + "entry_time": "2024-07-13T00:00:00", + "exit_price": 92.47254018419862, + "exit_reason": "signal", + "exit_time": "2024-07-14T00:00:00", + "pnl": -107.85621602856918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.35333984916058, + "entry_time": "2024-07-16T00:00:00", + "exit_price": 92.55290357280875, + "exit_reason": "signal", + "exit_time": "2024-07-17T00:00:00", + "pnl": 19.956372364815252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.92761668682888, + "entry_time": "2024-07-19T00:00:00", + "exit_price": 92.52405415324874, + "exit_reason": "signal", + "exit_time": "2024-07-20T00:00:00", + "pnl": 59.64374664198658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01759216619796, + "entry_time": "2024-07-22T00:00:00", + "exit_price": 91.9301791723341, + "exit_reason": "signal", + "exit_time": "2024-07-23T00:00:00", + "pnl": -8.741299386385435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98789247555584, + "entry_time": "2024-07-25T00:00:00", + "exit_price": 92.13492749804534, + "exit_reason": "signal", + "exit_time": "2024-07-26T00:00:00", + "pnl": 14.703502248950826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.88900920001714, + "entry_time": "2024-07-28T00:00:00", + "exit_price": 91.63316803265334, + "exit_reason": "signal", + "exit_time": "2024-07-29T00:00:00", + "pnl": -25.584116736379656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.85577813730865, + "entry_time": "2024-07-31T00:00:00", + "exit_price": 92.25060393364089, + "exit_reason": "signal", + "exit_time": "2024-08-01T00:00:00", + "pnl": 39.482579633224304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37992029678232, + "entry_time": "2024-08-03T00:00:00", + "exit_price": 91.2161626045396, + "exit_reason": "signal", + "exit_time": "2024-08-04T00:00:00", + "pnl": -16.375769224270698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94097148564505, + "entry_time": "2024-08-06T00:00:00", + "exit_price": 91.61411385344917, + "exit_reason": "signal", + "exit_time": "2024-08-07T00:00:00", + "pnl": -32.68576321958972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.26633312852945, + "entry_time": "2024-08-09T00:00:00", + "exit_price": 92.57486927906898, + "exit_reason": "signal", + "exit_time": "2024-08-10T00:00:00", + "pnl": 30.853615053951216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25460128509323, + "entry_time": "2024-08-12T00:00:00", + "exit_price": 92.93806274853755, + "exit_reason": "signal", + "exit_time": "2024-08-13T00:00:00", + "pnl": -31.653853655569037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88821464003595, + "entry_time": "2024-08-15T00:00:00", + "exit_price": 92.53437593350753, + "exit_reason": "signal", + "exit_time": "2024-08-16T00:00:00", + "pnl": -35.38387065284223, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5558255899151, + "entry_time": "2024-08-18T00:00:00", + "exit_price": 92.57746904834741, + "exit_reason": "signal", + "exit_time": "2024-08-19T00:00:00", + "pnl": 2.1643458432317857, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35186779566517, + "entry_time": "2024-08-21T00:00:00", + "exit_price": 93.8222066824917, + "exit_reason": "signal", + "exit_time": "2024-08-22T00:00:00", + "pnl": 47.033888682653924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33239215677628, + "entry_time": "2024-08-24T00:00:00", + "exit_price": 92.65684927729922, + "exit_reason": "signal", + "exit_time": "2024-08-25T00:00:00", + "pnl": -67.55428794770523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07995330778445, + "entry_time": "2024-08-27T00:00:00", + "exit_price": 93.14274907856505, + "exit_reason": "signal", + "exit_time": "2024-08-28T00:00:00", + "pnl": 6.279577078059447, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.31638915313647, + "entry_time": "2024-08-30T00:00:00", + "exit_price": 92.80125655346451, + "exit_reason": "signal", + "exit_time": "2024-08-31T00:00:00", + "pnl": -151.51325996719606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86908900365832, + "entry_time": "2024-09-02T00:00:00", + "exit_price": 92.43258549076677, + "exit_reason": "signal", + "exit_time": "2024-09-03T00:00:00", + "pnl": -43.65035128915588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74183853860589, + "entry_time": "2024-09-05T00:00:00", + "exit_price": 93.04661736537737, + "exit_reason": "signal", + "exit_time": "2024-09-06T00:00:00", + "pnl": 30.477882677147136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.18409149189986, + "entry_time": "2024-09-08T00:00:00", + "exit_price": 92.27288236124933, + "exit_reason": "signal", + "exit_time": "2024-09-09T00:00:00", + "pnl": 108.87908693494501, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66757472286284, + "entry_time": "2024-09-11T00:00:00", + "exit_price": 91.66108329653197, + "exit_reason": "signal", + "exit_time": "2024-09-12T00:00:00", + "pnl": -100.64914263308674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0113429588981, + "entry_time": "2024-09-14T00:00:00", + "exit_price": 92.01542580767834, + "exit_reason": "signal", + "exit_time": "2024-09-15T00:00:00", + "pnl": 100.40828487802537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87145951112795, + "entry_time": "2024-09-17T00:00:00", + "exit_price": 91.58043482842866, + "exit_reason": "signal", + "exit_time": "2024-09-18T00:00:00", + "pnl": 70.89753173007011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28456359684716, + "entry_time": "2024-09-20T00:00:00", + "exit_price": 91.42689177563531, + "exit_reason": "signal", + "exit_time": "2024-09-21T00:00:00", + "pnl": 114.23281787881388, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.10394740945229, + "entry_time": "2024-09-23T00:00:00", + "exit_price": 91.5888902773369, + "exit_reason": "signal", + "exit_time": "2024-09-24T00:00:00", + "pnl": 148.49428678846198, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05233318851363, + "entry_time": "2024-09-26T00:00:00", + "exit_price": 91.20379964517136, + "exit_reason": "signal", + "exit_time": "2024-09-27T00:00:00", + "pnl": 15.146645665774486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93054848304011, + "entry_time": "2024-09-29T00:00:00", + "exit_price": 91.4470753529935, + "exit_reason": "signal", + "exit_time": "2024-09-30T00:00:00", + "pnl": 51.65268699533772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55093725008568, + "entry_time": "2024-10-02T00:00:00", + "exit_price": 90.1771270171211, + "exit_reason": "signal", + "exit_time": "2024-10-03T00:00:00", + "pnl": -137.3810232964588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51951955539236, + "entry_time": "2024-10-05T00:00:00", + "exit_price": 90.35054775405881, + "exit_reason": "signal", + "exit_time": "2024-10-06T00:00:00", + "pnl": -16.897180133355505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20200706252784, + "entry_time": "2024-10-08T00:00:00", + "exit_price": 91.07198645570766, + "exit_reason": "signal", + "exit_time": "2024-10-09T00:00:00", + "pnl": -13.002060682018055, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.13850851279538, + "entry_time": "2024-10-11T00:00:00", + "exit_price": 90.2608758916971, + "exit_reason": "signal", + "exit_time": "2024-10-12T00:00:00", + "pnl": -87.76326210982734, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93035699558081, + "entry_time": "2024-10-14T00:00:00", + "exit_price": 90.52157669994283, + "exit_reason": "signal", + "exit_time": "2024-10-15T00:00:00", + "pnl": -40.8780295637971, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49395863364698, + "entry_time": "2024-10-17T00:00:00", + "exit_price": 89.86316250689507, + "exit_reason": "signal", + "exit_time": "2024-10-18T00:00:00", + "pnl": -63.07961267519204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.18352844268802, + "entry_time": "2024-10-20T00:00:00", + "exit_price": 88.93546496698286, + "exit_reason": "signal", + "exit_time": "2024-10-21T00:00:00", + "pnl": -124.80634757051484, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.8113095296125, + "entry_time": "2024-10-23T00:00:00", + "exit_price": 89.54696410392557, + "exit_reason": "signal", + "exit_time": "2024-10-24T00:00:00", + "pnl": -26.43454256869336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.08012041438292, + "entry_time": "2024-10-26T00:00:00", + "exit_price": 89.23016998477505, + "exit_reason": "signal", + "exit_time": "2024-10-27T00:00:00", + "pnl": 15.004957039212968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.84774198158706, + "entry_time": "2024-10-29T00:00:00", + "exit_price": 89.88558944915762, + "exit_reason": "signal", + "exit_time": "2024-10-30T00:00:00", + "pnl": 3.7847467570554727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52000332438061, + "entry_time": "2024-11-01T00:00:00", + "exit_price": 88.86871340352687, + "exit_reason": "signal", + "exit_time": "2024-11-02T00:00:00", + "pnl": 34.87100791462581, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.58373696827199, + "entry_time": "2024-11-04T00:00:00", + "exit_price": 88.82208371804109, + "exit_reason": "signal", + "exit_time": "2024-11-05T00:00:00", + "pnl": -76.16532502309019, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32832910147938, + "entry_time": "2024-11-07T00:00:00", + "exit_price": 89.06529443738525, + "exit_reason": "signal", + "exit_time": "2024-11-08T00:00:00", + "pnl": -26.303466409412067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45977666376373, + "entry_time": "2024-11-10T00:00:00", + "exit_price": 89.24686599676619, + "exit_reason": "signal", + "exit_time": "2024-11-11T00:00:00", + "pnl": -121.29106669975408, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21043430906948, + "entry_time": "2024-11-13T00:00:00", + "exit_price": 88.4518561142622, + "exit_reason": "signal", + "exit_time": "2024-11-14T00:00:00", + "pnl": -75.85781948072872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.80819601768098, + "entry_time": "2024-11-16T00:00:00", + "exit_price": 88.9586155221746, + "exit_reason": "signal", + "exit_time": "2024-11-17T00:00:00", + "pnl": 15.041950449362048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.14254378792333, + "entry_time": "2024-11-19T00:00:00", + "exit_price": 88.6718045936633, + "exit_reason": "signal", + "exit_time": "2024-11-20T00:00:00", + "pnl": -47.07391942600407, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.3689677842857, + "entry_time": "2024-11-22T00:00:00", + "exit_price": 88.87620295869029, + "exit_reason": "signal", + "exit_time": "2024-11-23T00:00:00", + "pnl": -49.27648255954227, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.06997514477666, + "entry_time": "2024-11-25T00:00:00", + "exit_price": 88.79230048470953, + "exit_reason": "signal", + "exit_time": "2024-11-26T00:00:00", + "pnl": -27.76746600671322, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.69842658289039, + "entry_time": "2024-11-28T00:00:00", + "exit_price": 88.84366945841847, + "exit_reason": "signal", + "exit_time": "2024-11-29T00:00:00", + "pnl": -85.47571244719074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75521347785288, + "entry_time": "2024-12-01T00:00:00", + "exit_price": 89.14459057740478, + "exit_reason": "signal", + "exit_time": "2024-12-02T00:00:00", + "pnl": -61.06229004481065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.78540826994568, + "entry_time": "2024-12-04T00:00:00", + "exit_price": 89.0389294134589, + "exit_reason": "signal", + "exit_time": "2024-12-05T00:00:00", + "pnl": 25.352114351322598, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.11917253451473, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 99.54841534502786, + "exit_time": "2020-01-04T00:00:00", + "gross_pnl": -157.07571894868693, + "pnl": -157.07571894868693, + "pnlcomm": -157.07571894868693, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.03201587878578, + "entry_time": "2020-01-06T00:00:00", + "exit_price": 99.94550278474797, + "exit_time": "2020-01-07T00:00:00", + "gross_pnl": -8.651309403781227, + "pnl": -8.651309403781227, + "pnlcomm": -8.651309403781227, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.67183298908238, + "entry_time": "2020-01-09T00:00:00", + "exit_price": 99.86549713479145, + "exit_time": "2020-01-10T00:00:00", + "gross_pnl": 19.366414570907864, + "pnl": 19.366414570907864, + "pnlcomm": 19.366414570907864, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.1916089774142, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 100.48697641782272, + "exit_time": "2020-01-13T00:00:00", + "gross_pnl": 29.536744040851204, + "pnl": 29.536744040851204, + "pnlcomm": 29.536744040851204, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.74505140134526, + "entry_time": "2020-01-15T00:00:00", + "exit_price": 99.43249701182592, + "exit_time": "2020-01-16T00:00:00", + "gross_pnl": -31.255438951934877, + "pnl": -31.255438951934877, + "pnlcomm": -31.255438951934877, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36317339817481, + "entry_time": "2020-01-18T00:00:00", + "exit_price": 100.3184784020995, + "exit_time": "2020-01-19T00:00:00", + "gross_pnl": 95.53050039246926, + "pnl": 95.53050039246926, + "pnlcomm": 95.53050039246926, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.59194698786014, + "entry_time": "2020-01-21T00:00:00", + "exit_price": 99.21300773889088, + "exit_time": "2020-01-22T00:00:00", + "gross_pnl": -37.89392489692602, + "pnl": -37.89392489692602, + "pnlcomm": -37.89392489692602, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.93323693635863, + "entry_time": "2020-01-24T00:00:00", + "exit_price": 101.01041702546699, + "exit_time": "2020-01-25T00:00:00", + "gross_pnl": 107.71800891083672, + "pnl": 107.71800891083672, + "pnlcomm": 107.71800891083672, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.12882215455511, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 98.82503838919212, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -130.37837653629936, + "pnl": -130.37837653629936, + "pnlcomm": -130.37837653629936, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20974209562837, + "entry_time": "2020-01-30T00:00:00", + "exit_price": 99.28418162139361, + "exit_time": "2020-01-31T00:00:00", + "gross_pnl": 7.443952576524282, + "pnl": 7.443952576524282, + "pnlcomm": 7.443952576524282, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91262465479312, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 98.47079432451613, + "exit_time": "2020-02-03T00:00:00", + "gross_pnl": -144.18303302769857, + "pnl": -144.18303302769857, + "pnlcomm": -144.18303302769857, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.41396612142576, + "entry_time": "2020-02-05T00:00:00", + "exit_price": 99.74208634353057, + "exit_time": "2020-02-06T00:00:00", + "gross_pnl": 132.81202221048147, + "pnl": 132.81202221048147, + "pnlcomm": 132.81202221048147, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96112016066532, + "entry_time": "2020-02-08T00:00:00", + "exit_price": 99.14757933275934, + "exit_time": "2020-02-09T00:00:00", + "gross_pnl": 18.64591720940183, + "pnl": 18.64591720940183, + "pnlcomm": 18.64591720940183, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.33794797010775, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 98.95774776632322, + "exit_time": "2020-02-12T00:00:00", + "gross_pnl": -38.02002037845256, + "pnl": -38.02002037845256, + "pnlcomm": -38.02002037845256, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.39809150990905, + "entry_time": "2020-02-14T00:00:00", + "exit_price": 99.29624163714647, + "exit_time": "2020-02-15T00:00:00", + "gross_pnl": -10.18498727625854, + "pnl": -10.18498727625854, + "pnlcomm": -10.18498727625854, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98044425919083, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 98.71415014911958, + "exit_time": "2020-02-18T00:00:00", + "gross_pnl": -26.629411007125725, + "pnl": -26.629411007125725, + "pnlcomm": -26.629411007125725, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68703409584346, + "entry_time": "2020-02-20T00:00:00", + "exit_price": 99.19660477578049, + "exit_time": "2020-02-21T00:00:00", + "gross_pnl": 50.957067993702765, + "pnl": 50.957067993702765, + "pnlcomm": 50.957067993702765, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.09913803201934, + "entry_time": "2020-02-23T00:00:00", + "exit_price": 99.13975001075532, + "exit_time": "2020-02-24T00:00:00", + "gross_pnl": -95.93880212640187, + "pnl": -95.93880212640187, + "pnlcomm": -95.93880212640187, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7525000464393, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 98.67014960303162, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": -8.235044340767672, + "pnl": -8.235044340767672, + "pnlcomm": -8.235044340767672, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.16172259245428, + "entry_time": "2020-02-29T00:00:00", + "exit_price": 99.99277550738104, + "exit_time": "2020-03-01T00:00:00", + "gross_pnl": 83.1052914926758, + "pnl": 83.1052914926758, + "pnlcomm": 83.1052914926758, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.726000665382, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 99.27597137389321, + "exit_time": "2020-03-04T00:00:00", + "gross_pnl": 54.997070851121066, + "pnl": 54.997070851121066, + "pnlcomm": 54.997070851121066, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.96674656359579, + "entry_time": "2020-03-06T00:00:00", + "exit_price": 99.01407453019127, + "exit_time": "2020-03-07T00:00:00", + "gross_pnl": -95.26720334045251, + "pnl": -95.26720334045251, + "pnlcomm": -95.26720334045251, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01883446140224, + "entry_time": "2020-03-09T00:00:00", + "exit_price": 99.33686580554885, + "exit_time": "2020-03-10T00:00:00", + "gross_pnl": 31.803134414661827, + "pnl": 31.803134414661827, + "pnlcomm": 31.803134414661827, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.61379453469056, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 99.44418682978016, + "exit_time": "2020-03-13T00:00:00", + "gross_pnl": -16.960770491039057, + "pnl": -16.960770491039057, + "pnlcomm": -16.960770491039057, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.1261570487614, + "entry_time": "2020-03-15T00:00:00", + "exit_price": 98.90367229199478, + "exit_time": "2020-03-16T00:00:00", + "gross_pnl": 77.75152432333812, + "pnl": 77.75152432333812, + "pnlcomm": 77.75152432333812, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.48715448535594, + "entry_time": "2020-03-18T00:00:00", + "exit_price": 98.53898885220806, + "exit_time": "2020-03-19T00:00:00", + "gross_pnl": -94.81656331478803, + "pnl": -94.81656331478803, + "pnlcomm": -94.81656331478803, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.13695584567007, + "entry_time": "2020-03-21T00:00:00", + "exit_price": 98.74920846022493, + "exit_time": "2020-03-22T00:00:00", + "gross_pnl": -138.7747385445138, + "pnl": -138.7747385445138, + "pnlcomm": -138.7747385445138, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.28346179234327, + "entry_time": "2020-03-24T00:00:00", + "exit_price": 99.39446913633991, + "exit_time": "2020-03-25T00:00:00", + "gross_pnl": 11.100734399663281, + "pnl": 11.100734399663281, + "pnlcomm": 11.100734399663281, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38048314487808, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 98.86853857797571, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": -51.19445669023719, + "pnl": -51.19445669023719, + "pnlcomm": -51.19445669023719, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.78335766752544, + "entry_time": "2020-03-30T00:00:00", + "exit_price": 100.08258048792489, + "exit_time": "2020-03-31T00:00:00", + "gross_pnl": 29.922282039945003, + "pnl": 29.922282039945003, + "pnlcomm": 29.922282039945003, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.04409706752067, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 100.00584315640894, + "exit_time": "2020-04-03T00:00:00", + "gross_pnl": -3.8253911111723937, + "pnl": -3.8253911111723937, + "pnlcomm": -3.8253911111723937, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17754603801194, + "entry_time": "2020-04-05T00:00:00", + "exit_price": 99.91386750387461, + "exit_time": "2020-04-06T00:00:00", + "gross_pnl": 73.63214658626731, + "pnl": 73.63214658626731, + "pnlcomm": 73.63214658626731, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.07278397148802, + "entry_time": "2020-04-08T00:00:00", + "exit_price": 99.84957817071898, + "exit_time": "2020-04-09T00:00:00", + "gross_pnl": -122.3205800769037, + "pnl": -122.3205800769037, + "pnlcomm": -122.3205800769037, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.66685696016805, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 100.29703959359377, + "exit_time": "2020-04-12T00:00:00", + "gross_pnl": 63.018263342571856, + "pnl": 63.018263342571856, + "pnlcomm": 63.018263342571856, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.16284479663989, + "entry_time": "2020-04-14T00:00:00", + "exit_price": 99.59827392536462, + "exit_time": "2020-04-15T00:00:00", + "gross_pnl": -56.457087127526506, + "pnl": -56.457087127526506, + "pnlcomm": -56.457087127526506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.02427769637677, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 100.02034152325665, + "exit_time": "2020-04-18T00:00:00", + "gross_pnl": -0.39361731201239536, + "pnl": -0.39361731201239536, + "pnlcomm": -0.39361731201239536, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.10227360972624, + "entry_time": "2020-04-20T00:00:00", + "exit_price": 99.55074957264794, + "exit_time": "2020-04-21T00:00:00", + "gross_pnl": -55.15240370782948, + "pnl": -55.15240370782948, + "pnlcomm": -55.15240370782948, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4752285310497, + "entry_time": "2020-04-23T00:00:00", + "exit_price": 100.78482968977629, + "exit_time": "2020-04-24T00:00:00", + "gross_pnl": 30.960115872659344, + "pnl": 30.960115872659344, + "pnlcomm": 30.960115872659344, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64550269913406, + "entry_time": "2020-04-26T00:00:00", + "exit_price": 100.75829920829567, + "exit_time": "2020-04-27T00:00:00", + "gross_pnl": 11.279650916161188, + "pnl": 11.279650916161188, + "pnlcomm": 11.279650916161188, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.28405624956507, + "entry_time": "2020-04-29T00:00:00", + "exit_price": 100.40750734980367, + "exit_time": "2020-04-30T00:00:00", + "gross_pnl": 12.345110023859718, + "pnl": 12.345110023859718, + "pnlcomm": 12.345110023859718, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.9736108084372, + "entry_time": "2020-05-02T00:00:00", + "exit_price": 99.11719582995507, + "exit_time": "2020-05-03T00:00:00", + "gross_pnl": -185.64149784821353, + "pnl": -185.64149784821353, + "pnlcomm": -185.64149784821353, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.42442738415961, + "entry_time": "2020-05-05T00:00:00", + "exit_price": 100.46803368609852, + "exit_time": "2020-05-06T00:00:00", + "gross_pnl": 4.360630193890813, + "pnl": 4.360630193890813, + "pnlcomm": 4.360630193890813, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.65390080108091, + "entry_time": "2020-05-08T00:00:00", + "exit_price": 101.55529329412784, + "exit_time": "2020-05-09T00:00:00", + "gross_pnl": 90.13924930469273, + "pnl": 90.13924930469273, + "pnlcomm": 90.13924930469273, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.84475344760442, + "entry_time": "2020-05-11T00:00:00", + "exit_price": 101.34547532849058, + "exit_time": "2020-05-12T00:00:00", + "gross_pnl": 50.07218808861609, + "pnl": 50.07218808861609, + "pnlcomm": 50.07218808861609, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.83286932713185, + "entry_time": "2020-05-14T00:00:00", + "exit_price": 100.1414110724743, + "exit_time": "2020-05-15T00:00:00", + "gross_pnl": -69.14582546575474, + "pnl": -69.14582546575474, + "pnlcomm": -69.14582546575474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.70880723169135, + "entry_time": "2020-05-17T00:00:00", + "exit_price": 100.37107171120154, + "exit_time": "2020-05-18T00:00:00", + "gross_pnl": -33.773552048981514, + "pnl": -33.773552048981514, + "pnlcomm": -33.773552048981514, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17212988349165, + "entry_time": "2020-05-20T00:00:00", + "exit_price": 100.88968353827181, + "exit_time": "2020-05-21T00:00:00", + "gross_pnl": 171.75536547801613, + "pnl": 171.75536547801613, + "pnlcomm": 171.75536547801613, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17974473578754, + "entry_time": "2020-05-23T00:00:00", + "exit_price": 99.64495810760246, + "exit_time": "2020-05-24T00:00:00", + "gross_pnl": 46.521337181492584, + "pnl": 46.521337181492584, + "pnlcomm": 46.521337181492584, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86042757757674, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 99.42922022261914, + "exit_time": "2020-05-27T00:00:00", + "gross_pnl": 56.8792645042393, + "pnl": 56.8792645042393, + "pnlcomm": 56.8792645042393, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67123710700702, + "entry_time": "2020-05-29T00:00:00", + "exit_price": 99.1262468099545, + "exit_time": "2020-05-30T00:00:00", + "gross_pnl": 45.500970294747844, + "pnl": 45.500970294747844, + "pnlcomm": 45.500970294747844, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99803204217791, + "entry_time": "2020-06-01T00:00:00", + "exit_price": 98.0746490327229, + "exit_time": "2020-06-02T00:00:00", + "gross_pnl": 7.661699054499138, + "pnl": 7.661699054499138, + "pnlcomm": 7.661699054499138, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68852164950059, + "entry_time": "2020-06-04T00:00:00", + "exit_price": 98.90683245619206, + "exit_time": "2020-06-05T00:00:00", + "gross_pnl": 21.831080669147696, + "pnl": 21.831080669147696, + "pnlcomm": 21.831080669147696, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.6986709588789, + "entry_time": "2020-06-07T00:00:00", + "exit_price": 98.58028409299915, + "exit_time": "2020-06-08T00:00:00", + "gross_pnl": -11.838686587975644, + "pnl": -11.838686587975644, + "pnlcomm": -11.838686587975644, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78930171959787, + "entry_time": "2020-06-10T00:00:00", + "exit_price": 99.44349309161046, + "exit_time": "2020-06-11T00:00:00", + "gross_pnl": 65.41913720125905, + "pnl": 65.41913720125905, + "pnlcomm": 65.41913720125905, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.63928948741085, + "entry_time": "2020-06-13T00:00:00", + "exit_price": 99.8801021064717, + "exit_time": "2020-06-14T00:00:00", + "gross_pnl": 24.081261906084706, + "pnl": 24.081261906084706, + "pnlcomm": 24.081261906084706, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88804895153031, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 98.9129584357738, + "exit_time": "2020-06-17T00:00:00", + "gross_pnl": 2.490948424349426, + "pnl": 2.490948424349426, + "pnlcomm": 2.490948424349426, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.35911188288487, + "entry_time": "2020-06-19T00:00:00", + "exit_price": 99.55107978610341, + "exit_time": "2020-06-20T00:00:00", + "gross_pnl": 19.196790321853996, + "pnl": 19.196790321853996, + "pnlcomm": 19.196790321853996, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.24566283787111, + "entry_time": "2020-06-22T00:00:00", + "exit_price": 99.50854335078685, + "exit_time": "2020-06-23T00:00:00", + "gross_pnl": 26.288051291574277, + "pnl": 26.288051291574277, + "pnlcomm": 26.288051291574277, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85972377687798, + "entry_time": "2020-06-25T00:00:00", + "exit_price": 98.94180161552265, + "exit_time": "2020-06-26T00:00:00", + "gross_pnl": 8.207783864466478, + "pnl": 8.207783864466478, + "pnlcomm": 8.207783864466478, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42256786175977, + "entry_time": "2020-06-28T00:00:00", + "exit_price": 98.39260868907034, + "exit_time": "2020-06-29T00:00:00", + "gross_pnl": -2.99591726894306, + "pnl": -2.99591726894306, + "pnlcomm": -2.99591726894306, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47598985042309, + "entry_time": "2020-07-01T00:00:00", + "exit_price": 98.2217481384577, + "exit_time": "2020-07-02T00:00:00", + "gross_pnl": -25.42417119653919, + "pnl": -25.42417119653919, + "pnlcomm": -25.42417119653919, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43771261461684, + "entry_time": "2020-07-04T00:00:00", + "exit_price": 99.25556396259081, + "exit_time": "2020-07-05T00:00:00", + "gross_pnl": -18.214865202602937, + "pnl": -18.214865202602937, + "pnlcomm": -18.214865202602937, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27520136851216, + "entry_time": "2020-07-07T00:00:00", + "exit_price": 99.22895283520214, + "exit_time": "2020-07-08T00:00:00", + "gross_pnl": -4.624853331002043, + "pnl": -4.624853331002043, + "pnlcomm": -4.624853331002043, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84721164221584, + "entry_time": "2020-07-10T00:00:00", + "exit_price": 98.21690016032666, + "exit_time": "2020-07-11T00:00:00", + "gross_pnl": -63.031148188917996, + "pnl": -63.031148188917996, + "pnlcomm": -63.031148188917996, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98012439288168, + "entry_time": "2020-07-13T00:00:00", + "exit_price": 98.42241300564716, + "exit_time": "2020-07-14T00:00:00", + "gross_pnl": -55.77113872345194, + "pnl": -55.77113872345194, + "pnlcomm": -55.77113872345194, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.52349736477139, + "entry_time": "2020-07-16T00:00:00", + "exit_price": 98.84780174120549, + "exit_time": "2020-07-17T00:00:00", + "gross_pnl": -67.56956235659004, + "pnl": -67.56956235659004, + "pnlcomm": -67.56956235659004, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78357735159078, + "entry_time": "2020-07-19T00:00:00", + "exit_price": 98.5180376571157, + "exit_time": "2020-07-20T00:00:00", + "gross_pnl": -26.553969447508052, + "pnl": -26.553969447508052, + "pnlcomm": -26.553969447508052, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07885735340791, + "entry_time": "2020-07-22T00:00:00", + "exit_price": 98.46287786089891, + "exit_time": "2020-07-23T00:00:00", + "gross_pnl": 38.40205074910017, + "pnl": 38.40205074910017, + "pnlcomm": 38.40205074910017, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7806750796624, + "entry_time": "2020-07-25T00:00:00", + "exit_price": 98.99007562374577, + "exit_time": "2020-07-26T00:00:00", + "gross_pnl": 20.94005440833655, + "pnl": 20.94005440833655, + "pnlcomm": 20.94005440833655, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3160405598432, + "entry_time": "2020-07-28T00:00:00", + "exit_price": 97.69515591162462, + "exit_time": "2020-07-29T00:00:00", + "gross_pnl": -62.08846482185777, + "pnl": -62.08846482185777, + "pnlcomm": -62.08846482185777, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.9307950005457, + "entry_time": "2020-07-31T00:00:00", + "exit_price": 97.49497584845733, + "exit_time": "2020-08-01T00:00:00", + "gross_pnl": -43.581915208837074, + "pnl": -43.581915208837074, + "pnlcomm": -43.581915208837074, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.05277773908537, + "entry_time": "2020-08-03T00:00:00", + "exit_price": 97.63017059410102, + "exit_time": "2020-08-04T00:00:00", + "gross_pnl": -42.26071449843545, + "pnl": -42.26071449843545, + "pnlcomm": -42.26071449843545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.95560584181007, + "entry_time": "2020-08-06T00:00:00", + "exit_price": 97.85704345214471, + "exit_time": "2020-08-07T00:00:00", + "gross_pnl": -109.85623896653607, + "pnl": -109.85623896653607, + "pnlcomm": -109.85623896653607, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.34581983849665, + "entry_time": "2020-08-09T00:00:00", + "exit_price": 98.55148937480453, + "exit_time": "2020-08-10T00:00:00", + "gross_pnl": 120.56695363078802, + "pnl": 120.56695363078802, + "pnlcomm": 120.56695363078802, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.83406196186097, + "entry_time": "2020-08-12T00:00:00", + "exit_price": 97.25669377064881, + "exit_time": "2020-08-13T00:00:00", + "gross_pnl": -57.73681912121589, + "pnl": -57.73681912121589, + "pnlcomm": -57.73681912121589, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.51637945271536, + "entry_time": "2020-08-15T00:00:00", + "exit_price": 97.57103396676897, + "exit_time": "2020-08-16T00:00:00", + "gross_pnl": 5.465451405360966, + "pnl": 5.465451405360966, + "pnlcomm": 5.465451405360966, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.4383018584174, + "entry_time": "2020-08-18T00:00:00", + "exit_price": 98.4155507445711, + "exit_time": "2020-08-19T00:00:00", + "gross_pnl": -2.2751113846297244, + "pnl": -2.2751113846297244, + "pnlcomm": -2.2751113846297244, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.92267680402585, + "entry_time": "2020-08-21T00:00:00", + "exit_price": 98.75883349843212, + "exit_time": "2020-08-22T00:00:00", + "gross_pnl": 83.61566944062702, + "pnl": 83.61566944062702, + "pnlcomm": 83.61566944062702, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.974264479532, + "entry_time": "2020-08-24T00:00:00", + "exit_price": 99.70988332181, + "exit_time": "2020-08-25T00:00:00", + "gross_pnl": 173.56188422780008, + "pnl": 173.56188422780008, + "pnlcomm": 173.56188422780008, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21365266173217, + "entry_time": "2020-08-27T00:00:00", + "exit_price": 98.08294324004585, + "exit_time": "2020-08-28T00:00:00", + "gross_pnl": -113.07094216863192, + "pnl": -113.07094216863192, + "pnlcomm": -113.07094216863192, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11928874045203, + "entry_time": "2020-08-30T00:00:00", + "exit_price": 98.31180164071337, + "exit_time": "2020-08-31T00:00:00", + "gross_pnl": 19.25129002613346, + "pnl": 19.25129002613346, + "pnlcomm": 19.25129002613346, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.00054275724283, + "entry_time": "2020-09-02T00:00:00", + "exit_price": 98.65255133629894, + "exit_time": "2020-09-03T00:00:00", + "gross_pnl": 65.20085790561154, + "pnl": 65.20085790561154, + "pnlcomm": 65.20085790561154, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96503242935937, + "entry_time": "2020-09-05T00:00:00", + "exit_price": 98.79138811772025, + "exit_time": "2020-09-06T00:00:00", + "gross_pnl": -17.364431163912286, + "pnl": -17.364431163912286, + "pnlcomm": -17.364431163912286, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.47378044689603, + "entry_time": "2020-09-08T00:00:00", + "exit_price": 98.31284487928606, + "exit_time": "2020-09-09T00:00:00", + "gross_pnl": -116.09355676099682, + "pnl": -116.09355676099682, + "pnlcomm": -116.09355676099682, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.73200506980342, + "entry_time": "2020-09-11T00:00:00", + "exit_price": 98.3363427106496, + "exit_time": "2020-09-12T00:00:00", + "gross_pnl": 60.43376408461825, + "pnl": 60.43376408461825, + "pnlcomm": 60.43376408461825, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.56611574901736, + "entry_time": "2020-09-14T00:00:00", + "exit_price": 98.13272204200155, + "exit_time": "2020-09-15T00:00:00", + "gross_pnl": -43.339370701581004, + "pnl": -43.339370701581004, + "pnlcomm": -43.339370701581004, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.89963627791985, + "entry_time": "2020-09-17T00:00:00", + "exit_price": 98.38755792776327, + "exit_time": "2020-09-18T00:00:00", + "gross_pnl": 148.79216498434147, + "pnl": 148.79216498434147, + "pnlcomm": 148.79216498434147, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.35474381234252, + "entry_time": "2020-09-20T00:00:00", + "exit_price": 98.97868642263799, + "exit_time": "2020-09-21T00:00:00", + "gross_pnl": 62.39426102954724, + "pnl": 62.39426102954724, + "pnlcomm": 62.39426102954724, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.11962753041762, + "entry_time": "2020-09-23T00:00:00", + "exit_price": 99.25728100943367, + "exit_time": "2020-09-24T00:00:00", + "gross_pnl": 13.765347901605196, + "pnl": 13.765347901605196, + "pnlcomm": 13.765347901605196, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.076645155786, + "entry_time": "2020-09-26T00:00:00", + "exit_price": 99.1361736846976, + "exit_time": "2020-09-27T00:00:00", + "gross_pnl": 5.952852891159921, + "pnl": 5.952852891159921, + "pnlcomm": 5.952852891159921, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9576189114394, + "entry_time": "2020-09-29T00:00:00", + "exit_price": 99.38251520181134, + "exit_time": "2020-09-30T00:00:00", + "gross_pnl": 42.48962903719473, + "pnl": 42.48962903719473, + "pnlcomm": 42.48962903719473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.58405172820402, + "entry_time": "2020-10-02T00:00:00", + "exit_price": 100.1825648349693, + "exit_time": "2020-10-03T00:00:00", + "gross_pnl": 59.85131067652816, + "pnl": 59.85131067652816, + "pnlcomm": 59.85131067652816, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31778631274507, + "entry_time": "2020-10-05T00:00:00", + "exit_price": 98.92748490697555, + "exit_time": "2020-10-06T00:00:00", + "gross_pnl": -39.03014057695202, + "pnl": -39.03014057695202, + "pnlcomm": -39.03014057695202, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11485299409067, + "entry_time": "2020-10-08T00:00:00", + "exit_price": 97.46828746700024, + "exit_time": "2020-10-09T00:00:00", + "gross_pnl": -64.65655270904307, + "pnl": -64.65655270904307, + "pnlcomm": -64.65655270904307, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7892083341232, + "entry_time": "2020-10-11T00:00:00", + "exit_price": 99.2850707768965, + "exit_time": "2020-10-12T00:00:00", + "gross_pnl": 149.58624427733014, + "pnl": 149.58624427733014, + "pnlcomm": 149.58624427733014, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.61528686513479, + "entry_time": "2020-10-14T00:00:00", + "exit_price": 98.16045065160826, + "exit_time": "2020-10-15T00:00:00", + "gross_pnl": 54.51637864734664, + "pnl": 54.51637864734664, + "pnlcomm": 54.51637864734664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98923853245553, + "entry_time": "2020-10-17T00:00:00", + "exit_price": 97.78083136801966, + "exit_time": "2020-10-18T00:00:00", + "gross_pnl": -20.84071644358687, + "pnl": -20.84071644358687, + "pnlcomm": -20.84071644358687, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98736762370623, + "entry_time": "2020-10-20T00:00:00", + "exit_price": 98.41242668783207, + "exit_time": "2020-10-21T00:00:00", + "gross_pnl": 42.50590641258327, + "pnl": 42.50590641258327, + "pnlcomm": 42.50590641258327, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7821059253462, + "entry_time": "2020-10-23T00:00:00", + "exit_price": 98.01676230346942, + "exit_time": "2020-10-24T00:00:00", + "gross_pnl": -76.53436218767808, + "pnl": -76.53436218767808, + "pnlcomm": -76.53436218767808, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.90986422948514, + "entry_time": "2020-10-26T00:00:00", + "exit_price": 98.85698353324744, + "exit_time": "2020-10-27T00:00:00", + "gross_pnl": -5.288069623769331, + "pnl": -5.288069623769331, + "pnlcomm": -5.288069623769331, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.72982041802001, + "entry_time": "2020-10-29T00:00:00", + "exit_price": 98.60761748093444, + "exit_time": "2020-10-30T00:00:00", + "gross_pnl": -12.220293708557506, + "pnl": -12.220293708557506, + "pnlcomm": -12.220293708557506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.0385605171193, + "entry_time": "2020-11-01T00:00:00", + "exit_price": 99.09198940082088, + "exit_time": "2020-11-02T00:00:00", + "gross_pnl": 5.342888370158505, + "pnl": 5.342888370158505, + "pnlcomm": 5.342888370158505, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21597248424331, + "entry_time": "2020-11-04T00:00:00", + "exit_price": 98.490691270523, + "exit_time": "2020-11-05T00:00:00", + "gross_pnl": -72.5281213720308, + "pnl": -72.5281213720308, + "pnlcomm": -72.5281213720308, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.2706953210234, + "entry_time": "2020-11-07T00:00:00", + "exit_price": 98.23704650718707, + "exit_time": "2020-11-08T00:00:00", + "gross_pnl": -3.3648813836322233, + "pnl": -3.3648813836322233, + "pnlcomm": -3.3648813836322233, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30522444084696, + "entry_time": "2020-11-10T00:00:00", + "exit_price": 97.82731858826378, + "exit_time": "2020-11-11T00:00:00", + "gross_pnl": 52.20941474168228, + "pnl": 52.20941474168228, + "pnlcomm": 52.20941474168228, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91407429365688, + "entry_time": "2020-11-13T00:00:00", + "exit_price": 98.5460351903365, + "exit_time": "2020-11-14T00:00:00", + "gross_pnl": -36.80391033203847, + "pnl": -36.80391033203847, + "pnlcomm": -36.80391033203847, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.93028933684711, + "entry_time": "2020-11-16T00:00:00", + "exit_price": 99.0553633238757, + "exit_time": "2020-11-17T00:00:00", + "gross_pnl": 12.507398702858552, + "pnl": 12.507398702858552, + "pnlcomm": 12.507398702858552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47484452500944, + "entry_time": "2020-11-19T00:00:00", + "exit_price": 98.10094020807114, + "exit_time": "2020-11-20T00:00:00", + "gross_pnl": -37.390431693830806, + "pnl": -37.390431693830806, + "pnlcomm": -37.390431693830806, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01428360585086, + "entry_time": "2020-11-22T00:00:00", + "exit_price": 97.38292648890776, + "exit_time": "2020-11-23T00:00:00", + "gross_pnl": -163.13571169431071, + "pnl": -163.13571169431071, + "pnlcomm": -163.13571169431071, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48513559668872, + "entry_time": "2020-11-25T00:00:00", + "exit_price": 97.27497370614257, + "exit_time": "2020-11-26T00:00:00", + "gross_pnl": -121.01618905461464, + "pnl": -121.01618905461464, + "pnlcomm": -121.01618905461464, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.14886606297294, + "entry_time": "2020-11-28T00:00:00", + "exit_price": 98.29611163730506, + "exit_time": "2020-11-29T00:00:00", + "gross_pnl": 14.724557433211771, + "pnl": 14.724557433211771, + "pnlcomm": 14.724557433211771, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.23350982317787, + "entry_time": "2020-12-01T00:00:00", + "exit_price": 97.79948982072462, + "exit_time": "2020-12-02T00:00:00", + "gross_pnl": 56.59799975467479, + "pnl": 56.59799975467479, + "pnlcomm": 56.59799975467479, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98472225444857, + "entry_time": "2020-12-04T00:00:00", + "exit_price": 97.71079305814114, + "exit_time": "2020-12-05T00:00:00", + "gross_pnl": -27.392919630743506, + "pnl": -27.392919630743506, + "pnlcomm": -27.392919630743506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3396263042363, + "entry_time": "2020-12-07T00:00:00", + "exit_price": 97.98172498582129, + "exit_time": "2020-12-08T00:00:00", + "gross_pnl": -35.790131841501704, + "pnl": -35.790131841501704, + "pnlcomm": -35.790131841501704, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.42795373397291, + "entry_time": "2020-12-10T00:00:00", + "exit_price": 96.6321305493393, + "exit_time": "2020-12-11T00:00:00", + "gross_pnl": -79.5823184633619, + "pnl": -79.5823184633619, + "pnlcomm": -79.5823184633619, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76479352938595, + "entry_time": "2020-12-13T00:00:00", + "exit_price": 98.48958247666039, + "exit_time": "2020-12-14T00:00:00", + "gross_pnl": 172.47889472744333, + "pnl": 172.47889472744333, + "pnlcomm": 172.47889472744333, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.73111789636546, + "entry_time": "2020-12-16T00:00:00", + "exit_price": 97.61885876679554, + "exit_time": "2020-12-17T00:00:00", + "gross_pnl": 88.77408704300791, + "pnl": 88.77408704300791, + "pnlcomm": 88.77408704300791, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.85401562603096, + "entry_time": "2020-12-19T00:00:00", + "exit_price": 96.49175141105385, + "exit_time": "2020-12-20T00:00:00", + "gross_pnl": -136.22642149771025, + "pnl": -136.22642149771025, + "pnlcomm": -136.22642149771025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.84289871423181, + "entry_time": "2020-12-22T00:00:00", + "exit_price": 96.99377199128872, + "exit_time": "2020-12-23T00:00:00", + "gross_pnl": -84.91267229430832, + "pnl": -84.91267229430832, + "pnlcomm": -84.91267229430832, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76186428614056, + "entry_time": "2020-12-25T00:00:00", + "exit_price": 96.48850513355184, + "exit_time": "2020-12-26T00:00:00", + "gross_pnl": -27.33591525887249, + "pnl": -27.33591525887249, + "pnlcomm": -27.33591525887249, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.12395315196963, + "entry_time": "2020-12-28T00:00:00", + "exit_price": 97.53863571252707, + "exit_time": "2020-12-29T00:00:00", + "gross_pnl": 41.46825605574378, + "pnl": 41.46825605574378, + "pnlcomm": 41.46825605574378, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6026762767146, + "entry_time": "2020-12-31T00:00:00", + "exit_price": 97.09752132137899, + "exit_time": "2021-01-01T00:00:00", + "gross_pnl": -50.51549553356125, + "pnl": -50.51549553356125, + "pnlcomm": -50.51549553356125, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.4927463612385, + "entry_time": "2021-01-03T00:00:00", + "exit_price": 96.82226372897985, + "exit_time": "2021-01-04T00:00:00", + "gross_pnl": -67.04826322586541, + "pnl": -67.04826322586541, + "pnlcomm": -67.04826322586541, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.79148532437995, + "entry_time": "2021-01-06T00:00:00", + "exit_price": 97.11483711173116, + "exit_time": "2021-01-07T00:00:00", + "gross_pnl": 32.33517873512142, + "pnl": 32.33517873512142, + "pnlcomm": 32.33517873512142, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.80033950220171, + "entry_time": "2021-01-09T00:00:00", + "exit_price": 96.63729064888537, + "exit_time": "2021-01-10T00:00:00", + "gross_pnl": 83.69511466836599, + "pnl": 83.69511466836599, + "pnlcomm": 83.69511466836599, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.11575917668634, + "entry_time": "2021-01-12T00:00:00", + "exit_price": 96.28032546622858, + "exit_time": "2021-01-13T00:00:00", + "gross_pnl": 16.456628954223618, + "pnl": 16.456628954223618, + "pnlcomm": 16.456628954223618, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.53344904132358, + "entry_time": "2021-01-15T00:00:00", + "exit_price": 97.29557459823668, + "exit_time": "2021-01-16T00:00:00", + "gross_pnl": 76.21255569131051, + "pnl": 76.21255569131051, + "pnlcomm": 76.21255569131051, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.01730754421833, + "entry_time": "2021-01-18T00:00:00", + "exit_price": 96.07935604760307, + "exit_time": "2021-01-19T00:00:00", + "gross_pnl": 6.204850338474444, + "pnl": 6.204850338474444, + "pnlcomm": 6.204850338474444, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.79620422510413, + "entry_time": "2021-01-21T00:00:00", + "exit_price": 95.24797305894252, + "exit_time": "2021-01-22T00:00:00", + "gross_pnl": -54.82311661616137, + "pnl": -54.82311661616137, + "pnlcomm": -54.82311661616137, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.19373825703377, + "entry_time": "2021-01-24T00:00:00", + "exit_price": 95.40514794332339, + "exit_time": "2021-01-25T00:00:00", + "gross_pnl": 21.140968628961332, + "pnl": 21.140968628961332, + "pnlcomm": 21.140968628961332, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.55648566288775, + "entry_time": "2021-01-27T00:00:00", + "exit_price": 96.55716667120137, + "exit_time": "2021-01-28T00:00:00", + "gross_pnl": 100.06810083136202, + "pnl": 100.06810083136202, + "pnlcomm": 100.06810083136202, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.91494018138197, + "entry_time": "2021-01-30T00:00:00", + "exit_price": 95.48501201892987, + "exit_time": "2021-01-31T00:00:00", + "gross_pnl": 57.00718375478999, + "pnl": 57.00718375478999, + "pnlcomm": 57.00718375478999, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.90008526748947, + "entry_time": "2021-02-02T00:00:00", + "exit_price": 95.83721845974864, + "exit_time": "2021-02-03T00:00:00", + "gross_pnl": -6.286680774083209, + "pnl": -6.286680774083209, + "pnlcomm": -6.286680774083209, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26504549069784, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 96.06840340797214, + "exit_time": "2021-02-06T00:00:00", + "gross_pnl": 80.33579172742975, + "pnl": 80.33579172742975, + "pnlcomm": 80.33579172742975, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26053581327312, + "entry_time": "2021-02-08T00:00:00", + "exit_price": 95.42454996605802, + "exit_time": "2021-02-09T00:00:00", + "gross_pnl": 16.401415278490106, + "pnl": 16.401415278490106, + "pnlcomm": 16.401415278490106, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94825682250638, + "entry_time": "2021-02-11T00:00:00", + "exit_price": 95.05109746301979, + "exit_time": "2021-02-12T00:00:00", + "gross_pnl": 10.284064051340636, + "pnl": 10.284064051340636, + "pnlcomm": 10.284064051340636, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1969266603545, + "entry_time": "2021-02-14T00:00:00", + "exit_price": 96.27193710609464, + "exit_time": "2021-02-15T00:00:00", + "gross_pnl": 7.501044574013349, + "pnl": 7.501044574013349, + "pnlcomm": 7.501044574013349, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97039812035842, + "entry_time": "2021-02-17T00:00:00", + "exit_price": 96.34802647272141, + "exit_time": "2021-02-18T00:00:00", + "gross_pnl": -62.237164763701, + "pnl": -62.237164763701, + "pnlcomm": -62.237164763701, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.07904244701469, + "entry_time": "2021-02-20T00:00:00", + "exit_price": 96.79316819026657, + "exit_time": "2021-02-21T00:00:00", + "gross_pnl": -28.587425674811584, + "pnl": -28.587425674811584, + "pnlcomm": -28.587425674811584, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5721771606179, + "entry_time": "2021-02-23T00:00:00", + "exit_price": 95.6253449835299, + "exit_time": "2021-02-24T00:00:00", + "gross_pnl": 5.316782291200184, + "pnl": 5.316782291200184, + "pnlcomm": 5.316782291200184, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88599336671724, + "entry_time": "2021-02-26T00:00:00", + "exit_price": 93.9167314813735, + "exit_time": "2021-02-27T00:00:00", + "gross_pnl": -96.92618853437409, + "pnl": -96.92618853437409, + "pnlcomm": -96.92618853437409, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23555143341264, + "entry_time": "2021-03-01T00:00:00", + "exit_price": 94.69172330670986, + "exit_time": "2021-03-02T00:00:00", + "gross_pnl": -54.38281267027776, + "pnl": -54.38281267027776, + "pnlcomm": -54.38281267027776, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.40326355089037, + "entry_time": "2021-03-04T00:00:00", + "exit_price": 94.32320287324674, + "exit_time": "2021-03-05T00:00:00", + "gross_pnl": -8.006067764362967, + "pnl": -8.006067764362967, + "pnlcomm": -8.006067764362967, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32022315669313, + "entry_time": "2021-03-07T00:00:00", + "exit_price": 94.22613575397045, + "exit_time": "2021-03-08T00:00:00", + "gross_pnl": -9.408740272267835, + "pnl": -9.408740272267835, + "pnlcomm": -9.408740272267835, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.08195298394907, + "entry_time": "2021-03-10T00:00:00", + "exit_price": 94.5883765126535, + "exit_time": "2021-03-11T00:00:00", + "gross_pnl": -49.35764712955688, + "pnl": -49.35764712955688, + "pnlcomm": -49.35764712955688, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6323490375275, + "entry_time": "2021-03-13T00:00:00", + "exit_price": 95.0747399163529, + "exit_time": "2021-03-14T00:00:00", + "gross_pnl": 44.23908788253925, + "pnl": 44.23908788253925, + "pnlcomm": 44.23908788253925, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.55723413541229, + "entry_time": "2021-03-16T00:00:00", + "exit_price": 94.78282068603487, + "exit_time": "2021-03-17T00:00:00", + "gross_pnl": 22.558655062258026, + "pnl": 22.558655062258026, + "pnlcomm": 22.558655062258026, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66145085922012, + "entry_time": "2021-03-19T00:00:00", + "exit_price": 95.46346097050873, + "exit_time": "2021-03-20T00:00:00", + "gross_pnl": 180.20101112886096, + "pnl": 180.20101112886096, + "pnlcomm": 180.20101112886096, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.00404625454874, + "entry_time": "2021-03-22T00:00:00", + "exit_price": 94.66092881844988, + "exit_time": "2021-03-23T00:00:00", + "gross_pnl": -34.31174360988649, + "pnl": -34.31174360988649, + "pnlcomm": -34.31174360988649, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.49919123199933, + "entry_time": "2021-03-25T00:00:00", + "exit_price": 93.97621398907071, + "exit_time": "2021-03-26T00:00:00", + "gross_pnl": -152.29772429286186, + "pnl": -152.29772429286186, + "pnlcomm": -152.29772429286186, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41257974165285, + "entry_time": "2021-03-28T00:00:00", + "exit_price": 95.05124864668421, + "exit_time": "2021-03-29T00:00:00", + "gross_pnl": 63.86689050313663, + "pnl": 63.86689050313663, + "pnlcomm": 63.86689050313663, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01899188310071, + "entry_time": "2021-03-31T00:00:00", + "exit_price": 94.2559389154428, + "exit_time": "2021-04-01T00:00:00", + "gross_pnl": 23.694703234208703, + "pnl": 23.694703234208703, + "pnlcomm": 23.694703234208703, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12609495739092, + "entry_time": "2021-04-03T00:00:00", + "exit_price": 94.25576346468043, + "exit_time": "2021-04-04T00:00:00", + "gross_pnl": 12.966850728950874, + "pnl": 12.966850728950874, + "pnlcomm": 12.966850728950874, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4705053051443, + "entry_time": "2021-04-06T00:00:00", + "exit_price": 93.72410136704386, + "exit_time": "2021-04-07T00:00:00", + "gross_pnl": 25.35960618995574, + "pnl": 25.35960618995574, + "pnlcomm": 25.35960618995574, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19884636287924, + "entry_time": "2021-04-09T00:00:00", + "exit_price": 93.86432033375576, + "exit_time": "2021-04-10T00:00:00", + "gross_pnl": 66.54739708765192, + "pnl": 66.54739708765192, + "pnlcomm": 66.54739708765192, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34050558738045, + "entry_time": "2021-04-12T00:00:00", + "exit_price": 94.10587138419956, + "exit_time": "2021-04-13T00:00:00", + "gross_pnl": 76.53657968191112, + "pnl": 76.53657968191112, + "pnlcomm": 76.53657968191112, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72930751574246, + "entry_time": "2021-04-15T00:00:00", + "exit_price": 93.2563942182136, + "exit_time": "2021-04-16T00:00:00", + "gross_pnl": -47.29132975288621, + "pnl": -47.29132975288621, + "pnlcomm": -47.29132975288621, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59980860135867, + "entry_time": "2021-04-18T00:00:00", + "exit_price": 94.54277270362402, + "exit_time": "2021-04-19T00:00:00", + "gross_pnl": 94.29641022653499, + "pnl": 94.29641022653499, + "pnlcomm": 94.29641022653499, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92591784638046, + "entry_time": "2021-04-21T00:00:00", + "exit_price": 94.14258894906092, + "exit_time": "2021-04-22T00:00:00", + "gross_pnl": 121.66711026804649, + "pnl": 121.66711026804649, + "pnlcomm": 121.66711026804649, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11423308566697, + "entry_time": "2021-04-24T00:00:00", + "exit_price": 93.03147452036931, + "exit_time": "2021-04-25T00:00:00", + "gross_pnl": -108.27585652976524, + "pnl": -108.27585652976524, + "pnlcomm": -108.27585652976524, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9724517338113, + "entry_time": "2021-04-27T00:00:00", + "exit_price": 93.49318704896336, + "exit_time": "2021-04-28T00:00:00", + "gross_pnl": -147.92646848479336, + "pnl": -147.92646848479336, + "pnlcomm": -147.92646848479336, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68468709145579, + "entry_time": "2021-04-30T00:00:00", + "exit_price": 93.32003795658395, + "exit_time": "2021-05-01T00:00:00", + "gross_pnl": -36.46491348718399, + "pnl": -36.46491348718399, + "pnlcomm": -36.46491348718399, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26674166444458, + "entry_time": "2021-05-03T00:00:00", + "exit_price": 94.26630934814936, + "exit_time": "2021-05-04T00:00:00", + "gross_pnl": -0.043231629521756076, + "pnl": -0.043231629521756076, + "pnlcomm": -0.043231629521756076, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.41533319810328, + "entry_time": "2021-05-06T00:00:00", + "exit_price": 93.36350758058099, + "exit_time": "2021-05-07T00:00:00", + "gross_pnl": -5.182561752229731, + "pnl": -5.182561752229731, + "pnlcomm": -5.182561752229731, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.16332285120929, + "entry_time": "2021-05-09T00:00:00", + "exit_price": 94.34043899579565, + "exit_time": "2021-05-10T00:00:00", + "gross_pnl": 17.711614458636404, + "pnl": 17.711614458636404, + "pnlcomm": 17.711614458636404, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74219820454567, + "entry_time": "2021-05-12T00:00:00", + "exit_price": 94.55413171456674, + "exit_time": "2021-05-13T00:00:00", + "gross_pnl": 81.19335100210634, + "pnl": 81.19335100210634, + "pnlcomm": 81.19335100210634, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58180279933771, + "entry_time": "2021-05-15T00:00:00", + "exit_price": 94.02408626223293, + "exit_time": "2021-05-16T00:00:00", + "gross_pnl": 44.22834628952188, + "pnl": 44.22834628952188, + "pnlcomm": 44.22834628952188, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87657341045228, + "entry_time": "2021-05-18T00:00:00", + "exit_price": 94.55590567361484, + "exit_time": "2021-05-19T00:00:00", + "gross_pnl": 67.93322631625642, + "pnl": 67.93322631625642, + "pnlcomm": 67.93322631625642, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08074161986468, + "entry_time": "2021-05-21T00:00:00", + "exit_price": 93.80457382221171, + "exit_time": "2021-05-22T00:00:00", + "gross_pnl": 72.3832202347026, + "pnl": 72.3832202347026, + "pnlcomm": 72.3832202347026, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8131686939551, + "entry_time": "2021-05-24T00:00:00", + "exit_price": 93.25793142134573, + "exit_time": "2021-05-25T00:00:00", + "gross_pnl": 44.476272739062495, + "pnl": 44.476272739062495, + "pnlcomm": 44.476272739062495, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95253144170447, + "entry_time": "2021-05-27T00:00:00", + "exit_price": 93.14743781912107, + "exit_time": "2021-05-28T00:00:00", + "gross_pnl": 19.490637741660066, + "pnl": 19.490637741660066, + "pnlcomm": 19.490637741660066, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87835645740229, + "entry_time": "2021-05-30T00:00:00", + "exit_price": 92.9764387193147, + "exit_time": "2021-05-31T00:00:00", + "gross_pnl": 9.808226191240976, + "pnl": 9.808226191240976, + "pnlcomm": 9.808226191240976, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94516537050167, + "entry_time": "2021-06-02T00:00:00", + "exit_price": 92.89603764932446, + "exit_time": "2021-06-03T00:00:00", + "gross_pnl": -4.912772117721431, + "pnl": -4.912772117721431, + "pnlcomm": -4.912772117721431, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63800292429943, + "entry_time": "2021-06-05T00:00:00", + "exit_price": 93.24337208101042, + "exit_time": "2021-06-06T00:00:00", + "gross_pnl": 160.53691567109922, + "pnl": 160.53691567109922, + "pnlcomm": 160.53691567109922, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59556244009269, + "entry_time": "2021-06-08T00:00:00", + "exit_price": 91.28446378378608, + "exit_time": "2021-06-09T00:00:00", + "gross_pnl": -31.109865630661204, + "pnl": -31.109865630661204, + "pnlcomm": -31.109865630661204, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13025499622808, + "entry_time": "2021-06-11T00:00:00", + "exit_price": 92.23383791902404, + "exit_time": "2021-06-12T00:00:00", + "gross_pnl": -89.64170772040347, + "pnl": -89.64170772040347, + "pnlcomm": -89.64170772040347, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3328854638381, + "entry_time": "2021-06-14T00:00:00", + "exit_price": 92.96067846320523, + "exit_time": "2021-06-15T00:00:00", + "gross_pnl": 62.77929993671307, + "pnl": 62.77929993671307, + "pnlcomm": 62.77929993671307, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94965457520625, + "entry_time": "2021-06-17T00:00:00", + "exit_price": 92.16625059748041, + "exit_time": "2021-06-18T00:00:00", + "gross_pnl": 21.65960222741603, + "pnl": 21.65960222741603, + "pnlcomm": 21.65960222741603, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8269642033066, + "entry_time": "2021-06-20T00:00:00", + "exit_price": 91.81310669049036, + "exit_time": "2021-06-21T00:00:00", + "gross_pnl": -1.3857512816244366, + "pnl": -1.3857512816244366, + "pnlcomm": -1.3857512816244366, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25554422109529, + "entry_time": "2021-06-23T00:00:00", + "exit_price": 92.45622372930102, + "exit_time": "2021-06-24T00:00:00", + "gross_pnl": 20.067950820572378, + "pnl": 20.067950820572378, + "pnlcomm": 20.067950820572378, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.83947343135847, + "entry_time": "2021-06-26T00:00:00", + "exit_price": 92.43135259957857, + "exit_time": "2021-06-27T00:00:00", + "gross_pnl": 59.18791682201032, + "pnl": 59.18791682201032, + "pnlcomm": 59.18791682201032, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.53295655650527, + "entry_time": "2021-06-29T00:00:00", + "exit_price": 91.78816229160894, + "exit_time": "2021-06-30T00:00:00", + "gross_pnl": 25.520573510367228, + "pnl": 25.520573510367228, + "pnlcomm": 25.520573510367228, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9413213129086, + "entry_time": "2021-07-02T00:00:00", + "exit_price": 92.40648296911729, + "exit_time": "2021-07-03T00:00:00", + "gross_pnl": 146.5161656208693, + "pnl": 146.5161656208693, + "pnlcomm": 146.5161656208693, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30279435197399, + "entry_time": "2021-07-05T00:00:00", + "exit_price": 90.65263067129818, + "exit_time": "2021-07-06T00:00:00", + "gross_pnl": -65.01636806758029, + "pnl": -65.01636806758029, + "pnlcomm": -65.01636806758029, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8239628759463, + "entry_time": "2021-07-08T00:00:00", + "exit_price": 91.7795218814571, + "exit_time": "2021-07-09T00:00:00", + "gross_pnl": -4.444099448919303, + "pnl": -4.444099448919303, + "pnlcomm": -4.444099448919303, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36068460994301, + "entry_time": "2021-07-11T00:00:00", + "exit_price": 91.47451059527033, + "exit_time": "2021-07-12T00:00:00", + "gross_pnl": 11.382598532732402, + "pnl": 11.382598532732402, + "pnlcomm": 11.382598532732402, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09791235411565, + "entry_time": "2021-07-14T00:00:00", + "exit_price": 91.64232209133355, + "exit_time": "2021-07-15T00:00:00", + "gross_pnl": 54.44097372179044, + "pnl": 54.44097372179044, + "pnlcomm": 54.44097372179044, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9960341944844, + "entry_time": "2021-07-17T00:00:00", + "exit_price": 90.86057544771678, + "exit_time": "2021-07-18T00:00:00", + "gross_pnl": -13.545874676761116, + "pnl": -13.545874676761116, + "pnlcomm": -13.545874676761116, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03722443992689, + "entry_time": "2021-07-20T00:00:00", + "exit_price": 91.02540027670304, + "exit_time": "2021-07-21T00:00:00", + "gross_pnl": -101.18241632238494, + "pnl": -101.18241632238494, + "pnlcomm": -101.18241632238494, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23831571579666, + "entry_time": "2021-07-23T00:00:00", + "exit_price": 91.61642884685872, + "exit_time": "2021-07-24T00:00:00", + "gross_pnl": 37.81131310620651, + "pnl": 37.81131310620651, + "pnlcomm": 37.81131310620651, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.95873360404138, + "entry_time": "2021-07-26T00:00:00", + "exit_price": 91.78520963834742, + "exit_time": "2021-07-27T00:00:00", + "gross_pnl": -17.352396569395978, + "pnl": -17.352396569395978, + "pnlcomm": -17.352396569395978, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12207131713245, + "entry_time": "2021-07-29T00:00:00", + "exit_price": 93.030634236321, + "exit_time": "2021-07-30T00:00:00", + "gross_pnl": 90.85629191885545, + "pnl": 90.85629191885545, + "pnlcomm": 90.85629191885545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2580641252632, + "entry_time": "2021-08-01T00:00:00", + "exit_price": 92.57471719502651, + "exit_time": "2021-08-02T00:00:00", + "gross_pnl": 31.6653069763305, + "pnl": 31.6653069763305, + "pnlcomm": 31.6653069763305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16033087447514, + "entry_time": "2021-08-04T00:00:00", + "exit_price": 91.64298714231596, + "exit_time": "2021-08-05T00:00:00", + "gross_pnl": -51.73437321591763, + "pnl": -51.73437321591763, + "pnlcomm": -51.73437321591763, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75555986268628, + "entry_time": "2021-08-07T00:00:00", + "exit_price": 93.29534460790408, + "exit_time": "2021-08-08T00:00:00", + "gross_pnl": 53.97847452178013, + "pnl": 53.97847452178013, + "pnlcomm": 53.97847452178013, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82043015696519, + "entry_time": "2021-08-10T00:00:00", + "exit_price": 93.34161824742394, + "exit_time": "2021-08-11T00:00:00", + "gross_pnl": 52.118809045875025, + "pnl": 52.118809045875025, + "pnlcomm": 52.118809045875025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.61753779742976, + "entry_time": "2021-08-13T00:00:00", + "exit_price": 94.15624068230731, + "exit_time": "2021-08-14T00:00:00", + "gross_pnl": 53.87028848775515, + "pnl": 53.87028848775515, + "pnlcomm": 53.87028848775515, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25917455813928, + "entry_time": "2021-08-16T00:00:00", + "exit_price": 93.5936848786624, + "exit_time": "2021-08-17T00:00:00", + "gross_pnl": -66.54896794768774, + "pnl": -66.54896794768774, + "pnlcomm": -66.54896794768774, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98045633035186, + "entry_time": "2021-08-19T00:00:00", + "exit_price": 93.98797939638727, + "exit_time": "2021-08-20T00:00:00", + "gross_pnl": 100.7523066035418, + "pnl": 100.7523066035418, + "pnlcomm": 100.7523066035418, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35827005631805, + "entry_time": "2021-08-22T00:00:00", + "exit_price": 93.69155799194061, + "exit_time": "2021-08-23T00:00:00", + "gross_pnl": 33.328793562256465, + "pnl": 33.328793562256465, + "pnlcomm": 33.328793562256465, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68091309416992, + "entry_time": "2021-08-25T00:00:00", + "exit_price": 92.70456318827733, + "exit_time": "2021-08-26T00:00:00", + "gross_pnl": 2.3650094107409814, + "pnl": 2.3650094107409814, + "pnlcomm": 2.3650094107409814, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16469231313611, + "entry_time": "2021-08-28T00:00:00", + "exit_price": 92.8799099382491, + "exit_time": "2021-08-29T00:00:00", + "gross_pnl": -28.478237488701552, + "pnl": -28.478237488701552, + "pnlcomm": -28.478237488701552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11566093967609, + "entry_time": "2021-08-31T00:00:00", + "exit_price": 93.80161139315015, + "exit_time": "2021-09-01T00:00:00", + "gross_pnl": -31.40495465259363, + "pnl": -31.40495465259363, + "pnlcomm": -31.40495465259363, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15377445359951, + "entry_time": "2021-09-03T00:00:00", + "exit_price": 94.15715297991916, + "exit_time": "2021-09-04T00:00:00", + "gross_pnl": 100.33785263196506, + "pnl": 100.33785263196506, + "pnlcomm": 100.33785263196506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86962603101975, + "entry_time": "2021-09-06T00:00:00", + "exit_price": 93.72926386277882, + "exit_time": "2021-09-07T00:00:00", + "gross_pnl": -14.036216824092662, + "pnl": -14.036216824092662, + "pnlcomm": -14.036216824092662, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1579385275225, + "entry_time": "2021-09-09T00:00:00", + "exit_price": 93.74116822603294, + "exit_time": "2021-09-10T00:00:00", + "gross_pnl": -41.67703014895636, + "pnl": -41.67703014895636, + "pnlcomm": -41.67703014895636, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31971390482754, + "entry_time": "2021-09-12T00:00:00", + "exit_price": 93.20782644697857, + "exit_time": "2021-09-13T00:00:00", + "gross_pnl": -11.188745784896525, + "pnl": -11.188745784896525, + "pnlcomm": -11.188745784896525, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01885490875779, + "entry_time": "2021-09-15T00:00:00", + "exit_price": 94.42230012835577, + "exit_time": "2021-09-16T00:00:00", + "gross_pnl": -59.655478040201615, + "pnl": -59.655478040201615, + "pnlcomm": -59.655478040201615, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.99288411883725, + "entry_time": "2021-09-18T00:00:00", + "exit_price": 94.082184046767, + "exit_time": "2021-09-19T00:00:00", + "gross_pnl": 8.929992792974417, + "pnl": 8.929992792974417, + "pnlcomm": 8.929992792974417, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.85101362331126, + "entry_time": "2021-09-21T00:00:00", + "exit_price": 94.98564664788431, + "exit_time": "2021-09-22T00:00:00", + "gross_pnl": 113.46330245730485, + "pnl": 113.46330245730485, + "pnlcomm": 113.46330245730485, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86959357102904, + "entry_time": "2021-09-24T00:00:00", + "exit_price": 94.20013868958425, + "exit_time": "2021-09-25T00:00:00", + "gross_pnl": 33.05451185552073, + "pnl": 33.05451185552073, + "pnlcomm": 33.05451185552073, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84924924581607, + "entry_time": "2021-09-27T00:00:00", + "exit_price": 93.31289310035527, + "exit_time": "2021-09-28T00:00:00", + "gross_pnl": -153.63561454608003, + "pnl": -153.63561454608003, + "pnlcomm": -153.63561454608003, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30858201402589, + "entry_time": "2021-09-30T00:00:00", + "exit_price": 93.99373607498532, + "exit_time": "2021-10-01T00:00:00", + "gross_pnl": -31.484593904056624, + "pnl": -31.484593904056624, + "pnlcomm": -31.484593904056624, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.18572768435916, + "entry_time": "2021-10-03T00:00:00", + "exit_price": 94.33439114940059, + "exit_time": "2021-10-04T00:00:00", + "gross_pnl": -85.13365349585769, + "pnl": -85.13365349585769, + "pnlcomm": -85.13365349585769, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07429869254726, + "entry_time": "2021-10-06T00:00:00", + "exit_price": 94.04790943044297, + "exit_time": "2021-10-07T00:00:00", + "gross_pnl": -2.638926210428849, + "pnl": -2.638926210428849, + "pnlcomm": -2.638926210428849, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64069907229371, + "entry_time": "2021-10-09T00:00:00", + "exit_price": 94.26235855896988, + "exit_time": "2021-10-10T00:00:00", + "gross_pnl": 62.16594866761653, + "pnl": 62.16594866761653, + "pnlcomm": 62.16594866761653, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50379403067527, + "entry_time": "2021-10-12T00:00:00", + "exit_price": 94.43691170957882, + "exit_time": "2021-10-13T00:00:00", + "gross_pnl": -6.688232109644332, + "pnl": -6.688232109644332, + "pnlcomm": -6.688232109644332, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37005197510278, + "entry_time": "2021-10-15T00:00:00", + "exit_price": 94.27057437223934, + "exit_time": "2021-10-16T00:00:00", + "gross_pnl": -9.947760286344476, + "pnl": -9.947760286344476, + "pnlcomm": -9.947760286344476, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09337235241868, + "entry_time": "2021-10-18T00:00:00", + "exit_price": 94.71128565229746, + "exit_time": "2021-10-19T00:00:00", + "gross_pnl": -38.20867001212207, + "pnl": -38.20867001212207, + "pnlcomm": -38.20867001212207, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02883456195461, + "entry_time": "2021-10-21T00:00:00", + "exit_price": 94.80490335979458, + "exit_time": "2021-10-22T00:00:00", + "gross_pnl": 77.60687978399687, + "pnl": 77.60687978399687, + "pnlcomm": 77.60687978399687, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9287597961482, + "entry_time": "2021-10-24T00:00:00", + "exit_price": 95.17470692964342, + "exit_time": "2021-10-25T00:00:00", + "gross_pnl": 124.59471334952212, + "pnl": 124.59471334952212, + "pnlcomm": 124.59471334952212, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.24931526786432, + "entry_time": "2021-10-27T00:00:00", + "exit_price": 93.60050033989026, + "exit_time": "2021-10-28T00:00:00", + "gross_pnl": -64.88149279740583, + "pnl": -64.88149279740583, + "pnlcomm": -64.88149279740583, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09469925407369, + "entry_time": "2021-10-30T00:00:00", + "exit_price": 94.3111349289259, + "exit_time": "2021-10-31T00:00:00", + "gross_pnl": 21.64356748522067, + "pnl": 21.64356748522067, + "pnlcomm": 21.64356748522067, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18816369089683, + "entry_time": "2021-11-02T00:00:00", + "exit_price": 94.42938460793316, + "exit_time": "2021-11-03T00:00:00", + "gross_pnl": 24.122091703632975, + "pnl": 24.122091703632975, + "pnlcomm": 24.122091703632975, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.41602741852829, + "entry_time": "2021-11-05T00:00:00", + "exit_price": 93.42310978968692, + "exit_time": "2021-11-06T00:00:00", + "gross_pnl": 0.7082371158631418, + "pnl": 0.7082371158631418, + "pnlcomm": 0.7082371158631418, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50953693273829, + "entry_time": "2021-11-08T00:00:00", + "exit_price": 93.33123427861662, + "exit_time": "2021-11-09T00:00:00", + "gross_pnl": 82.16973458783343, + "pnl": 82.16973458783343, + "pnlcomm": 82.16973458783343, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96020937715257, + "entry_time": "2021-11-11T00:00:00", + "exit_price": 93.53068640749544, + "exit_time": "2021-11-12T00:00:00", + "gross_pnl": 57.04770303428717, + "pnl": 57.04770303428717, + "pnlcomm": 57.04770303428717, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56091640875552, + "entry_time": "2021-11-14T00:00:00", + "exit_price": 92.89910933295498, + "exit_time": "2021-11-15T00:00:00", + "gross_pnl": 33.81929241994612, + "pnl": 33.81929241994612, + "pnlcomm": 33.81929241994612, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.42727078867868, + "entry_time": "2021-11-17T00:00:00", + "exit_price": 92.19572149206287, + "exit_time": "2021-11-18T00:00:00", + "gross_pnl": -23.154929661581036, + "pnl": -23.154929661581036, + "pnlcomm": -23.154929661581036, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68137345397398, + "entry_time": "2021-11-20T00:00:00", + "exit_price": 92.48011498833463, + "exit_time": "2021-11-21T00:00:00", + "gross_pnl": -20.125846563934147, + "pnl": -20.125846563934147, + "pnlcomm": -20.125846563934147, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73481537380023, + "entry_time": "2021-11-23T00:00:00", + "exit_price": 93.9817766831428, + "exit_time": "2021-11-24T00:00:00", + "gross_pnl": 124.69613093425664, + "pnl": 124.69613093425664, + "pnlcomm": 124.69613093425664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62422399002075, + "entry_time": "2021-11-26T00:00:00", + "exit_price": 92.25402747101043, + "exit_time": "2021-11-27T00:00:00", + "gross_pnl": -37.01965190103209, + "pnl": -37.01965190103209, + "pnlcomm": -37.01965190103209, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78794113614681, + "entry_time": "2021-11-29T00:00:00", + "exit_price": 92.51565520344022, + "exit_time": "2021-11-30T00:00:00", + "gross_pnl": -27.228593270659474, + "pnl": -27.228593270659474, + "pnlcomm": -27.228593270659474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81994141877884, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 91.73569183010366, + "exit_time": "2021-12-03T00:00:00", + "gross_pnl": -8.424958867517773, + "pnl": -8.424958867517773, + "pnlcomm": -8.424958867517773, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89304084668578, + "entry_time": "2021-12-05T00:00:00", + "exit_price": 91.94563028017612, + "exit_time": "2021-12-06T00:00:00", + "gross_pnl": 5.258943349033984, + "pnl": 5.258943349033984, + "pnlcomm": 5.258943349033984, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.70380536433252, + "entry_time": "2021-12-08T00:00:00", + "exit_price": 92.18321579529317, + "exit_time": "2021-12-09T00:00:00", + "gross_pnl": 47.94104309606411, + "pnl": 47.94104309606411, + "pnlcomm": 47.94104309606411, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75634960957339, + "entry_time": "2021-12-11T00:00:00", + "exit_price": 92.99346542277752, + "exit_time": "2021-12-12T00:00:00", + "gross_pnl": 23.711581320412733, + "pnl": 23.711581320412733, + "pnlcomm": 23.711581320412733, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07784715364147, + "entry_time": "2021-12-14T00:00:00", + "exit_price": 92.82473368702337, + "exit_time": "2021-12-15T00:00:00", + "gross_pnl": -25.31134666181032, + "pnl": -25.31134666181032, + "pnlcomm": -25.31134666181032, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80939097372557, + "entry_time": "2021-12-17T00:00:00", + "exit_price": 93.56855092683492, + "exit_time": "2021-12-18T00:00:00", + "gross_pnl": -24.084004689065353, + "pnl": -24.084004689065353, + "pnlcomm": -24.084004689065353, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22637736311736, + "entry_time": "2021-12-20T00:00:00", + "exit_price": 93.04989016451177, + "exit_time": "2021-12-21T00:00:00", + "gross_pnl": -17.648719860559936, + "pnl": -17.648719860559936, + "pnlcomm": -17.648719860559936, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06688407845617, + "entry_time": "2021-12-23T00:00:00", + "exit_price": 93.11481000895263, + "exit_time": "2021-12-24T00:00:00", + "gross_pnl": 4.792593049646143, + "pnl": 4.792593049646143, + "pnlcomm": 4.792593049646143, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27282277875311, + "entry_time": "2021-12-26T00:00:00", + "exit_price": 92.10549027383173, + "exit_time": "2021-12-27T00:00:00", + "gross_pnl": -116.73325049213759, + "pnl": -116.73325049213759, + "pnlcomm": -116.73325049213759, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02590143870165, + "entry_time": "2021-12-29T00:00:00", + "exit_price": 93.0111357952797, + "exit_time": "2021-12-30T00:00:00", + "gross_pnl": 98.52343565780473, + "pnl": 98.52343565780473, + "pnlcomm": 98.52343565780473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36789726372407, + "entry_time": "2022-01-01T00:00:00", + "exit_price": 91.16759918928896, + "exit_time": "2022-01-02T00:00:00", + "gross_pnl": -20.02980744351106, + "pnl": -20.02980744351106, + "pnlcomm": -20.02980744351106, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02364437811006, + "entry_time": "2022-01-04T00:00:00", + "exit_price": 91.64247835816664, + "exit_time": "2022-01-05T00:00:00", + "gross_pnl": -38.11660199434215, + "pnl": -38.11660199434215, + "pnlcomm": -38.11660199434215, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20232839714717, + "entry_time": "2022-01-07T00:00:00", + "exit_price": 92.51418676739564, + "exit_time": "2022-01-08T00:00:00", + "gross_pnl": 31.185837024847274, + "pnl": 31.185837024847274, + "pnlcomm": 31.185837024847274, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81320041849362, + "entry_time": "2022-01-10T00:00:00", + "exit_price": 92.27166607324205, + "exit_time": "2022-01-11T00:00:00", + "gross_pnl": 45.84656547484229, + "pnl": 45.84656547484229, + "pnlcomm": 45.84656547484229, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2545983932022, + "entry_time": "2022-01-13T00:00:00", + "exit_price": 91.97497228207648, + "exit_time": "2022-01-14T00:00:00", + "gross_pnl": -27.962611112572233, + "pnl": -27.962611112572233, + "pnlcomm": -27.962611112572233, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67780842750179, + "entry_time": "2022-01-16T00:00:00", + "exit_price": 91.45906966920411, + "exit_time": "2022-01-17T00:00:00", + "gross_pnl": -21.87387582976754, + "pnl": -21.87387582976754, + "pnlcomm": -21.87387582976754, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76345480442126, + "entry_time": "2022-01-19T00:00:00", + "exit_price": 91.43197465037622, + "exit_time": "2022-01-20T00:00:00", + "gross_pnl": -33.148015404503894, + "pnl": -33.148015404503894, + "pnlcomm": -33.148015404503894, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3600604543369, + "entry_time": "2022-01-22T00:00:00", + "exit_price": 92.44350843545416, + "exit_time": "2022-01-23T00:00:00", + "gross_pnl": 8.344798111725993, + "pnl": 8.344798111725993, + "pnlcomm": 8.344798111725993, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39757672508603, + "entry_time": "2022-01-25T00:00:00", + "exit_price": 91.85230151275863, + "exit_time": "2022-01-26T00:00:00", + "gross_pnl": 45.47247876726033, + "pnl": 45.47247876726033, + "pnlcomm": 45.47247876726033, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.81407145534195, + "entry_time": "2022-01-28T00:00:00", + "exit_price": 91.01128875382821, + "exit_time": "2022-01-29T00:00:00", + "gross_pnl": 19.721729848626524, + "pnl": 19.721729848626524, + "pnlcomm": 19.721729848626524, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67591197573066, + "entry_time": "2022-01-31T00:00:00", + "exit_price": 90.51279666702179, + "exit_time": "2022-02-01T00:00:00", + "gross_pnl": -116.31153087088677, + "pnl": -116.31153087088677, + "pnlcomm": -116.31153087088677, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98461279621962, + "entry_time": "2022-02-03T00:00:00", + "exit_price": 91.18776220832692, + "exit_time": "2022-02-04T00:00:00", + "gross_pnl": -79.68505878927061, + "pnl": -79.68505878927061, + "pnlcomm": -79.68505878927061, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68365711276127, + "entry_time": "2022-02-06T00:00:00", + "exit_price": 92.52965334263803, + "exit_time": "2022-02-07T00:00:00", + "gross_pnl": -15.40037701232393, + "pnl": -15.40037701232393, + "pnlcomm": -15.40037701232393, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97018528191016, + "entry_time": "2022-02-09T00:00:00", + "exit_price": 92.1704075246973, + "exit_time": "2022-02-10T00:00:00", + "gross_pnl": 20.022224278713452, + "pnl": 20.022224278713452, + "pnlcomm": 20.022224278713452, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.4092834971355, + "entry_time": "2022-02-12T00:00:00", + "exit_price": 91.80397108470675, + "exit_time": "2022-02-13T00:00:00", + "gross_pnl": 39.46875875712408, + "pnl": 39.46875875712408, + "pnlcomm": 39.46875875712408, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7224658447326, + "entry_time": "2022-02-15T00:00:00", + "exit_price": 91.15638220769824, + "exit_time": "2022-02-16T00:00:00", + "gross_pnl": -56.608363703435316, + "pnl": -56.608363703435316, + "pnlcomm": -56.608363703435316, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66063113797075, + "entry_time": "2022-02-18T00:00:00", + "exit_price": 91.93674170823937, + "exit_time": "2022-02-19T00:00:00", + "gross_pnl": 27.611057026861374, + "pnl": 27.611057026861374, + "pnlcomm": 27.611057026861374, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.02426166276656, + "entry_time": "2022-02-21T00:00:00", + "exit_price": 92.2868521233569, + "exit_time": "2022-02-22T00:00:00", + "gross_pnl": 126.25904605903315, + "pnl": 126.25904605903315, + "pnlcomm": 126.25904605903315, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06798590582007, + "entry_time": "2022-02-24T00:00:00", + "exit_price": 91.35136606041436, + "exit_time": "2022-02-25T00:00:00", + "gross_pnl": 28.338015459429755, + "pnl": 28.338015459429755, + "pnlcomm": 28.338015459429755, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99746534424483, + "entry_time": "2022-02-27T00:00:00", + "exit_price": 91.56303029535638, + "exit_time": "2022-02-28T00:00:00", + "gross_pnl": 56.556495111155414, + "pnl": 56.556495111155414, + "pnlcomm": 56.556495111155414, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09425361608109, + "entry_time": "2022-03-02T00:00:00", + "exit_price": 91.42070005109457, + "exit_time": "2022-03-03T00:00:00", + "gross_pnl": -67.35535649865199, + "pnl": -67.35535649865199, + "pnlcomm": -67.35535649865199, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41089068186189, + "entry_time": "2022-03-05T00:00:00", + "exit_price": 90.18677881527823, + "exit_time": "2022-03-06T00:00:00", + "gross_pnl": -122.41118665836552, + "pnl": -122.41118665836552, + "pnlcomm": -122.41118665836552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43901544778936, + "entry_time": "2022-03-08T00:00:00", + "exit_price": 91.5260369404649, + "exit_time": "2022-03-09T00:00:00", + "gross_pnl": 8.70214926755466, + "pnl": 8.70214926755466, + "pnlcomm": 8.70214926755466, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.01177208564717, + "entry_time": "2022-03-11T00:00:00", + "exit_price": 91.36159823018748, + "exit_time": "2022-03-12T00:00:00", + "gross_pnl": 34.98261445403159, + "pnl": 34.98261445403159, + "pnlcomm": 34.98261445403159, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82082511981079, + "entry_time": "2022-03-14T00:00:00", + "exit_price": 91.28071492977152, + "exit_time": "2022-03-15T00:00:00", + "gross_pnl": 45.988980996072826, + "pnl": 45.988980996072826, + "pnlcomm": 45.988980996072826, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9250036260453, + "entry_time": "2022-03-17T00:00:00", + "exit_price": 90.6150063093046, + "exit_time": "2022-03-18T00:00:00", + "gross_pnl": -130.99973167406915, + "pnl": -130.99973167406915, + "pnlcomm": -130.99973167406915, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.61363931969464, + "entry_time": "2022-03-20T00:00:00", + "exit_price": 90.38004154259693, + "exit_time": "2022-03-21T00:00:00", + "gross_pnl": -23.35977770977138, + "pnl": -23.35977770977138, + "pnlcomm": -23.35977770977138, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.96467806287603, + "entry_time": "2022-03-23T00:00:00", + "exit_price": 90.70041523761671, + "exit_time": "2022-03-24T00:00:00", + "gross_pnl": -26.426282525932265, + "pnl": -26.426282525932265, + "pnlcomm": -26.426282525932265, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.62074541364396, + "entry_time": "2022-03-26T00:00:00", + "exit_price": 90.95651159207543, + "exit_time": "2022-03-27T00:00:00", + "gross_pnl": 33.576617843147005, + "pnl": 33.576617843147005, + "pnlcomm": 33.576617843147005, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05267669381956, + "entry_time": "2022-03-29T00:00:00", + "exit_price": 91.69416855510607, + "exit_time": "2022-03-30T00:00:00", + "gross_pnl": 64.14918612865108, + "pnl": 64.14918612865108, + "pnlcomm": 64.14918612865108, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8695133244266, + "entry_time": "2022-04-01T00:00:00", + "exit_price": 90.61012799594212, + "exit_time": "2022-04-02T00:00:00", + "gross_pnl": -25.938532848448403, + "pnl": -25.938532848448403, + "pnlcomm": -25.938532848448403, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05464751490085, + "entry_time": "2022-04-04T00:00:00", + "exit_price": 90.46681240023963, + "exit_time": "2022-04-05T00:00:00", + "gross_pnl": 41.21648853387825, + "pnl": 41.21648853387825, + "pnlcomm": 41.21648853387825, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63067407291008, + "entry_time": "2022-04-07T00:00:00", + "exit_price": 89.96046847840074, + "exit_time": "2022-04-08T00:00:00", + "gross_pnl": -67.02055945093406, + "pnl": -67.02055945093406, + "pnlcomm": -67.02055945093406, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56273021751427, + "entry_time": "2022-04-10T00:00:00", + "exit_price": 90.14638715063298, + "exit_time": "2022-04-11T00:00:00", + "gross_pnl": -41.63430668812964, + "pnl": -41.63430668812964, + "pnlcomm": -41.63430668812964, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75859326793318, + "entry_time": "2022-04-13T00:00:00", + "exit_price": 90.97823499949781, + "exit_time": "2022-04-14T00:00:00", + "gross_pnl": 121.96417315646357, + "pnl": 121.96417315646357, + "pnlcomm": 121.96417315646357, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.1563775636343, + "entry_time": "2022-04-16T00:00:00", + "exit_price": 89.71453147899727, + "exit_time": "2022-04-17T00:00:00", + "gross_pnl": -44.18460846370209, + "pnl": -44.18460846370209, + "pnlcomm": -44.18460846370209, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.00941330347686, + "entry_time": "2022-04-19T00:00:00", + "exit_price": 90.97249110306038, + "exit_time": "2022-04-20T00:00:00", + "gross_pnl": 96.3077799583516, + "pnl": 96.3077799583516, + "pnlcomm": 96.3077799583516, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.44900384555615, + "entry_time": "2022-04-22T00:00:00", + "exit_price": 90.26380626108603, + "exit_time": "2022-04-23T00:00:00", + "gross_pnl": -18.519758447011725, + "pnl": -18.519758447011725, + "pnlcomm": -18.519758447011725, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9389490074607, + "entry_time": "2022-04-25T00:00:00", + "exit_price": 90.91676356991597, + "exit_time": "2022-04-26T00:00:00", + "gross_pnl": 97.7814562455265, + "pnl": 97.7814562455265, + "pnlcomm": 97.7814562455265, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.13685393625028, + "entry_time": "2022-04-28T00:00:00", + "exit_price": 90.92025914672816, + "exit_time": "2022-04-29T00:00:00", + "gross_pnl": 78.34052104778806, + "pnl": 78.34052104778806, + "pnlcomm": 78.34052104778806, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9636459548143, + "entry_time": "2022-05-01T00:00:00", + "exit_price": 90.9470309766908, + "exit_time": "2022-05-02T00:00:00", + "gross_pnl": 98.33850218765008, + "pnl": 98.33850218765008, + "pnlcomm": 98.33850218765008, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23464868145118, + "entry_time": "2022-05-04T00:00:00", + "exit_price": 92.16095300836626, + "exit_time": "2022-05-05T00:00:00", + "gross_pnl": 92.6304326915087, + "pnl": 92.6304326915087, + "pnlcomm": 92.6304326915087, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86371979002091, + "entry_time": "2022-05-07T00:00:00", + "exit_price": 90.1658806519524, + "exit_time": "2022-05-08T00:00:00", + "gross_pnl": -69.78391380685025, + "pnl": -69.78391380685025, + "pnlcomm": -69.78391380685025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80999909964301, + "entry_time": "2022-05-10T00:00:00", + "exit_price": 91.3916052906719, + "exit_time": "2022-05-11T00:00:00", + "gross_pnl": 58.160619102889655, + "pnl": 58.160619102889655, + "pnlcomm": 58.160619102889655, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79830122498419, + "entry_time": "2022-05-13T00:00:00", + "exit_price": 91.92464426243117, + "exit_time": "2022-05-14T00:00:00", + "gross_pnl": 12.634303744698627, + "pnl": 12.634303744698627, + "pnlcomm": 12.634303744698627, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74084404129731, + "entry_time": "2022-05-16T00:00:00", + "exit_price": 91.77591195761288, + "exit_time": "2022-05-17T00:00:00", + "gross_pnl": 3.5067916315568937, + "pnl": 3.5067916315568937, + "pnlcomm": 3.5067916315568937, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129082151163, + "entry_time": "2022-05-19T00:00:00", + "exit_price": 91.29443539538282, + "exit_time": "2022-05-20T00:00:00", + "gross_pnl": 16.535324421981556, + "pnl": 16.535324421981556, + "pnlcomm": 16.535324421981556, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.49821093674116, + "entry_time": "2022-05-22T00:00:00", + "exit_price": 90.52895961614624, + "exit_time": "2022-05-23T00:00:00", + "gross_pnl": 103.07486794050789, + "pnl": 103.07486794050789, + "pnlcomm": 103.07486794050789, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.50773769923417, + "entry_time": "2022-05-25T00:00:00", + "exit_price": 90.20586243304412, + "exit_time": "2022-05-26T00:00:00", + "gross_pnl": -30.18752661900521, + "pnl": -30.18752661900521, + "pnlcomm": -30.18752661900521, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1593251595947, + "entry_time": "2022-05-28T00:00:00", + "exit_price": 90.8652392547076, + "exit_time": "2022-05-29T00:00:00", + "gross_pnl": -29.408590488709763, + "pnl": -29.408590488709763, + "pnlcomm": -29.408590488709763, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.88148378297518, + "entry_time": "2022-05-31T00:00:00", + "exit_price": 90.54298539634833, + "exit_time": "2022-06-01T00:00:00", + "gross_pnl": 66.15016133731473, + "pnl": 66.15016133731473, + "pnlcomm": 66.15016133731473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.97268456538903, + "entry_time": "2022-06-03T00:00:00", + "exit_price": 91.62712854780935, + "exit_time": "2022-06-04T00:00:00", + "gross_pnl": 65.44439824203181, + "pnl": 65.44439824203181, + "pnlcomm": 65.44439824203181, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.74146887774299, + "entry_time": "2022-06-06T00:00:00", + "exit_price": 90.42853595632805, + "exit_time": "2022-06-07T00:00:00", + "gross_pnl": -31.293292141494078, + "pnl": -31.293292141494078, + "pnlcomm": -31.293292141494078, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84848168731006, + "entry_time": "2022-06-09T00:00:00", + "exit_price": 90.83668379255865, + "exit_time": "2022-06-10T00:00:00", + "gross_pnl": -1.1797894751410354, + "pnl": -1.1797894751410354, + "pnlcomm": -1.1797894751410354, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.47241973433749, + "entry_time": "2022-06-12T00:00:00", + "exit_price": 89.89842730786603, + "exit_time": "2022-06-13T00:00:00", + "gross_pnl": -57.39924264714631, + "pnl": -57.39924264714631, + "pnlcomm": -57.39924264714631, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82455441317694, + "entry_time": "2022-06-15T00:00:00", + "exit_price": 90.16986826544031, + "exit_time": "2022-06-16T00:00:00", + "gross_pnl": -65.46861477366264, + "pnl": -65.46861477366264, + "pnlcomm": -65.46861477366264, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1811588929617, + "entry_time": "2022-06-18T00:00:00", + "exit_price": 90.09911654611165, + "exit_time": "2022-06-19T00:00:00", + "gross_pnl": 91.79576531499407, + "pnl": 91.79576531499407, + "pnlcomm": 91.79576531499407, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.55257557802233, + "entry_time": "2022-06-21T00:00:00", + "exit_price": 90.6008717295654, + "exit_time": "2022-06-22T00:00:00", + "gross_pnl": 4.829615154307021, + "pnl": 4.829615154307021, + "pnlcomm": 4.829615154307021, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.68671023186488, + "entry_time": "2022-06-24T00:00:00", + "exit_price": 89.96517472835333, + "exit_time": "2022-06-25T00:00:00", + "gross_pnl": -72.15355035115465, + "pnl": -72.15355035115465, + "pnlcomm": -72.15355035115465, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05260562521785, + "entry_time": "2022-06-27T00:00:00", + "exit_price": 90.08006582461334, + "exit_time": "2022-06-28T00:00:00", + "gross_pnl": 2.7460199395491713, + "pnl": 2.7460199395491713, + "pnlcomm": 2.7460199395491713, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79432064186736, + "entry_time": "2022-06-30T00:00:00", + "exit_price": 92.41108821991375, + "exit_time": "2022-07-01T00:00:00", + "gross_pnl": 161.67675780463924, + "pnl": 161.67675780463924, + "pnlcomm": 161.67675780463924, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87347025830266, + "entry_time": "2022-07-03T00:00:00", + "exit_price": 91.20564533828777, + "exit_time": "2022-07-04T00:00:00", + "gross_pnl": 33.2175079985106, + "pnl": 33.2175079985106, + "pnlcomm": 33.2175079985106, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30309517181773, + "entry_time": "2022-07-06T00:00:00", + "exit_price": 90.1406611037728, + "exit_time": "2022-07-07T00:00:00", + "gross_pnl": -116.24340680449308, + "pnl": -116.24340680449308, + "pnlcomm": -116.24340680449308, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.24392591685461, + "entry_time": "2022-07-09T00:00:00", + "exit_price": 91.10896639776044, + "exit_time": "2022-07-10T00:00:00", + "gross_pnl": 86.5040480905833, + "pnl": 86.5040480905833, + "pnlcomm": 86.5040480905833, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43429707485602, + "entry_time": "2022-07-12T00:00:00", + "exit_price": 90.99823744300166, + "exit_time": "2022-07-13T00:00:00", + "gross_pnl": -43.60596318543628, + "pnl": -43.60596318543628, + "pnlcomm": -43.60596318543628, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51160983247296, + "entry_time": "2022-07-15T00:00:00", + "exit_price": 91.15695774047701, + "exit_time": "2022-07-16T00:00:00", + "gross_pnl": 64.53479080040552, + "pnl": 64.53479080040552, + "pnlcomm": 64.53479080040552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.25313076740179, + "entry_time": "2022-07-18T00:00:00", + "exit_price": 90.3503914171167, + "exit_time": "2022-07-19T00:00:00", + "gross_pnl": -90.27393502850884, + "pnl": -90.27393502850884, + "pnlcomm": -90.27393502850884, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47393608345517, + "entry_time": "2022-07-21T00:00:00", + "exit_price": 89.98751697992218, + "exit_time": "2022-07-22T00:00:00", + "gross_pnl": -148.64191035329952, + "pnl": -148.64191035329952, + "pnlcomm": -148.64191035329952, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.0545116492653, + "entry_time": "2022-07-24T00:00:00", + "exit_price": 91.01799823084976, + "exit_time": "2022-07-25T00:00:00", + "gross_pnl": -103.6513418415538, + "pnl": -103.6513418415538, + "pnlcomm": -103.6513418415538, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05081241841745, + "entry_time": "2022-07-27T00:00:00", + "exit_price": 91.31407916672543, + "exit_time": "2022-07-28T00:00:00", + "gross_pnl": 26.326674830798424, + "pnl": 26.326674830798424, + "pnlcomm": 26.326674830798424, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80885265421585, + "entry_time": "2022-07-30T00:00:00", + "exit_price": 91.15205975168703, + "exit_time": "2022-07-31T00:00:00", + "gross_pnl": 34.32070974711792, + "pnl": 34.32070974711792, + "pnlcomm": 34.32070974711792, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47241880815605, + "entry_time": "2022-08-02T00:00:00", + "exit_price": 91.54172600484964, + "exit_time": "2022-08-03T00:00:00", + "gross_pnl": 6.930719669358609, + "pnl": 6.930719669358609, + "pnlcomm": 6.930719669358609, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8976774720573, + "entry_time": "2022-08-05T00:00:00", + "exit_price": 91.58791087448299, + "exit_time": "2022-08-06T00:00:00", + "gross_pnl": -30.97665975743098, + "pnl": -30.97665975743098, + "pnlcomm": -30.97665975743098, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02271267015783, + "entry_time": "2022-08-08T00:00:00", + "exit_price": 91.10459083951521, + "exit_time": "2022-08-09T00:00:00", + "gross_pnl": -91.81218306426189, + "pnl": -91.81218306426189, + "pnlcomm": -91.81218306426189, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24414870008319, + "entry_time": "2022-08-11T00:00:00", + "exit_price": 92.69109127617371, + "exit_time": "2022-08-12T00:00:00", + "gross_pnl": 44.6942576090521, + "pnl": 44.6942576090521, + "pnlcomm": 44.6942576090521, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.65306278042235, + "entry_time": "2022-08-14T00:00:00", + "exit_price": 92.39816620647916, + "exit_time": "2022-08-15T00:00:00", + "gross_pnl": 74.5103426056815, + "pnl": 74.5103426056815, + "pnlcomm": 74.5103426056815, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1810606061523, + "entry_time": "2022-08-17T00:00:00", + "exit_price": 92.49470462633181, + "exit_time": "2022-08-18T00:00:00", + "gross_pnl": -68.63559798204903, + "pnl": -68.63559798204903, + "pnlcomm": -68.63559798204903, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01504374556126, + "entry_time": "2022-08-20T00:00:00", + "exit_price": 92.67904663244455, + "exit_time": "2022-08-21T00:00:00", + "gross_pnl": 66.40028868832957, + "pnl": 66.40028868832957, + "pnlcomm": 66.40028868832957, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74908045175502, + "entry_time": "2022-08-23T00:00:00", + "exit_price": 93.28081352108578, + "exit_time": "2022-08-24T00:00:00", + "gross_pnl": -46.82669306692446, + "pnl": -46.82669306692446, + "pnlcomm": -46.82669306692446, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72430502818084, + "entry_time": "2022-08-26T00:00:00", + "exit_price": 92.91000509633356, + "exit_time": "2022-08-27T00:00:00", + "gross_pnl": -81.42999318472732, + "pnl": -81.42999318472732, + "pnlcomm": -81.42999318472732, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0266388958905, + "entry_time": "2022-08-29T00:00:00", + "exit_price": 93.06932306108122, + "exit_time": "2022-08-30T00:00:00", + "gross_pnl": 4.268416519072105, + "pnl": 4.268416519072105, + "pnlcomm": 4.268416519072105, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2669116718157, + "entry_time": "2022-09-01T00:00:00", + "exit_price": 93.31911690207038, + "exit_time": "2022-09-02T00:00:00", + "gross_pnl": 5.220523025467116, + "pnl": 5.220523025467116, + "pnlcomm": 5.220523025467116, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01378736632232, + "entry_time": "2022-09-04T00:00:00", + "exit_price": 92.69057272581715, + "exit_time": "2022-09-05T00:00:00", + "gross_pnl": -32.32146405051708, + "pnl": -32.32146405051708, + "pnlcomm": -32.32146405051708, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86605080021333, + "entry_time": "2022-09-07T00:00:00", + "exit_price": 93.54829275642138, + "exit_time": "2022-09-08T00:00:00", + "gross_pnl": 68.22419562080455, + "pnl": 68.22419562080455, + "pnlcomm": 68.22419562080455, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92761316198515, + "entry_time": "2022-09-10T00:00:00", + "exit_price": 92.07281692163534, + "exit_time": "2022-09-11T00:00:00", + "gross_pnl": -185.47962403498133, + "pnl": -185.47962403498133, + "pnlcomm": -185.47962403498133, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2809228591007, + "entry_time": "2022-09-13T00:00:00", + "exit_price": 94.11130793179962, + "exit_time": "2022-09-14T00:00:00", + "gross_pnl": -16.96149273010832, + "pnl": -16.96149273010832, + "pnlcomm": -16.96149273010832, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78210365621945, + "entry_time": "2022-09-16T00:00:00", + "exit_price": 94.99114272050637, + "exit_time": "2022-09-17T00:00:00", + "gross_pnl": 20.903906428692665, + "pnl": 20.903906428692665, + "pnlcomm": 20.903906428692665, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26603620619443, + "entry_time": "2022-09-19T00:00:00", + "exit_price": 95.26895473010688, + "exit_time": "2022-09-20T00:00:00", + "gross_pnl": 100.29185239124558, + "pnl": 100.29185239124558, + "pnlcomm": 100.29185239124558, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88756691851471, + "entry_time": "2022-09-22T00:00:00", + "exit_price": 94.90535085923925, + "exit_time": "2022-09-23T00:00:00", + "gross_pnl": 1.778394072454148, + "pnl": 1.778394072454148, + "pnlcomm": 1.778394072454148, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8662778443967, + "entry_time": "2022-09-25T00:00:00", + "exit_price": 94.27678234231546, + "exit_time": "2022-09-26T00:00:00", + "gross_pnl": -58.94955020812489, + "pnl": -58.94955020812489, + "pnlcomm": -58.94955020812489, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21120724189035, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 93.62182381785365, + "exit_time": "2022-09-29T00:00:00", + "gross_pnl": -58.93834240366971, + "pnl": -58.93834240366971, + "pnlcomm": -58.93834240366971, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70089986040492, + "entry_time": "2022-10-01T00:00:00", + "exit_price": 94.98061841891752, + "exit_time": "2022-10-02T00:00:00", + "gross_pnl": 27.971855851259875, + "pnl": 27.971855851259875, + "pnlcomm": 27.971855851259875, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.63730668221623, + "entry_time": "2022-10-04T00:00:00", + "exit_price": 95.21809213108293, + "exit_time": "2022-10-05T00:00:00", + "gross_pnl": 58.07854488666919, + "pnl": 58.07854488666919, + "pnlcomm": 58.07854488666919, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62513446883317, + "entry_time": "2022-10-07T00:00:00", + "exit_price": 95.0550792423482, + "exit_time": "2022-10-08T00:00:00", + "gross_pnl": 42.994477351503235, + "pnl": 42.994477351503235, + "pnlcomm": 42.994477351503235, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7111656021986, + "entry_time": "2022-10-10T00:00:00", + "exit_price": 94.70112878957045, + "exit_time": "2022-10-11T00:00:00", + "gross_pnl": 98.9963187371842, + "pnl": 98.9963187371842, + "pnlcomm": 98.9963187371842, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22008595203475, + "entry_time": "2022-10-13T00:00:00", + "exit_price": 95.26583380518775, + "exit_time": "2022-10-14T00:00:00", + "gross_pnl": 104.57478531530029, + "pnl": 104.57478531530029, + "pnlcomm": 104.57478531530029, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84031644841893, + "entry_time": "2022-10-16T00:00:00", + "exit_price": 94.76253265375746, + "exit_time": "2022-10-17T00:00:00", + "gross_pnl": -7.778379466147101, + "pnl": -7.778379466147101, + "pnlcomm": -7.778379466147101, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36921450181964, + "entry_time": "2022-10-19T00:00:00", + "exit_price": 94.38751561741323, + "exit_time": "2022-10-20T00:00:00", + "gross_pnl": 101.83011155935873, + "pnl": 101.83011155935873, + "pnlcomm": 101.83011155935873, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.75942760797071, + "entry_time": "2022-10-22T00:00:00", + "exit_price": 94.20505090808615, + "exit_time": "2022-10-23T00:00:00", + "gross_pnl": -55.437669988455696, + "pnl": -55.437669988455696, + "pnlcomm": -55.437669988455696, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01993010545006, + "entry_time": "2022-10-25T00:00:00", + "exit_price": 94.25253006691226, + "exit_time": "2022-10-26T00:00:00", + "gross_pnl": -76.74000385378008, + "pnl": -76.74000385378008, + "pnlcomm": -76.74000385378008, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9292129294191, + "entry_time": "2022-10-28T00:00:00", + "exit_price": 95.45831791808807, + "exit_time": "2022-10-29T00:00:00", + "gross_pnl": 52.910498866897626, + "pnl": 52.910498866897626, + "pnlcomm": 52.910498866897626, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01874761761506, + "entry_time": "2022-10-31T00:00:00", + "exit_price": 95.70179579177142, + "exit_time": "2022-11-01T00:00:00", + "gross_pnl": 68.30481741563545, + "pnl": 68.30481741563545, + "pnlcomm": 68.30481741563545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.45782648578765, + "entry_time": "2022-11-03T00:00:00", + "exit_price": 95.9654506293958, + "exit_time": "2022-11-04T00:00:00", + "gross_pnl": -49.237585639184545, + "pnl": -49.237585639184545, + "pnlcomm": -49.237585639184545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.69543160906309, + "entry_time": "2022-11-06T00:00:00", + "exit_price": 96.23626703373414, + "exit_time": "2022-11-07T00:00:00", + "gross_pnl": 54.08354246710445, + "pnl": 54.08354246710445, + "pnlcomm": 54.08354246710445, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23730582460071, + "entry_time": "2022-11-09T00:00:00", + "exit_price": 94.58630669240723, + "exit_time": "2022-11-10T00:00:00", + "gross_pnl": -65.09991321934763, + "pnl": -65.09991321934763, + "pnlcomm": -65.09991321934763, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.24411442253736, + "entry_time": "2022-11-12T00:00:00", + "exit_price": 94.80412345904836, + "exit_time": "2022-11-13T00:00:00", + "gross_pnl": -43.999096348900935, + "pnl": -43.999096348900935, + "pnlcomm": -43.999096348900935, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33266826608637, + "entry_time": "2022-11-15T00:00:00", + "exit_price": 94.08584208568091, + "exit_time": "2022-11-16T00:00:00", + "gross_pnl": -24.682618040546345, + "pnl": -24.682618040546345, + "pnlcomm": -24.682618040546345, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20511704388718, + "entry_time": "2022-11-18T00:00:00", + "exit_price": 93.73586252939168, + "exit_time": "2022-11-19T00:00:00", + "gross_pnl": -46.92545144955034, + "pnl": -46.92545144955034, + "pnlcomm": -46.92545144955034, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6229802242446, + "entry_time": "2022-11-21T00:00:00", + "exit_price": 93.66558700926207, + "exit_time": "2022-11-22T00:00:00", + "gross_pnl": -95.7393214982531, + "pnl": -95.7393214982531, + "pnlcomm": -95.7393214982531, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74677062129318, + "entry_time": "2022-11-24T00:00:00", + "exit_price": 93.54017463980657, + "exit_time": "2022-11-25T00:00:00", + "gross_pnl": -20.659598148661473, + "pnl": -20.659598148661473, + "pnlcomm": -20.659598148661473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.730138438308, + "entry_time": "2022-11-27T00:00:00", + "exit_price": 93.49572076787184, + "exit_time": "2022-11-28T00:00:00", + "gross_pnl": -23.44176704361587, + "pnl": -23.44176704361587, + "pnlcomm": -23.44176704361587, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77203615539878, + "entry_time": "2022-11-30T00:00:00", + "exit_price": 92.91635203682458, + "exit_time": "2022-12-01T00:00:00", + "gross_pnl": -85.5684118574203, + "pnl": -85.5684118574203, + "pnlcomm": -85.5684118574203, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91294155802171, + "entry_time": "2022-12-03T00:00:00", + "exit_price": 92.85493736088272, + "exit_time": "2022-12-04T00:00:00", + "gross_pnl": -105.80041971389988, + "pnl": -105.80041971389988, + "pnlcomm": -105.80041971389988, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07037492573127, + "entry_time": "2022-12-06T00:00:00", + "exit_price": 93.35918129576551, + "exit_time": "2022-12-07T00:00:00", + "gross_pnl": -71.11936299657629, + "pnl": -71.11936299657629, + "pnlcomm": -71.11936299657629, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21752684184962, + "entry_time": "2022-12-09T00:00:00", + "exit_price": 93.82182795562746, + "exit_time": "2022-12-10T00:00:00", + "gross_pnl": 60.430111377783646, + "pnl": 60.430111377783646, + "pnlcomm": 60.430111377783646, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91554181329224, + "entry_time": "2022-12-12T00:00:00", + "exit_price": 93.2637454877203, + "exit_time": "2022-12-13T00:00:00", + "gross_pnl": -65.17963255719366, + "pnl": -65.17963255719366, + "pnlcomm": -65.17963255719366, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42377971468683, + "entry_time": "2022-12-15T00:00:00", + "exit_price": 92.9956096009709, + "exit_time": "2022-12-16T00:00:00", + "gross_pnl": -42.817011371593594, + "pnl": -42.817011371593594, + "pnlcomm": -42.817011371593594, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95024629295155, + "entry_time": "2022-12-18T00:00:00", + "exit_price": 92.02384747382928, + "exit_time": "2022-12-19T00:00:00", + "gross_pnl": -92.63988191222694, + "pnl": -92.63988191222694, + "pnlcomm": -92.63988191222694, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.7384856392294, + "entry_time": "2022-12-21T00:00:00", + "exit_price": 91.78634727970504, + "exit_time": "2022-12-22T00:00:00", + "gross_pnl": 104.78616404756451, + "pnl": 104.78616404756451, + "pnlcomm": 104.78616404756451, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.46503843997183, + "entry_time": "2022-12-24T00:00:00", + "exit_price": 91.75198886376967, + "exit_time": "2022-12-25T00:00:00", + "gross_pnl": 28.69504237978333, + "pnl": 28.69504237978333, + "pnlcomm": 28.69504237978333, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.39876122857235, + "entry_time": "2022-12-27T00:00:00", + "exit_price": 92.11567284541557, + "exit_time": "2022-12-28T00:00:00", + "gross_pnl": -28.30883831567803, + "pnl": -28.30883831567803, + "pnlcomm": -28.30883831567803, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77091533493147, + "entry_time": "2022-12-30T00:00:00", + "exit_price": 93.3485194106044, + "exit_time": "2022-12-31T00:00:00", + "gross_pnl": 57.760407567292305, + "pnl": 57.760407567292305, + "pnlcomm": 57.760407567292305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04122370969267, + "entry_time": "2023-01-02T00:00:00", + "exit_price": 92.97807111210727, + "exit_time": "2023-01-03T00:00:00", + "gross_pnl": 93.68474024145996, + "pnl": 93.68474024145996, + "pnlcomm": 93.68474024145996, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82297627909733, + "entry_time": "2023-01-05T00:00:00", + "exit_price": 92.88908258807695, + "exit_time": "2023-01-06T00:00:00", + "gross_pnl": 6.6106308979613, + "pnl": 6.6106308979613, + "pnlcomm": 6.6106308979613, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.02494822567455, + "entry_time": "2023-01-08T00:00:00", + "exit_price": 92.52813633390632, + "exit_time": "2023-01-09T00:00:00", + "gross_pnl": -49.68118917682318, + "pnl": -49.68118917682318, + "pnlcomm": -49.68118917682318, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77607586946252, + "entry_time": "2023-01-11T00:00:00", + "exit_price": 92.84906975105618, + "exit_time": "2023-01-12T00:00:00", + "gross_pnl": 7.29938815936606, + "pnl": 7.29938815936606, + "pnlcomm": 7.29938815936606, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10682536410768, + "entry_time": "2023-01-14T00:00:00", + "exit_price": 92.60098332710814, + "exit_time": "2023-01-15T00:00:00", + "gross_pnl": -50.58420369995389, + "pnl": -50.58420369995389, + "pnlcomm": -50.58420369995389, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16477240647923, + "entry_time": "2023-01-17T00:00:00", + "exit_price": 93.64464350405021, + "exit_time": "2023-01-18T00:00:00", + "gross_pnl": 47.98710975709781, + "pnl": 47.98710975709781, + "pnlcomm": 47.98710975709781, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34853961981467, + "entry_time": "2023-01-20T00:00:00", + "exit_price": 92.90164291858915, + "exit_time": "2023-01-21T00:00:00", + "gross_pnl": 55.31032987744737, + "pnl": 55.31032987744737, + "pnlcomm": 55.31032987744737, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52920571661875, + "entry_time": "2023-01-23T00:00:00", + "exit_price": 92.96718442791747, + "exit_time": "2023-01-24T00:00:00", + "gross_pnl": -56.20212887012741, + "pnl": -56.20212887012741, + "pnlcomm": -56.20212887012741, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1449985691514, + "entry_time": "2023-01-26T00:00:00", + "exit_price": 93.09214526901171, + "exit_time": "2023-01-27T00:00:00", + "gross_pnl": -105.2853300139688, + "pnl": -105.2853300139688, + "pnlcomm": -105.2853300139688, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08808617199072, + "entry_time": "2023-01-29T00:00:00", + "exit_price": 93.57735843418071, + "exit_time": "2023-01-30T00:00:00", + "gross_pnl": -51.0727737810015, + "pnl": -51.0727737810015, + "pnlcomm": -51.0727737810015, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.03374091329061, + "entry_time": "2023-02-01T00:00:00", + "exit_price": 92.67153521214688, + "exit_time": "2023-02-02T00:00:00", + "gross_pnl": -136.22057011437363, + "pnl": -136.22057011437363, + "pnlcomm": -136.22057011437363, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90721494360177, + "entry_time": "2023-02-04T00:00:00", + "exit_price": 92.94800270723887, + "exit_time": "2023-02-05T00:00:00", + "gross_pnl": 4.078776363709835, + "pnl": 4.078776363709835, + "pnlcomm": 4.078776363709835, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77341143396697, + "entry_time": "2023-02-07T00:00:00", + "exit_price": 93.16810608211969, + "exit_time": "2023-02-08T00:00:00", + "gross_pnl": -60.530535184727796, + "pnl": -60.530535184727796, + "pnlcomm": -60.530535184727796, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1295561924666, + "entry_time": "2023-02-10T00:00:00", + "exit_price": 93.6109897663897, + "exit_time": "2023-02-11T00:00:00", + "gross_pnl": 48.14335739230984, + "pnl": 48.14335739230984, + "pnlcomm": 48.14335739230984, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09160273927314, + "entry_time": "2023-02-13T00:00:00", + "exit_price": 93.33166346007059, + "exit_time": "2023-02-14T00:00:00", + "gross_pnl": -75.99392792025554, + "pnl": -75.99392792025554, + "pnlcomm": -75.99392792025554, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53620789150742, + "entry_time": "2023-02-16T00:00:00", + "exit_price": 94.21568894504843, + "exit_time": "2023-02-17T00:00:00", + "gross_pnl": -32.051894645898926, + "pnl": -32.051894645898926, + "pnlcomm": -32.051894645898926, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93343913761625, + "entry_time": "2023-02-19T00:00:00", + "exit_price": 94.02299067534886, + "exit_time": "2023-02-20T00:00:00", + "gross_pnl": 8.95515377326177, + "pnl": 8.95515377326177, + "pnlcomm": 8.95515377326177, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18544500815403, + "entry_time": "2023-02-22T00:00:00", + "exit_price": 93.98907937476646, + "exit_time": "2023-02-23T00:00:00", + "gross_pnl": -19.636563338757185, + "pnl": -19.636563338757185, + "pnlcomm": -19.636563338757185, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45348785433026, + "entry_time": "2023-02-25T00:00:00", + "exit_price": 95.02085687929099, + "exit_time": "2023-02-26T00:00:00", + "gross_pnl": 56.73690249607262, + "pnl": 56.73690249607262, + "pnlcomm": 56.73690249607262, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84830391916218, + "entry_time": "2023-02-28T00:00:00", + "exit_price": 94.43699045607909, + "exit_time": "2023-03-01T00:00:00", + "gross_pnl": -41.13134630830899, + "pnl": -41.13134630830899, + "pnlcomm": -41.13134630830899, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.95759166912264, + "entry_time": "2023-03-03T00:00:00", + "exit_price": 93.47551491598016, + "exit_time": "2023-03-04T00:00:00", + "gross_pnl": -48.20767531424792, + "pnl": -48.20767531424792, + "pnlcomm": -48.20767531424792, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66498305754212, + "entry_time": "2023-03-06T00:00:00", + "exit_price": 93.36643618283398, + "exit_time": "2023-03-07T00:00:00", + "gross_pnl": -29.8546874708137, + "pnl": -29.8546874708137, + "pnlcomm": -29.8546874708137, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3496449568648, + "entry_time": "2023-03-09T00:00:00", + "exit_price": 93.06229907806569, + "exit_time": "2023-03-10T00:00:00", + "gross_pnl": -28.734587879910123, + "pnl": -28.734587879910123, + "pnlcomm": -28.734587879910123, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93784310790696, + "entry_time": "2023-03-12T00:00:00", + "exit_price": 92.96780942003683, + "exit_time": "2023-03-13T00:00:00", + "gross_pnl": -97.00336878701279, + "pnl": -97.00336878701279, + "pnlcomm": -97.00336878701279, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88445131540618, + "entry_time": "2023-03-15T00:00:00", + "exit_price": 94.08186481058257, + "exit_time": "2023-03-16T00:00:00", + "gross_pnl": 19.74134951763915, + "pnl": 19.74134951763915, + "pnlcomm": 19.74134951763915, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20796655389181, + "entry_time": "2023-03-18T00:00:00", + "exit_price": 91.9654081254928, + "exit_time": "2023-03-19T00:00:00", + "gross_pnl": -24.255842839900765, + "pnl": -24.255842839900765, + "pnlcomm": -24.255842839900765, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49393791749024, + "entry_time": "2023-03-21T00:00:00", + "exit_price": 92.05007592523164, + "exit_time": "2023-03-22T00:00:00", + "gross_pnl": -44.38619922586042, + "pnl": -44.38619922586042, + "pnlcomm": -44.38619922586042, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.84518996211608, + "entry_time": "2023-03-24T00:00:00", + "exit_price": 92.32190345568543, + "exit_time": "2023-03-25T00:00:00", + "gross_pnl": 47.67134935693491, + "pnl": 47.67134935693491, + "pnlcomm": 47.67134935693491, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32827178627502, + "entry_time": "2023-03-27T00:00:00", + "exit_price": 93.26562867244172, + "exit_time": "2023-03-28T00:00:00", + "gross_pnl": -6.264311383330323, + "pnl": -6.264311383330323, + "pnlcomm": -6.264311383330323, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9489490131078, + "entry_time": "2023-03-30T00:00:00", + "exit_price": 93.54756230484855, + "exit_time": "2023-03-31T00:00:00", + "gross_pnl": 59.86132917407474, + "pnl": 59.86132917407474, + "pnlcomm": 59.86132917407474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52695826109522, + "entry_time": "2023-04-02T00:00:00", + "exit_price": 93.16120912048845, + "exit_time": "2023-04-03T00:00:00", + "gross_pnl": -36.57491406067663, + "pnl": -36.57491406067663, + "pnlcomm": -36.57491406067663, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73109278013733, + "entry_time": "2023-04-05T00:00:00", + "exit_price": 92.12967158946792, + "exit_time": "2023-04-06T00:00:00", + "gross_pnl": -60.14211906694129, + "pnl": -60.14211906694129, + "pnlcomm": -60.14211906694129, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66144197243285, + "entry_time": "2023-04-08T00:00:00", + "exit_price": 92.35105870140517, + "exit_time": "2023-04-09T00:00:00", + "gross_pnl": -31.038327102768903, + "pnl": -31.038327102768903, + "pnlcomm": -31.038327102768903, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32497954050243, + "entry_time": "2023-04-11T00:00:00", + "exit_price": 92.404028525945, + "exit_time": "2023-04-12T00:00:00", + "gross_pnl": -92.09510145574313, + "pnl": -92.09510145574313, + "pnlcomm": -92.09510145574313, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5596224194739, + "entry_time": "2023-04-14T00:00:00", + "exit_price": 93.06373732644884, + "exit_time": "2023-04-15T00:00:00", + "gross_pnl": 50.4114906974948, + "pnl": 50.4114906974948, + "pnlcomm": 50.4114906974948, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82924854494931, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 92.63616550173667, + "exit_time": "2023-04-18T00:00:00", + "gross_pnl": -19.308304321263847, + "pnl": -19.308304321263847, + "pnlcomm": -19.308304321263847, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79933273190036, + "entry_time": "2023-04-20T00:00:00", + "exit_price": 92.95120755426662, + "exit_time": "2023-04-21T00:00:00", + "gross_pnl": 15.187482236625272, + "pnl": 15.187482236625272, + "pnlcomm": 15.187482236625272, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56403816854014, + "entry_time": "2023-04-23T00:00:00", + "exit_price": 92.35426808914588, + "exit_time": "2023-04-24T00:00:00", + "gross_pnl": -20.977007939426073, + "pnl": -20.977007939426073, + "pnlcomm": -20.977007939426073, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35865607168631, + "entry_time": "2023-04-26T00:00:00", + "exit_price": 92.90482034285156, + "exit_time": "2023-04-27T00:00:00", + "gross_pnl": -45.3835728834747, + "pnl": -45.3835728834747, + "pnlcomm": -45.3835728834747, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9985787957225, + "entry_time": "2023-04-29T00:00:00", + "exit_price": 92.8768940380532, + "exit_time": "2023-04-30T00:00:00", + "gross_pnl": -12.168475766929987, + "pnl": -12.168475766929987, + "pnlcomm": -12.168475766929987, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86502942650776, + "entry_time": "2023-05-02T00:00:00", + "exit_price": 92.82867955654159, + "exit_time": "2023-05-03T00:00:00", + "gross_pnl": -3.6349869966173287, + "pnl": -3.6349869966173287, + "pnlcomm": -3.6349869966173287, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06669061925808, + "entry_time": "2023-05-05T00:00:00", + "exit_price": 93.05805100493505, + "exit_time": "2023-05-06T00:00:00", + "gross_pnl": -0.8639614323030287, + "pnl": -0.8639614323030287, + "pnlcomm": -0.8639614323030287, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19478081630376, + "entry_time": "2023-05-08T00:00:00", + "exit_price": 92.4726753044577, + "exit_time": "2023-05-09T00:00:00", + "gross_pnl": -72.21055118460669, + "pnl": -72.21055118460669, + "pnlcomm": -72.21055118460669, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8774192059464, + "entry_time": "2023-05-11T00:00:00", + "exit_price": 93.47630925649874, + "exit_time": "2023-05-12T00:00:00", + "gross_pnl": 159.88900505523418, + "pnl": 159.88900505523418, + "pnlcomm": 159.88900505523418, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67940992744533, + "entry_time": "2023-05-14T00:00:00", + "exit_price": 93.83387030747774, + "exit_time": "2023-05-15T00:00:00", + "gross_pnl": 115.4460380032404, + "pnl": 115.4460380032404, + "pnlcomm": 115.4460380032404, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77541066961662, + "entry_time": "2023-05-17T00:00:00", + "exit_price": 93.21806909335821, + "exit_time": "2023-05-18T00:00:00", + "gross_pnl": 44.26584237415909, + "pnl": 44.26584237415909, + "pnlcomm": 44.26584237415909, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2116719393634, + "entry_time": "2023-05-20T00:00:00", + "exit_price": 93.63189068076446, + "exit_time": "2023-05-21T00:00:00", + "gross_pnl": 42.02187414010581, + "pnl": 42.02187414010581, + "pnlcomm": 42.02187414010581, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31676028980675, + "entry_time": "2023-05-23T00:00:00", + "exit_price": 93.96917376263126, + "exit_time": "2023-05-24T00:00:00", + "gross_pnl": 65.24134728245059, + "pnl": 65.24134728245059, + "pnlcomm": 65.24134728245059, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.3332407570871, + "entry_time": "2023-05-26T00:00:00", + "exit_price": 94.63597205774145, + "exit_time": "2023-05-27T00:00:00", + "gross_pnl": 30.273130065435794, + "pnl": 30.273130065435794, + "pnlcomm": 30.273130065435794, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00130198273088, + "entry_time": "2023-05-29T00:00:00", + "exit_price": 94.05926832590498, + "exit_time": "2023-05-30T00:00:00", + "gross_pnl": 5.79663431741011, + "pnl": 5.79663431741011, + "pnlcomm": 5.79663431741011, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76190103073331, + "entry_time": "2023-06-01T00:00:00", + "exit_price": 94.24963627943364, + "exit_time": "2023-06-02T00:00:00", + "gross_pnl": 148.7735248700332, + "pnl": 148.7735248700332, + "pnlcomm": 148.7735248700332, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.73904226779082, + "entry_time": "2023-06-04T00:00:00", + "exit_price": 94.53198582108524, + "exit_time": "2023-06-05T00:00:00", + "gross_pnl": -20.705644670557888, + "pnl": -20.705644670557888, + "pnlcomm": -20.705644670557888, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29391446442064, + "entry_time": "2023-06-07T00:00:00", + "exit_price": 94.60323551607766, + "exit_time": "2023-06-08T00:00:00", + "gross_pnl": 30.93210516570224, + "pnl": 30.93210516570224, + "pnlcomm": 30.93210516570224, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.17535379161295, + "entry_time": "2023-06-10T00:00:00", + "exit_price": 94.95745054254392, + "exit_time": "2023-06-11T00:00:00", + "gross_pnl": 78.20967509309753, + "pnl": 78.20967509309753, + "pnlcomm": 78.20967509309753, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65432843266518, + "entry_time": "2023-06-13T00:00:00", + "exit_price": 94.33856790601594, + "exit_time": "2023-06-14T00:00:00", + "gross_pnl": -31.576052664924248, + "pnl": -31.576052664924248, + "pnlcomm": -31.576052664924248, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.36956060356385, + "entry_time": "2023-06-16T00:00:00", + "exit_price": 95.2507487739047, + "exit_time": "2023-06-17T00:00:00", + "gross_pnl": 88.11881703408488, + "pnl": 88.11881703408488, + "pnlcomm": 88.11881703408488, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9809276691774, + "entry_time": "2023-06-19T00:00:00", + "exit_price": 94.16338627425559, + "exit_time": "2023-06-20T00:00:00", + "gross_pnl": -81.75413949218182, + "pnl": -81.75413949218182, + "pnlcomm": -81.75413949218182, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95283790294347, + "entry_time": "2023-06-22T00:00:00", + "exit_price": 94.37363985497257, + "exit_time": "2023-06-23T00:00:00", + "gross_pnl": -57.919804797090535, + "pnl": -57.919804797090535, + "pnlcomm": -57.919804797090535, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41734797456819, + "entry_time": "2023-06-25T00:00:00", + "exit_price": 94.46879833485087, + "exit_time": "2023-06-26T00:00:00", + "gross_pnl": 5.145036028268635, + "pnl": 5.145036028268635, + "pnlcomm": 5.145036028268635, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89779171625213, + "entry_time": "2023-06-28T00:00:00", + "exit_price": 94.56566914846213, + "exit_time": "2023-06-29T00:00:00", + "gross_pnl": 66.78774322100054, + "pnl": 66.78774322100054, + "pnlcomm": 66.78774322100054, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12295330761386, + "entry_time": "2023-07-01T00:00:00", + "exit_price": 94.47229523041987, + "exit_time": "2023-07-02T00:00:00", + "gross_pnl": 34.934192280601906, + "pnl": 34.934192280601906, + "pnlcomm": 34.934192280601906, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01642931045994, + "entry_time": "2023-07-04T00:00:00", + "exit_price": 94.97899403484826, + "exit_time": "2023-07-05T00:00:00", + "gross_pnl": 96.25647243883151, + "pnl": 96.25647243883151, + "pnlcomm": 96.25647243883151, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29040521639678, + "entry_time": "2023-07-07T00:00:00", + "exit_price": 94.62958711128005, + "exit_time": "2023-07-08T00:00:00", + "gross_pnl": -66.08181051167321, + "pnl": -66.08181051167321, + "pnlcomm": -66.08181051167321, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94114223449, + "entry_time": "2023-07-10T00:00:00", + "exit_price": 94.38592136937638, + "exit_time": "2023-07-11T00:00:00", + "gross_pnl": -55.522086511362545, + "pnl": -55.522086511362545, + "pnlcomm": -55.522086511362545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493222435549, + "entry_time": "2023-07-13T00:00:00", + "exit_price": 94.3474523152517, + "exit_time": "2023-07-14T00:00:00", + "gross_pnl": -14.577012029729985, + "pnl": -14.577012029729985, + "pnlcomm": -14.577012029729985, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.84805377401344, + "entry_time": "2023-07-16T00:00:00", + "exit_price": 93.24313248176318, + "exit_time": "2023-07-17T00:00:00", + "gross_pnl": -60.49212922502534, + "pnl": -60.49212922502534, + "pnlcomm": -60.49212922502534, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23716867785055, + "entry_time": "2023-07-19T00:00:00", + "exit_price": 94.3344550507391, + "exit_time": "2023-07-20T00:00:00", + "gross_pnl": 109.72863728885471, + "pnl": 109.72863728885471, + "pnlcomm": 109.72863728885471, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25058017257405, + "entry_time": "2023-07-22T00:00:00", + "exit_price": 94.26148603669161, + "exit_time": "2023-07-23T00:00:00", + "gross_pnl": 1.0905864117560782, + "pnl": 1.0905864117560782, + "pnlcomm": 1.0905864117560782, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78124566715695, + "entry_time": "2023-07-25T00:00:00", + "exit_price": 93.30392352510412, + "exit_time": "2023-07-26T00:00:00", + "gross_pnl": -147.73221420528273, + "pnl": -147.73221420528273, + "pnlcomm": -147.73221420528273, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05471403229689, + "entry_time": "2023-07-28T00:00:00", + "exit_price": 93.26889976544973, + "exit_time": "2023-07-29T00:00:00", + "gross_pnl": -78.58142668471544, + "pnl": -78.58142668471544, + "pnlcomm": -78.58142668471544, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.97149252732743, + "entry_time": "2023-07-31T00:00:00", + "exit_price": 92.49652862514738, + "exit_time": "2023-08-01T00:00:00", + "gross_pnl": -147.49639021800505, + "pnl": -147.49639021800505, + "pnlcomm": -147.49639021800505, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49761686858754, + "entry_time": "2023-08-03T00:00:00", + "exit_price": 93.96133483843103, + "exit_time": "2023-08-04T00:00:00", + "gross_pnl": 46.371796984348634, + "pnl": 46.371796984348634, + "pnlcomm": 46.371796984348634, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60373115569557, + "entry_time": "2023-08-06T00:00:00", + "exit_price": 94.43278823558683, + "exit_time": "2023-08-07T00:00:00", + "gross_pnl": 82.90570798912569, + "pnl": 82.90570798912569, + "pnlcomm": 82.90570798912569, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.216186422251, + "entry_time": "2023-08-09T00:00:00", + "exit_price": 93.22790913521419, + "exit_time": "2023-08-10T00:00:00", + "gross_pnl": -98.82772870368086, + "pnl": -98.82772870368086, + "pnlcomm": -98.82772870368086, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53921057943961, + "entry_time": "2023-08-12T00:00:00", + "exit_price": 93.3857390941578, + "exit_time": "2023-08-13T00:00:00", + "gross_pnl": -115.34714852818126, + "pnl": -115.34714852818126, + "pnlcomm": -115.34714852818126, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.03374081752091, + "entry_time": "2023-08-15T00:00:00", + "exit_price": 94.39823678210567, + "exit_time": "2023-08-16T00:00:00", + "gross_pnl": 136.4495964584762, + "pnl": 136.4495964584762, + "pnlcomm": 136.4495964584762, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08940418013472, + "entry_time": "2023-08-18T00:00:00", + "exit_price": 92.65920217896303, + "exit_time": "2023-08-19T00:00:00", + "gross_pnl": -143.02020011716934, + "pnl": -143.02020011716934, + "pnlcomm": -143.02020011716934, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39853539402684, + "entry_time": "2023-08-21T00:00:00", + "exit_price": 93.65048655775455, + "exit_time": "2023-08-22T00:00:00", + "gross_pnl": 25.195116372771054, + "pnl": 25.195116372771054, + "pnlcomm": 25.195116372771054, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79873760769597, + "entry_time": "2023-08-24T00:00:00", + "exit_price": 93.68828575617101, + "exit_time": "2023-08-25T00:00:00", + "gross_pnl": 88.95481484750434, + "pnl": 88.95481484750434, + "pnlcomm": 88.95481484750434, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87251964203307, + "entry_time": "2023-08-27T00:00:00", + "exit_price": 93.5300255114375, + "exit_time": "2023-08-28T00:00:00", + "gross_pnl": -34.249413059556844, + "pnl": -34.249413059556844, + "pnlcomm": -34.249413059556844, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79086592344467, + "entry_time": "2023-08-30T00:00:00", + "exit_price": 92.57270931229704, + "exit_time": "2023-08-31T00:00:00", + "gross_pnl": -121.81566111476343, + "pnl": -121.81566111476343, + "pnlcomm": -121.81566111476343, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88859692291733, + "entry_time": "2023-09-02T00:00:00", + "exit_price": 93.80271734344691, + "exit_time": "2023-09-03T00:00:00", + "gross_pnl": -8.587957947041502, + "pnl": -8.587957947041502, + "pnlcomm": -8.587957947041502, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04073002158317, + "entry_time": "2023-09-05T00:00:00", + "exit_price": 94.46828834544144, + "exit_time": "2023-09-06T00:00:00", + "gross_pnl": 142.7558323858264, + "pnl": 142.7558323858264, + "pnlcomm": 142.7558323858264, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23692924750449, + "entry_time": "2023-09-08T00:00:00", + "exit_price": 94.43771978777833, + "exit_time": "2023-09-09T00:00:00", + "gross_pnl": 20.079054027384302, + "pnl": 20.079054027384302, + "pnlcomm": 20.079054027384302, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09517649815284, + "entry_time": "2023-09-11T00:00:00", + "exit_price": 94.97835234626153, + "exit_time": "2023-09-12T00:00:00", + "gross_pnl": 88.31758481086922, + "pnl": 88.31758481086922, + "pnlcomm": 88.31758481086922, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79133291522645, + "entry_time": "2023-09-14T00:00:00", + "exit_price": 94.02945945000636, + "exit_time": "2023-09-15T00:00:00", + "gross_pnl": -76.18734652200914, + "pnl": -76.18734652200914, + "pnlcomm": -76.18734652200914, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45235296621496, + "entry_time": "2023-09-17T00:00:00", + "exit_price": 94.63061442838703, + "exit_time": "2023-09-18T00:00:00", + "gross_pnl": 17.826146217207395, + "pnl": 17.826146217207395, + "pnlcomm": 17.826146217207395, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1729530420449, + "entry_time": "2023-09-20T00:00:00", + "exit_price": 93.58327824763774, + "exit_time": "2023-09-21T00:00:00", + "gross_pnl": -58.96747944071592, + "pnl": -58.96747944071592, + "pnlcomm": -58.96747944071592, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.536291527272, + "entry_time": "2023-09-23T00:00:00", + "exit_price": 93.30651397849368, + "exit_time": "2023-09-24T00:00:00", + "gross_pnl": -22.977754877831558, + "pnl": -22.977754877831558, + "pnlcomm": -22.977754877831558, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69842586893596, + "entry_time": "2023-09-26T00:00:00", + "exit_price": 93.16248763742118, + "exit_time": "2023-09-27T00:00:00", + "gross_pnl": -53.59382315147769, + "pnl": -53.59382315147769, + "pnlcomm": -53.59382315147769, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49605102540508, + "entry_time": "2023-09-29T00:00:00", + "exit_price": 94.25313944944546, + "exit_time": "2023-09-30T00:00:00", + "gross_pnl": 75.70884240403757, + "pnl": 75.70884240403757, + "pnlcomm": 75.70884240403757, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8421663218519, + "entry_time": "2023-10-02T00:00:00", + "exit_price": 92.97561455613513, + "exit_time": "2023-10-03T00:00:00", + "gross_pnl": 13.344823428322172, + "pnl": 13.344823428322172, + "pnlcomm": 13.344823428322172, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01878568439928, + "entry_time": "2023-10-05T00:00:00", + "exit_price": 92.7731623418128, + "exit_time": "2023-10-06T00:00:00", + "gross_pnl": -24.562334258646956, + "pnl": -24.562334258646956, + "pnlcomm": -24.562334258646956, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3031103300392, + "entry_time": "2023-10-08T00:00:00", + "exit_price": 92.82895908639827, + "exit_time": "2023-10-09T00:00:00", + "gross_pnl": -47.41512436409323, + "pnl": -47.41512436409323, + "pnlcomm": -47.41512436409323, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34460637435383, + "entry_time": "2023-10-11T00:00:00", + "exit_price": 92.32181327562058, + "exit_time": "2023-10-12T00:00:00", + "gross_pnl": -2.2793098733245643, + "pnl": -2.2793098733245643, + "pnlcomm": -2.2793098733245643, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.5260793564055, + "entry_time": "2023-10-14T00:00:00", + "exit_price": 92.2357948297768, + "exit_time": "2023-10-15T00:00:00", + "gross_pnl": 70.97154733712898, + "pnl": 70.97154733712898, + "pnlcomm": 70.97154733712898, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68746434551585, + "entry_time": "2023-10-17T00:00:00", + "exit_price": 91.58592175261929, + "exit_time": "2023-10-18T00:00:00", + "gross_pnl": -10.154259289656409, + "pnl": -10.154259289656409, + "pnlcomm": -10.154259289656409, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.46697080069039, + "entry_time": "2023-10-20T00:00:00", + "exit_price": 91.654447961068, + "exit_time": "2023-10-21T00:00:00", + "gross_pnl": 18.74771603776111, + "pnl": 18.74771603776111, + "pnlcomm": 18.74771603776111, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3612670935331, + "entry_time": "2023-10-23T00:00:00", + "exit_price": 91.01031054901587, + "exit_time": "2023-10-24T00:00:00", + "gross_pnl": -135.09565445172314, + "pnl": -135.09565445172314, + "pnlcomm": -135.09565445172314, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.37919304454006, + "entry_time": "2023-10-26T00:00:00", + "exit_price": 91.41169786096938, + "exit_time": "2023-10-27T00:00:00", + "gross_pnl": -96.74951835706764, + "pnl": -96.74951835706764, + "pnlcomm": -96.74951835706764, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.29381617044329, + "entry_time": "2023-10-29T00:00:00", + "exit_price": 90.70386499802939, + "exit_time": "2023-10-30T00:00:00", + "gross_pnl": -58.99511724139046, + "pnl": -58.99511724139046, + "pnlcomm": -58.99511724139046, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.42981226133158, + "entry_time": "2023-11-01T00:00:00", + "exit_price": 91.13311787546733, + "exit_time": "2023-11-02T00:00:00", + "gross_pnl": -29.669438586424235, + "pnl": -29.669438586424235, + "pnlcomm": -29.669438586424235, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41698336938477, + "entry_time": "2023-11-04T00:00:00", + "exit_price": 91.39366908316057, + "exit_time": "2023-11-05T00:00:00", + "gross_pnl": -2.331428622419196, + "pnl": -2.331428622419196, + "pnlcomm": -2.331428622419196, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89356698837386, + "entry_time": "2023-11-07T00:00:00", + "exit_price": 91.60226357609555, + "exit_time": "2023-11-08T00:00:00", + "gross_pnl": -29.130341227831025, + "pnl": -29.130341227831025, + "pnlcomm": -29.130341227831025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.41574363121151, + "entry_time": "2023-11-10T00:00:00", + "exit_price": 91.77307124686526, + "exit_time": "2023-11-11T00:00:00", + "gross_pnl": -64.26723843462554, + "pnl": -64.26723843462554, + "pnlcomm": -64.26723843462554, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32527272706531, + "entry_time": "2023-11-13T00:00:00", + "exit_price": 94.02617500869306, + "exit_time": "2023-11-14T00:00:00", + "gross_pnl": 170.0902281627748, + "pnl": 170.0902281627748, + "pnlcomm": 170.0902281627748, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9453398724905, + "entry_time": "2023-11-16T00:00:00", + "exit_price": 92.0185892574846, + "exit_time": "2023-11-17T00:00:00", + "gross_pnl": -92.67506150059006, + "pnl": -92.67506150059006, + "pnlcomm": -92.67506150059006, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.30963127571127, + "entry_time": "2023-11-19T00:00:00", + "exit_price": 92.25489319248068, + "exit_time": "2023-11-20T00:00:00", + "gross_pnl": -5.473808323058904, + "pnl": -5.473808323058904, + "pnlcomm": -5.473808323058904, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74391567498766, + "entry_time": "2023-11-22T00:00:00", + "exit_price": 93.20889480054281, + "exit_time": "2023-11-23T00:00:00", + "gross_pnl": 46.49791255551463, + "pnl": 46.49791255551463, + "pnlcomm": 46.49791255551463, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11263111652507, + "entry_time": "2023-11-25T00:00:00", + "exit_price": 93.10139698703692, + "exit_time": "2023-11-26T00:00:00", + "gross_pnl": -101.12341294881446, + "pnl": -101.12341294881446, + "pnlcomm": -101.12341294881446, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71015543952899, + "entry_time": "2023-11-28T00:00:00", + "exit_price": 92.47583632063913, + "exit_time": "2023-11-29T00:00:00", + "gross_pnl": -123.43191188898572, + "pnl": -123.43191188898572, + "pnlcomm": -123.43191188898572, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75986386635343, + "entry_time": "2023-12-01T00:00:00", + "exit_price": 94.27037620813209, + "exit_time": "2023-12-02T00:00:00", + "gross_pnl": 151.05123417786643, + "pnl": 151.05123417786643, + "pnlcomm": 151.05123417786643, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44774661355898, + "entry_time": "2023-12-04T00:00:00", + "exit_price": 93.99875783176927, + "exit_time": "2023-12-05T00:00:00", + "gross_pnl": 55.10112182102915, + "pnl": 55.10112182102915, + "pnlcomm": 55.10112182102915, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58344310898, + "entry_time": "2023-12-07T00:00:00", + "exit_price": 94.14439051922356, + "exit_time": "2023-12-08T00:00:00", + "gross_pnl": 56.0947410243557, + "pnl": 56.0947410243557, + "pnlcomm": 56.0947410243557, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.54039819515215, + "entry_time": "2023-12-10T00:00:00", + "exit_price": 92.9236778577475, + "exit_time": "2023-12-11T00:00:00", + "gross_pnl": 38.32796625953563, + "pnl": 38.32796625953563, + "pnlcomm": 38.32796625953563, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05584126819757, + "entry_time": "2023-12-13T00:00:00", + "exit_price": 93.35601781114134, + "exit_time": "2023-12-14T00:00:00", + "gross_pnl": 130.0176542943774, + "pnl": 130.0176542943774, + "pnlcomm": 130.0176542943774, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81351651597147, + "entry_time": "2023-12-16T00:00:00", + "exit_price": 92.84701543791368, + "exit_time": "2023-12-17T00:00:00", + "gross_pnl": 3.349892194221127, + "pnl": 3.349892194221127, + "pnlcomm": 3.349892194221127, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72332949821384, + "entry_time": "2023-12-19T00:00:00", + "exit_price": 92.51107159043487, + "exit_time": "2023-12-20T00:00:00", + "gross_pnl": -21.225790777897657, + "pnl": -21.225790777897657, + "pnlcomm": -21.225790777897657, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91369044105626, + "entry_time": "2023-12-22T00:00:00", + "exit_price": 93.12129104458734, + "exit_time": "2023-12-23T00:00:00", + "gross_pnl": -79.23993964689231, + "pnl": -79.23993964689231, + "pnlcomm": -79.23993964689231, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.14884637460801, + "entry_time": "2023-12-25T00:00:00", + "exit_price": 92.89417488264915, + "exit_time": "2023-12-26T00:00:00", + "gross_pnl": 74.53285080411405, + "pnl": 74.53285080411405, + "pnlcomm": 74.53285080411405, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12845985022912, + "entry_time": "2023-12-28T00:00:00", + "exit_price": 93.6597993052993, + "exit_time": "2023-12-29T00:00:00", + "gross_pnl": 53.133945507018154, + "pnl": 53.133945507018154, + "pnlcomm": 53.133945507018154, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96178874818798, + "entry_time": "2023-12-31T00:00:00", + "exit_price": 94.4511703887473, + "exit_time": "2024-01-01T00:00:00", + "gross_pnl": 48.938164055931566, + "pnl": 48.938164055931566, + "pnlcomm": 48.938164055931566, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.89229345893365, + "entry_time": "2024-01-03T00:00:00", + "exit_price": 94.58860576042824, + "exit_time": "2024-01-04T00:00:00", + "gross_pnl": -30.368769850541355, + "pnl": -30.368769850541355, + "pnlcomm": -30.368769850541355, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.04178116383622, + "entry_time": "2024-01-06T00:00:00", + "exit_price": 94.4578576609693, + "exit_time": "2024-01-07T00:00:00", + "gross_pnl": -58.39235028669236, + "pnl": -58.39235028669236, + "pnlcomm": -58.39235028669236, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.86053478009173, + "entry_time": "2024-01-09T00:00:00", + "exit_price": 94.76430023458303, + "exit_time": "2024-01-10T00:00:00", + "gross_pnl": -9.623454550869326, + "pnl": -9.623454550869326, + "pnlcomm": -9.623454550869326, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8053175522895, + "entry_time": "2024-01-12T00:00:00", + "exit_price": 94.40836408730765, + "exit_time": "2024-01-13T00:00:00", + "gross_pnl": -39.69534649818485, + "pnl": -39.69534649818485, + "pnlcomm": -39.69534649818485, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.85612524977265, + "entry_time": "2024-01-15T00:00:00", + "exit_price": 94.40863693697362, + "exit_time": "2024-01-16T00:00:00", + "gross_pnl": -44.74883127990239, + "pnl": -44.74883127990239, + "pnlcomm": -44.74883127990239, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09196518919535, + "entry_time": "2024-01-18T00:00:00", + "exit_price": 94.91994528712154, + "exit_time": "2024-01-19T00:00:00", + "gross_pnl": -17.201990207381357, + "pnl": -17.201990207381357, + "pnlcomm": -17.201990207381357, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.45747729845408, + "entry_time": "2024-01-21T00:00:00", + "exit_price": 95.40486331313025, + "exit_time": "2024-01-22T00:00:00", + "gross_pnl": -5.261398532383055, + "pnl": -5.261398532383055, + "pnlcomm": -5.261398532383055, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8856295626394, + "entry_time": "2024-01-24T00:00:00", + "exit_price": 95.41673292493975, + "exit_time": "2024-01-25T00:00:00", + "gross_pnl": 53.11033623003567, + "pnl": 53.11033623003567, + "pnlcomm": 53.11033623003567, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.30115153676562, + "entry_time": "2024-01-27T00:00:00", + "exit_price": 94.50993042362319, + "exit_time": "2024-01-28T00:00:00", + "gross_pnl": -79.12211131424272, + "pnl": -79.12211131424272, + "pnlcomm": -79.12211131424272, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8443544450889, + "entry_time": "2024-01-30T00:00:00", + "exit_price": 94.58646684173618, + "exit_time": "2024-01-31T00:00:00", + "gross_pnl": -25.788760335271377, + "pnl": -25.788760335271377, + "pnlcomm": -25.788760335271377, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.51863942815191, + "entry_time": "2024-02-02T00:00:00", + "exit_price": 95.02582579018504, + "exit_time": "2024-02-03T00:00:00", + "gross_pnl": -49.28136379668757, + "pnl": -49.28136379668757, + "pnlcomm": -49.28136379668757, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.64624335712315, + "entry_time": "2024-02-05T00:00:00", + "exit_price": 95.62478266594604, + "exit_time": "2024-02-06T00:00:00", + "gross_pnl": -2.1460691177111357, + "pnl": -2.1460691177111357, + "pnlcomm": -2.1460691177111357, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.97351592845854, + "entry_time": "2024-02-08T00:00:00", + "exit_price": 96.2565162152012, + "exit_time": "2024-02-09T00:00:00", + "gross_pnl": 128.3000286742663, + "pnl": 128.3000286742663, + "pnlcomm": 128.3000286742663, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32379857764127, + "entry_time": "2024-02-11T00:00:00", + "exit_price": 93.96151236382953, + "exit_time": "2024-02-12T00:00:00", + "gross_pnl": -36.228621381174264, + "pnl": -36.228621381174264, + "pnlcomm": -36.228621381174264, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38409820559012, + "entry_time": "2024-02-14T00:00:00", + "exit_price": 94.76791246698865, + "exit_time": "2024-02-15T00:00:00", + "gross_pnl": 38.38142613985269, + "pnl": 38.38142613985269, + "pnlcomm": 38.38142613985269, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.15204268625024, + "entry_time": "2024-02-17T00:00:00", + "exit_price": 94.14536275879573, + "exit_time": "2024-02-18T00:00:00", + "gross_pnl": -100.66799274545133, + "pnl": -100.66799274545133, + "pnlcomm": -100.66799274545133, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92555424660308, + "entry_time": "2024-02-20T00:00:00", + "exit_price": 95.28378367357755, + "exit_time": "2024-02-21T00:00:00", + "gross_pnl": 35.82294269744608, + "pnl": 35.82294269744608, + "pnlcomm": 35.82294269744608, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6447277617356, + "entry_time": "2024-02-23T00:00:00", + "exit_price": 93.94359099606793, + "exit_time": "2024-02-24T00:00:00", + "gross_pnl": -70.11367656676697, + "pnl": -70.11367656676697, + "pnlcomm": -70.11367656676697, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6316942698782, + "entry_time": "2024-02-26T00:00:00", + "exit_price": 93.61709548381037, + "exit_time": "2024-02-27T00:00:00", + "gross_pnl": -101.45987860678218, + "pnl": -101.45987860678218, + "pnlcomm": -101.45987860678218, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99406223655019, + "entry_time": "2024-02-29T00:00:00", + "exit_price": 93.51586581649707, + "exit_time": "2024-03-01T00:00:00", + "gross_pnl": 52.180357994687654, + "pnl": 52.180357994687654, + "pnlcomm": 52.180357994687654, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88355978598187, + "entry_time": "2024-03-03T00:00:00", + "exit_price": 93.59210068726338, + "exit_time": "2024-03-04T00:00:00", + "gross_pnl": 70.85409012815092, + "pnl": 70.85409012815092, + "pnlcomm": 70.85409012815092, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.20766791171343, + "entry_time": "2024-03-06T00:00:00", + "exit_price": 93.03526629028748, + "exit_time": "2024-03-07T00:00:00", + "gross_pnl": -17.240162142594784, + "pnl": -17.240162142594784, + "pnlcomm": -17.240162142594784, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73917319444821, + "entry_time": "2024-03-09T00:00:00", + "exit_price": 93.21019311262798, + "exit_time": "2024-03-10T00:00:00", + "gross_pnl": -52.89800818202366, + "pnl": -52.89800818202366, + "pnlcomm": -52.89800818202366, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87224010683994, + "entry_time": "2024-03-12T00:00:00", + "exit_price": 93.42438731231145, + "exit_time": "2024-03-13T00:00:00", + "gross_pnl": -44.78527945284867, + "pnl": -44.78527945284867, + "pnlcomm": -44.78527945284867, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32218202085551, + "entry_time": "2024-03-15T00:00:00", + "exit_price": 92.84840341954816, + "exit_time": "2024-03-16T00:00:00", + "gross_pnl": -47.37786013073446, + "pnl": -47.37786013073446, + "pnlcomm": -47.37786013073446, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74542752078266, + "entry_time": "2024-03-18T00:00:00", + "exit_price": 93.97099698374726, + "exit_time": "2024-03-19T00:00:00", + "gross_pnl": 22.556946296460012, + "pnl": 22.556946296460012, + "pnlcomm": 22.556946296460012, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5673298293271, + "entry_time": "2024-03-21T00:00:00", + "exit_price": 90.9938401219299, + "exit_time": "2024-03-22T00:00:00", + "gross_pnl": -157.34897073971865, + "pnl": -157.34897073971865, + "pnlcomm": -157.34897073971865, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89305134977978, + "entry_time": "2024-03-24T00:00:00", + "exit_price": 92.62217998545916, + "exit_time": "2024-03-25T00:00:00", + "gross_pnl": -27.087136432062664, + "pnl": -27.087136432062664, + "pnlcomm": -27.087136432062664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36509094658045, + "entry_time": "2024-03-27T00:00:00", + "exit_price": 92.88634389481254, + "exit_time": "2024-03-28T00:00:00", + "gross_pnl": 52.12529482320889, + "pnl": 52.12529482320889, + "pnlcomm": 52.12529482320889, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09706919037085, + "entry_time": "2024-03-30T00:00:00", + "exit_price": 92.26411816919232, + "exit_time": "2024-03-31T00:00:00", + "gross_pnl": -83.29510211785305, + "pnl": -83.29510211785305, + "pnlcomm": -83.29510211785305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87466770876311, + "entry_time": "2024-04-02T00:00:00", + "exit_price": 92.60479889553623, + "exit_time": "2024-04-03T00:00:00", + "gross_pnl": -26.98688132268785, + "pnl": -26.98688132268785, + "pnlcomm": -26.98688132268785, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20308651861096, + "entry_time": "2024-04-05T00:00:00", + "exit_price": 92.03254850546956, + "exit_time": "2024-04-06T00:00:00", + "gross_pnl": -17.053801314139605, + "pnl": -17.053801314139605, + "pnlcomm": -17.053801314139605, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.38853458659054, + "entry_time": "2024-04-08T00:00:00", + "exit_price": 92.15112623454131, + "exit_time": "2024-04-09T00:00:00", + "gross_pnl": -23.740835204922917, + "pnl": -23.740835204922917, + "pnlcomm": -23.740835204922917, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96842409215192, + "entry_time": "2024-04-11T00:00:00", + "exit_price": 91.88812859002927, + "exit_time": "2024-04-12T00:00:00", + "gross_pnl": -8.029550212265235, + "pnl": -8.029550212265235, + "pnlcomm": -8.029550212265235, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24664780939709, + "entry_time": "2024-04-14T00:00:00", + "exit_price": 92.55850895917358, + "exit_time": "2024-04-15T00:00:00", + "gross_pnl": 31.186114977649027, + "pnl": 31.186114977649027, + "pnlcomm": 31.186114977649027, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87161322114831, + "entry_time": "2024-04-17T00:00:00", + "exit_price": 92.00535793552656, + "exit_time": "2024-04-18T00:00:00", + "gross_pnl": -86.62552856217474, + "pnl": -86.62552856217474, + "pnlcomm": -86.62552856217474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.44802861400582, + "entry_time": "2024-04-20T00:00:00", + "exit_price": 93.06090359266081, + "exit_time": "2024-04-21T00:00:00", + "gross_pnl": 61.28749786549861, + "pnl": 61.28749786549861, + "pnlcomm": 61.28749786549861, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86729712174954, + "entry_time": "2024-04-23T00:00:00", + "exit_price": 91.52050959132679, + "exit_time": "2024-04-24T00:00:00", + "gross_pnl": -234.6787530422759, + "pnl": -234.6787530422759, + "pnlcomm": -234.6787530422759, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.61545833641875, + "entry_time": "2024-04-26T00:00:00", + "exit_price": 93.11576558511285, + "exit_time": "2024-04-27T00:00:00", + "gross_pnl": 50.03072486940994, + "pnl": 50.03072486940994, + "pnlcomm": 50.03072486940994, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.83965947403613, + "entry_time": "2024-04-29T00:00:00", + "exit_price": 92.12256163749144, + "exit_time": "2024-04-30T00:00:00", + "gross_pnl": -71.70978365446814, + "pnl": -71.70978365446814, + "pnlcomm": -71.70978365446814, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01797419460767, + "entry_time": "2024-05-02T00:00:00", + "exit_price": 93.19504665832812, + "exit_time": "2024-05-03T00:00:00", + "gross_pnl": 117.70724637204495, + "pnl": 117.70724637204495, + "pnlcomm": 117.70724637204495, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.52501223027797, + "entry_time": "2024-05-05T00:00:00", + "exit_price": 93.70543373709387, + "exit_time": "2024-05-06T00:00:00", + "gross_pnl": -81.95784931840961, + "pnl": -81.95784931840961, + "pnlcomm": -81.95784931840961, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.76145907090127, + "entry_time": "2024-05-08T00:00:00", + "exit_price": 93.99231970762736, + "exit_time": "2024-05-09T00:00:00", + "gross_pnl": 23.086063672609214, + "pnl": 23.086063672609214, + "pnlcomm": 23.086063672609214, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72601264375818, + "entry_time": "2024-05-11T00:00:00", + "exit_price": 94.17294252688178, + "exit_time": "2024-05-12T00:00:00", + "gross_pnl": 144.69298831236017, + "pnl": 144.69298831236017, + "pnlcomm": 144.69298831236017, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66991995260973, + "entry_time": "2024-05-14T00:00:00", + "exit_price": 93.29227941579406, + "exit_time": "2024-05-15T00:00:00", + "gross_pnl": -37.76405368156759, + "pnl": -37.76405368156759, + "pnlcomm": -37.76405368156759, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05260425345361, + "entry_time": "2024-05-17T00:00:00", + "exit_price": 93.08641894302396, + "exit_time": "2024-05-18T00:00:00", + "gross_pnl": 3.3814689570348833, + "pnl": 3.3814689570348833, + "pnlcomm": 3.3814689570348833, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89786622090341, + "entry_time": "2024-05-20T00:00:00", + "exit_price": 93.19281076082636, + "exit_time": "2024-05-21T00:00:00", + "gross_pnl": 29.494453992295178, + "pnl": 29.494453992295178, + "pnlcomm": 29.494453992295178, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00268172437694, + "entry_time": "2024-05-23T00:00:00", + "exit_price": 93.8031782169886, + "exit_time": "2024-05-24T00:00:00", + "gross_pnl": 80.04964926116571, + "pnl": 80.04964926116571, + "pnlcomm": 80.04964926116571, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30303744020942, + "entry_time": "2024-05-26T00:00:00", + "exit_price": 93.96047444085842, + "exit_time": "2024-05-27T00:00:00", + "gross_pnl": -34.25629993510029, + "pnl": -34.25629993510029, + "pnlcomm": -34.25629993510029, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53102238294964, + "entry_time": "2024-05-29T00:00:00", + "exit_price": 93.55135190498416, + "exit_time": "2024-05-30T00:00:00", + "gross_pnl": 2.0329522034515435, + "pnl": 2.0329522034515435, + "pnlcomm": 2.0329522034515435, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73320965755093, + "entry_time": "2024-06-01T00:00:00", + "exit_price": 93.83108861382613, + "exit_time": "2024-06-02T00:00:00", + "gross_pnl": 9.78789562751956, + "pnl": 9.78789562751956, + "pnlcomm": 9.78789562751956, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66116571648418, + "entry_time": "2024-06-04T00:00:00", + "exit_price": 93.37760682748707, + "exit_time": "2024-06-05T00:00:00", + "gross_pnl": 71.64411110028936, + "pnl": 71.64411110028936, + "pnlcomm": 71.64411110028936, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73832896665387, + "entry_time": "2024-06-07T00:00:00", + "exit_price": 93.55125645985115, + "exit_time": "2024-06-08T00:00:00", + "gross_pnl": -18.707250680272125, + "pnl": -18.707250680272125, + "pnlcomm": -18.707250680272125, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05801072220544, + "entry_time": "2024-06-10T00:00:00", + "exit_price": 93.19615016955767, + "exit_time": "2024-06-11T00:00:00", + "gross_pnl": -86.18605526477694, + "pnl": -86.18605526477694, + "pnlcomm": -86.18605526477694, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71612053106102, + "entry_time": "2024-06-13T00:00:00", + "exit_price": 92.35363412291727, + "exit_time": "2024-06-14T00:00:00", + "gross_pnl": -36.24864081437522, + "pnl": -36.24864081437522, + "pnlcomm": -36.24864081437522, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89683728827593, + "entry_time": "2024-06-16T00:00:00", + "exit_price": 93.45394449656699, + "exit_time": "2024-06-17T00:00:00", + "gross_pnl": 55.71072082910575, + "pnl": 55.71072082910575, + "pnlcomm": 55.71072082910575, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64711251538864, + "entry_time": "2024-06-19T00:00:00", + "exit_price": 94.20425342905766, + "exit_time": "2024-06-20T00:00:00", + "gross_pnl": 55.71409136690164, + "pnl": 55.71409136690164, + "pnlcomm": 55.71409136690164, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27286775878677, + "entry_time": "2024-06-22T00:00:00", + "exit_price": 93.11098684044114, + "exit_time": "2024-06-23T00:00:00", + "gross_pnl": -16.188091834563068, + "pnl": -16.188091834563068, + "pnlcomm": -16.188091834563068, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82344576152076, + "entry_time": "2024-06-25T00:00:00", + "exit_price": 93.85991046136218, + "exit_time": "2024-06-26T00:00:00", + "gross_pnl": 3.6464699841417314, + "pnl": 3.6464699841417314, + "pnlcomm": 3.6464699841417314, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76944869834962, + "entry_time": "2024-06-28T00:00:00", + "exit_price": 94.49443525385506, + "exit_time": "2024-06-29T00:00:00", + "gross_pnl": 172.49865555054384, + "pnl": 172.49865555054384, + "pnlcomm": 172.49865555054384, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26714007172913, + "entry_time": "2024-07-01T00:00:00", + "exit_price": 93.55312747617486, + "exit_time": "2024-07-02T00:00:00", + "gross_pnl": -71.40125955542658, + "pnl": -71.40125955542658, + "pnlcomm": -71.40125955542658, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21338289364272, + "entry_time": "2024-07-04T00:00:00", + "exit_price": 93.50082066300278, + "exit_time": "2024-07-05T00:00:00", + "gross_pnl": -71.25622306399322, + "pnl": -71.25622306399322, + "pnlcomm": -71.25622306399322, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2831851440446, + "entry_time": "2024-07-07T00:00:00", + "exit_price": 92.64838687037759, + "exit_time": "2024-07-08T00:00:00", + "gross_pnl": -63.47982736670019, + "pnl": -63.47982736670019, + "pnlcomm": -63.47982736670019, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7216517557643, + "entry_time": "2024-07-10T00:00:00", + "exit_price": 92.97199380174195, + "exit_time": "2024-07-11T00:00:00", + "gross_pnl": -74.96579540223536, + "pnl": -74.96579540223536, + "pnlcomm": -74.96579540223536, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55110234448432, + "entry_time": "2024-07-13T00:00:00", + "exit_price": 92.47254018419862, + "exit_time": "2024-07-14T00:00:00", + "gross_pnl": -107.85621602856992, + "pnl": -107.85621602856992, + "pnlcomm": -107.85621602856992, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.35333984916059, + "entry_time": "2024-07-16T00:00:00", + "exit_price": 92.55290357280875, + "exit_time": "2024-07-17T00:00:00", + "gross_pnl": 19.956372364815422, + "pnl": 19.956372364815422, + "pnlcomm": 19.956372364815422, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.92761668682888, + "entry_time": "2024-07-19T00:00:00", + "exit_price": 92.52405415324874, + "exit_time": "2024-07-20T00:00:00", + "gross_pnl": 59.64374664198573, + "pnl": 59.64374664198573, + "pnlcomm": 59.64374664198573, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01759216619796, + "entry_time": "2024-07-22T00:00:00", + "exit_price": 91.9301791723341, + "exit_time": "2024-07-23T00:00:00", + "gross_pnl": -8.741299386385037, + "pnl": -8.741299386385037, + "pnlcomm": -8.741299386385037, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98789247555584, + "entry_time": "2024-07-25T00:00:00", + "exit_price": 92.13492749804534, + "exit_time": "2024-07-26T00:00:00", + "gross_pnl": 14.703502248950429, + "pnl": 14.703502248950429, + "pnlcomm": 14.703502248950429, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.88900920001714, + "entry_time": "2024-07-28T00:00:00", + "exit_price": 91.63316803265334, + "exit_time": "2024-07-29T00:00:00", + "gross_pnl": -25.58411673637977, + "pnl": -25.58411673637977, + "pnlcomm": -25.58411673637977, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.85577813730865, + "entry_time": "2024-07-31T00:00:00", + "exit_price": 92.25060393364089, + "exit_time": "2024-08-01T00:00:00", + "gross_pnl": 39.48257963322419, + "pnl": 39.48257963322419, + "pnlcomm": 39.48257963322419, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37992029678232, + "entry_time": "2024-08-03T00:00:00", + "exit_price": 91.2161626045396, + "exit_time": "2024-08-04T00:00:00", + "gross_pnl": -16.375769224271153, + "pnl": -16.375769224271153, + "pnlcomm": -16.375769224271153, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94097148564506, + "entry_time": "2024-08-06T00:00:00", + "exit_price": 91.61411385344917, + "exit_time": "2024-08-07T00:00:00", + "gross_pnl": -32.6857632195896, + "pnl": -32.6857632195896, + "pnlcomm": -32.6857632195896, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.26633312852945, + "entry_time": "2024-08-09T00:00:00", + "exit_price": 92.57486927906898, + "exit_time": "2024-08-10T00:00:00", + "gross_pnl": 30.85361505395241, + "pnl": 30.85361505395241, + "pnlcomm": 30.85361505395241, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25460128509323, + "entry_time": "2024-08-12T00:00:00", + "exit_price": 92.93806274853755, + "exit_time": "2024-08-13T00:00:00", + "gross_pnl": -31.653853655568298, + "pnl": -31.653853655568298, + "pnlcomm": -31.653853655568298, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88821464003595, + "entry_time": "2024-08-15T00:00:00", + "exit_price": 92.53437593350753, + "exit_time": "2024-08-16T00:00:00", + "gross_pnl": -35.38387065284212, + "pnl": -35.38387065284212, + "pnlcomm": -35.38387065284212, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.55582558991509, + "entry_time": "2024-08-18T00:00:00", + "exit_price": 92.57746904834741, + "exit_time": "2024-08-19T00:00:00", + "gross_pnl": 2.1643458432322404, + "pnl": 2.1643458432322404, + "pnlcomm": 2.1643458432322404, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35186779566517, + "entry_time": "2024-08-21T00:00:00", + "exit_price": 93.8222066824917, + "exit_time": "2024-08-22T00:00:00", + "gross_pnl": 47.0338886826525, + "pnl": 47.0338886826525, + "pnlcomm": 47.0338886826525, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33239215677628, + "entry_time": "2024-08-24T00:00:00", + "exit_price": 92.65684927729922, + "exit_time": "2024-08-25T00:00:00", + "gross_pnl": -67.55428794770637, + "pnl": -67.55428794770637, + "pnlcomm": -67.55428794770637, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07995330778445, + "entry_time": "2024-08-27T00:00:00", + "exit_price": 93.14274907856505, + "exit_time": "2024-08-28T00:00:00", + "gross_pnl": 6.279577078059617, + "pnl": 6.279577078059617, + "pnlcomm": 6.279577078059617, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.31638915313648, + "entry_time": "2024-08-30T00:00:00", + "exit_price": 92.80125655346451, + "exit_time": "2024-08-31T00:00:00", + "gross_pnl": -151.5132599671972, + "pnl": -151.5132599671972, + "pnlcomm": -151.5132599671972, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86908900365832, + "entry_time": "2024-09-02T00:00:00", + "exit_price": 92.43258549076677, + "exit_time": "2024-09-03T00:00:00", + "gross_pnl": -43.6503512891548, + "pnl": -43.6503512891548, + "pnlcomm": -43.6503512891548, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7418385386059, + "entry_time": "2024-09-05T00:00:00", + "exit_price": 93.04661736537737, + "exit_time": "2024-09-06T00:00:00", + "gross_pnl": 30.477882677146795, + "pnl": 30.477882677146795, + "pnlcomm": 30.477882677146795, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.18409149189988, + "entry_time": "2024-09-08T00:00:00", + "exit_price": 92.27288236124933, + "exit_time": "2024-09-09T00:00:00", + "gross_pnl": 108.87908693494524, + "pnl": 108.87908693494524, + "pnlcomm": 108.87908693494524, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66757472286285, + "entry_time": "2024-09-11T00:00:00", + "exit_price": 91.66108329653197, + "exit_time": "2024-09-12T00:00:00", + "gross_pnl": -100.64914263308822, + "pnl": -100.64914263308822, + "pnlcomm": -100.64914263308822, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0113429588981, + "entry_time": "2024-09-14T00:00:00", + "exit_price": 92.01542580767834, + "exit_time": "2024-09-15T00:00:00", + "gross_pnl": 100.40828487802429, + "pnl": 100.40828487802429, + "pnlcomm": 100.40828487802429, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87145951112797, + "entry_time": "2024-09-17T00:00:00", + "exit_price": 91.58043482842866, + "exit_time": "2024-09-18T00:00:00", + "gross_pnl": 70.89753173006983, + "pnl": 70.89753173006983, + "pnlcomm": 70.89753173006983, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28456359684716, + "entry_time": "2024-09-20T00:00:00", + "exit_price": 91.42689177563531, + "exit_time": "2024-09-21T00:00:00", + "gross_pnl": 114.23281787881479, + "pnl": 114.23281787881479, + "pnlcomm": 114.23281787881479, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.10394740945229, + "entry_time": "2024-09-23T00:00:00", + "exit_price": 91.5888902773369, + "exit_time": "2024-09-24T00:00:00", + "gross_pnl": 148.49428678846124, + "pnl": 148.49428678846124, + "pnlcomm": 148.49428678846124, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05233318851361, + "entry_time": "2024-09-26T00:00:00", + "exit_price": 91.20379964517136, + "exit_time": "2024-09-27T00:00:00", + "gross_pnl": 15.146645665774372, + "pnl": 15.146645665774372, + "pnlcomm": 15.146645665774372, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93054848304011, + "entry_time": "2024-09-29T00:00:00", + "exit_price": 91.4470753529935, + "exit_time": "2024-09-30T00:00:00", + "gross_pnl": 51.652686995338115, + "pnl": 51.652686995338115, + "pnlcomm": 51.652686995338115, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55093725008568, + "entry_time": "2024-10-02T00:00:00", + "exit_price": 90.1771270171211, + "exit_time": "2024-10-03T00:00:00", + "gross_pnl": -137.3810232964587, + "pnl": -137.3810232964587, + "pnlcomm": -137.3810232964587, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51951955539236, + "entry_time": "2024-10-05T00:00:00", + "exit_price": 90.35054775405881, + "exit_time": "2024-10-06T00:00:00", + "gross_pnl": -16.897180133355505, + "pnl": -16.897180133355505, + "pnlcomm": -16.897180133355505, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20200706252784, + "entry_time": "2024-10-08T00:00:00", + "exit_price": 91.07198645570766, + "exit_time": "2024-10-09T00:00:00", + "gross_pnl": -13.002060682018168, + "pnl": -13.002060682018168, + "pnlcomm": -13.002060682018168, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.13850851279538, + "entry_time": "2024-10-11T00:00:00", + "exit_price": 90.2608758916971, + "exit_time": "2024-10-12T00:00:00", + "gross_pnl": -87.76326210982859, + "pnl": -87.76326210982859, + "pnlcomm": -87.76326210982859, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93035699558081, + "entry_time": "2024-10-14T00:00:00", + "exit_price": 90.52157669994283, + "exit_time": "2024-10-15T00:00:00", + "gross_pnl": -40.87802956379818, + "pnl": -40.87802956379818, + "pnlcomm": -40.87802956379818, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49395863364698, + "entry_time": "2024-10-17T00:00:00", + "exit_price": 89.86316250689507, + "exit_time": "2024-10-18T00:00:00", + "gross_pnl": -63.079612675191754, + "pnl": -63.079612675191754, + "pnlcomm": -63.079612675191754, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.18352844268802, + "entry_time": "2024-10-20T00:00:00", + "exit_price": 88.93546496698286, + "exit_time": "2024-10-21T00:00:00", + "gross_pnl": -124.80634757051519, + "pnl": -124.80634757051519, + "pnlcomm": -124.80634757051519, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.8113095296125, + "entry_time": "2024-10-23T00:00:00", + "exit_price": 89.54696410392557, + "exit_time": "2024-10-24T00:00:00", + "gross_pnl": -26.43454256869262, + "pnl": -26.43454256869262, + "pnlcomm": -26.43454256869262, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.0801204143829, + "entry_time": "2024-10-26T00:00:00", + "exit_price": 89.23016998477505, + "exit_time": "2024-10-27T00:00:00", + "gross_pnl": 15.004957039214162, + "pnl": 15.004957039214162, + "pnlcomm": 15.004957039214162, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.84774198158706, + "entry_time": "2024-10-29T00:00:00", + "exit_price": 89.88558944915762, + "exit_time": "2024-10-30T00:00:00", + "gross_pnl": 3.784746757055757, + "pnl": 3.784746757055757, + "pnlcomm": 3.784746757055757, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52000332438061, + "entry_time": "2024-11-01T00:00:00", + "exit_price": 88.86871340352687, + "exit_time": "2024-11-02T00:00:00", + "gross_pnl": 34.87100791462581, + "pnl": 34.87100791462581, + "pnlcomm": 34.87100791462581, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.58373696827199, + "entry_time": "2024-11-04T00:00:00", + "exit_price": 88.82208371804109, + "exit_time": "2024-11-05T00:00:00", + "gross_pnl": -76.1653250230907, + "pnl": -76.1653250230907, + "pnlcomm": -76.1653250230907, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32832910147937, + "entry_time": "2024-11-07T00:00:00", + "exit_price": 89.06529443738525, + "exit_time": "2024-11-08T00:00:00", + "gross_pnl": -26.303466409412124, + "pnl": -26.303466409412124, + "pnlcomm": -26.303466409412124, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45977666376373, + "entry_time": "2024-11-10T00:00:00", + "exit_price": 89.24686599676619, + "exit_time": "2024-11-11T00:00:00", + "gross_pnl": -121.29106669975442, + "pnl": -121.29106669975442, + "pnlcomm": -121.29106669975442, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21043430906948, + "entry_time": "2024-11-13T00:00:00", + "exit_price": 88.4518561142622, + "exit_time": "2024-11-14T00:00:00", + "gross_pnl": -75.8578194807285, + "pnl": -75.8578194807285, + "pnlcomm": -75.8578194807285, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.80819601768098, + "entry_time": "2024-11-16T00:00:00", + "exit_price": 88.9586155221746, + "exit_time": "2024-11-17T00:00:00", + "gross_pnl": 15.041950449361252, + "pnl": 15.041950449361252, + "pnlcomm": 15.041950449361252, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.14254378792333, + "entry_time": "2024-11-19T00:00:00", + "exit_price": 88.6718045936633, + "exit_time": "2024-11-20T00:00:00", + "gross_pnl": -47.073919426003386, + "pnl": -47.073919426003386, + "pnlcomm": -47.073919426003386, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.3689677842857, + "entry_time": "2024-11-22T00:00:00", + "exit_price": 88.87620295869029, + "exit_time": "2024-11-23T00:00:00", + "gross_pnl": -49.276482559541535, + "pnl": -49.276482559541535, + "pnlcomm": -49.276482559541535, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.06997514477665, + "entry_time": "2024-11-25T00:00:00", + "exit_price": 88.79230048470953, + "exit_time": "2024-11-26T00:00:00", + "gross_pnl": -27.767466006712027, + "pnl": -27.767466006712027, + "pnlcomm": -27.767466006712027, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.69842658289039, + "entry_time": "2024-11-28T00:00:00", + "exit_price": 88.84366945841847, + "exit_time": "2024-11-29T00:00:00", + "gross_pnl": -85.47571244719165, + "pnl": -85.47571244719165, + "pnlcomm": -85.47571244719165, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75521347785289, + "entry_time": "2024-12-01T00:00:00", + "exit_price": 89.14459057740478, + "exit_time": "2024-12-02T00:00:00", + "gross_pnl": -61.06229004481065, + "pnl": -61.06229004481065, + "pnlcomm": -61.06229004481065, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.78540826994568, + "entry_time": "2024-12-04T00:00:00", + "exit_price": 89.0389294134589, + "exit_time": "2024-12-05T00:00:00", + "gross_pnl": 25.35211435132254, + "pnl": 25.35211435132254, + "pnlcomm": 25.35211435132254, + "size": 100 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.11917253451473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.54841534502786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.03201587878578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.94550278474797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.67183298908238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.86549713479145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.19160897741419, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.48697641782272, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.74505140134526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.43249701182592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36317339817481, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.3184784020995, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.59194698786014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.21300773889088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.93323693635863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.01041702546699, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.12882215455511, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82503838919212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.20974209562837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.28418162139361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.91262465479313, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.47079432451613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.41396612142576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.74208634353057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96112016066533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.14757933275934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.33794797010773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.95774776632322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.39809150990904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.29624163714647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.98044425919083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.71415014911958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.68703409584347, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.19660477578049, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.09913803201934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.13975001075532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.7525000464393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67014960303162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.16172259245428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.99277550738104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.726000665382, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.27597137389321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.96674656359579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01407453019127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.01883446140224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.33686580554885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.61379453469056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.44418682978016, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.1261570487614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.90367229199478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.48715448535594, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.53898885220806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.13695584567007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.74920846022493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.28346179234327, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.39446913633991, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.38048314487808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.86853857797571, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.78335766752544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.08258048792489, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.04409706752067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.00584315640894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17754603801194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.91386750387461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.07278397148802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.84957817071898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.66685696016805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.29703959359377, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.16284479663989, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.59827392536462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.02427769637677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.02034152325665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.10227360972624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.55074957264794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.4752285310497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.78482968977629, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.64550269913406, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.75829920829567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.28405624956508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.40750734980367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.9736108084372, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.11719582995507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.4244273841596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.46803368609852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.65390080108091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.55529329412784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.84475344760442, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.34547532849058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.83286932713185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.1414110724743, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.70880723169135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.37107171120154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17212988349165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.88968353827181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17974473578754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.64495810760246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86042757757674, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.42922022261914, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.67123710700702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.1262468099545, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.99803204217791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.0746490327229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.68852164950059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.90683245619206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.69867095887889, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.58028409299915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.78930171959787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.44349309161046, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.63928948741085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.8801021064717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.88804895153031, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.9129584357738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.35911188288489, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.55107978610341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.24566283787111, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.50854335078685, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85972377687798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.94180161552265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.42256786175979, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39260868907034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.47598985042309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.2217481384577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43771261461686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25556396259081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.27520136851216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.22895283520214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84721164221584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.21690016032666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.98012439288168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42241300564716, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5234973647714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.84780174120549, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.78357735159078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5180376571157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.07885735340791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.46287786089891, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.7806750796624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.99007562374577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.3160405598432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.69515591162462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.9307950005457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.49497584845733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.05277773908539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.63017059410102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.95560584181007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.85704345214471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.34581983849665, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.55148937480453, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.83406196186097, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.25669377064881, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.51637945271536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.57103396676897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43830185841739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.4155507445711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.92267680402585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.75883349843212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.974264479532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.70988332181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.21365266173218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.08294324004585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11928874045202, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31180164071337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.00054275724281, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.65255133629894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96503242935937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.79138811772025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.47378044689604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31284487928606, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.73200506980342, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.3363427106496, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.56611574901736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.13272204200155, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.89963627791985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.38755792776327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.35474381234252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.97868642263799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.11962753041762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25728100943367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.076645155786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.1361736846976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.95761891143941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.38251520181134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.58405172820402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.1825648349693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31778631274507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.92748490697555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11485299409067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.46828746700024, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.7892083341232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.2850707768965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.61528686513479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.16045065160826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98923853245553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.78083136801966, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98736762370623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.41242668783207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.7821059253462, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.01676230346942, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.90986422948514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.85698353324744, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.72982041802001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.60761748093444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.0385605171193, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.09198940082088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.21597248424331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.490691270523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.2706953210234, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.23704650718707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.30522444084696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.82731858826378, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.91407429365688, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5460351903365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.93028933684711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0553633238757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.47484452500944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.10094020807114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.01428360585088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.38292648890776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.48513559668872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.27497370614257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.14886606297294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.29611163730506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.23350982317787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.79948982072462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98472225444857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.71079305814114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.3396263042363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.98172498582129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.42795373397291, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.6321305493393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.76479352938595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.48958247666039, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.73111789636548, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.61885876679554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.85401562603096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.49175141105385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.84289871423181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.99377199128872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.76186428614056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.48850513355184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.12395315196963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.53863571252707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.6026762767146, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.09752132137899, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.49274636123849, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.82226372897985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.79148532437996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.11483711173116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.80033950220172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.63729064888537, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.11575917668634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.28032546622858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.53344904132359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.29557459823668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.01730754421833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.07935604760307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.79620422510413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.24797305894252, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.19373825703377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.40514794332339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.55648566288775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.55716667120137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.91494018138198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.48501201892987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.90008526748946, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.83721845974864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.26504549069784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.06840340797214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.26053581327312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.42454996605802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94825682250637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.05109746301979, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.1969266603545, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.27193710609464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.97039812035842, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.34802647272141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.07904244701469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.79316819026657, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.5721771606179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.6253449835299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88599336671724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9167314813735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.23555143341264, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69172330670986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.40326355089037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.32320287324674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.32022315669315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.22613575397045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.08195298394907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.5883765126535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6323490375275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.0747399163529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.55723413541229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.78282068603487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.66145085922012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.46346097050873, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.00404625454874, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.66092881844988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.49919123199935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.97621398907071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.41257974165285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.05124864668421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01899188310071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.2559389154428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.12609495739093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25576346468043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.47050530514431, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72410136704386, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19884636287922, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86432033375576, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34050558738045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.10587138419956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72930751574246, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2563942182136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59980860135867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.54277270362402, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92591784638046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.14258894906092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11423308566697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03147452036931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.97245173381131, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.49318704896336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68468709145579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32003795658395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26674166444458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26630934814936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.4153331981033, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36350758058099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.16332285120929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34043899579565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74219820454567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.55413171456674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.58180279933771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02408626223293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87657341045227, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.55590567361484, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.08074161986468, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.80457382221171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8131686939551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.25793142134573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95253144170447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14743781912107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8783564574023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.9764387193147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.94516537050167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89603764932446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.63800292429943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.24337208101042, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59556244009269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28446378378608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13025499622808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.23383791902404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3328854638381, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96067846320523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.94965457520627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.16625059748041, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.8269642033066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.81310669049036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2555442210953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45622372930102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.83947343135847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43135259957857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.53295655650527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78816229160894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9413213129086, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.40648296911729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.30279435197399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.65263067129818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.8239628759463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.7795218814571, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36068460994301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.47451059527033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.09791235411565, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64232209133355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9960341944844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.86057544771678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03722443992689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02540027670304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23831571579666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61642884685872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9587336040414, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78520963834742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.12207131713245, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.030634236321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2580641252632, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57471719502651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.16033087447512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64298714231596, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75555986268627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29534460790408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8204301569652, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.34161824742394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.61753779742976, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15624068230731, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.25917455813928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5936848786624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.98045633035186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98797939638727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35827005631805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.69155799194061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68091309416992, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70456318827733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16469231313611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8799099382491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11566093967609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.80161139315015, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.15377445359951, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15715297991916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86962603101973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72926386277882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1579385275225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74116822603294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.31971390482752, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20782644697857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01885490875779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42230012835577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.99288411883724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.082184046767, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.85101362331126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98564664788431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86959357102904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20013868958425, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84924924581607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31289310035527, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30858201402589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.99373607498532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.18572768435918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.33439114940059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07429869254726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04790943044297, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64069907229371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26235855896988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.50379403067527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43691170957882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.37005197510278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.27057437223934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.09337235241868, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71128565229746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02883456195461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80490335979458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9287597961482, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.17470692964342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2493152678643, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60050033989026, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09469925407369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3111349289259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18816369089684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42938460793316, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.41602741852829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.42310978968692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50953693273829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33123427861662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96020937715257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.53068640749544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5609164087555, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89910933295498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.4272707886787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.19572149206287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68137345397398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.48011498833463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73481537380023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9817766831428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62422399002075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.25402747101043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78794113614683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51565520344022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81994141877884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.73569183010366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89304084668578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.94563028017612, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.70380536433252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.18321579529317, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75634960957339, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.99346542277752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07784715364147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82473368702337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80939097372557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.56855092683492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.22637736311736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.04989016451177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06688407845617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11481000895263, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27282277875311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.10549027383173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.02590143870165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.0111357952797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36789726372409, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.16759918928896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.02364437811006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64247835816664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.20232839714718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51418676739564, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81320041849361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27166607324205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2545983932022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97497228207648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.67780842750179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.45906966920411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76345480442126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.43197465037622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3600604543369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44350843545416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39757672508603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.85230151275863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.81407145534195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01128875382821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.67591197573066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.51279666702179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.98461279621962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.18776220832692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68365711276127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52965334263803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.97018528191016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.1704075246973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.4092834971355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.80397108470675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.7224658447326, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.15638220769824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.66063113797075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.93674170823937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.02426166276656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2868521233569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.06798590582005, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.35136606041436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.99746534424483, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.56303029535638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.0942536160811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.42070005109457, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.41089068186189, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.18677881527823, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43901544778934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.5260369404649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.01177208564718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.36159823018748, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8208251198108, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28071492977152, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9250036260453, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6150063093046, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.61363931969464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.38004154259693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.96467806287603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70041523761671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.62074541364396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.95651159207543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05267669381955, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.69416855510607, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8695133244266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.61012799594212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.05464751490084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.46681240023963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.63067407291008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.96046847840074, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56273021751427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.14638715063298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.75859326793318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97823499949781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.15637756363428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.71453147899727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.00941330347686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97249110306038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.44900384555615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.26380626108603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.9389490074607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91676356991597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.13685393625028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92025914672816, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.9636459548143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.9470309766908, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23464868145118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.16095300836626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.86371979002092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1658806519524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.80999909964301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.3916052906719, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79830122498419, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.92464426243117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74084404129732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77591195761288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.129082151163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.29443539538282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.49821093674116, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.52895961614624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.50773769923417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.20586243304412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.1593251595947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.8652392547076, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.88148378297518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.54298539634833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.97268456538903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.62712854780935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.74146887774299, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.42853595632805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.84848168731004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.83668379255865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.47241973433749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.89842730786603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.82455441317694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.16986826544031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.1811588929617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.09911654611165, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.55257557802233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6008717295654, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.68671023186488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.96517472835333, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.05260562521785, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.08006582461334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.79432064186736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.41108821991375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87347025830266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.20564533828777, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.30309517181773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1406611037728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.24392591685461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.10896639776044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43429707485602, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.99823744300166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.51160983247296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.15695774047701, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.25313076740179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.3503914171167, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47393608345517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.98751697992218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.0545116492653, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01799823084976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05081241841744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.31407916672543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.80885265421585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.15205975168703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47241880815605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54172600484964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.8976774720573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58791087448299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.02271267015783, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.10459083951521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24414870008319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69109127617371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.65306278042236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.39816620647916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1810606061523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.49470462633181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01504374556126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.67904663244455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74908045175502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.28081352108578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72430502818085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91000509633356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0266388958905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06932306108122, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2669116718157, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31911690207038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.01378736632232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69057272581715, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86605080021333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.54829275642138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92761316198515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07281692163534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2809228591007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.11130793179962, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.78210365621943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99114272050637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26603620619441, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.26895473010688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88756691851471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90535085923925, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.86627784439669, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.27678234231546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21120724189035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.62182381785365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.70089986040492, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98061841891752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.63730668221625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.21809213108293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62513446883317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.0550792423482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71116560219859, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.70112878957045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.22008595203475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.26583380518775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84031644841893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.76253265375746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.36921450181964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38751561741323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.7594276079707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20505090808615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01993010545006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25253006691226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.9292129294191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.45831791808807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01874761761506, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.70179579177142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.45782648578765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.9654506293958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.69543160906309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.23626703373414, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.23730582460071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.58630669240723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.24411442253736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80412345904836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.33266826608637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08584208568091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.20511704388718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73586252939168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6229802242446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66558700926207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74677062129318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.54017463980657, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.730138438308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.49572076787184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77203615539878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91635203682458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.91294155802173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.85493736088272, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07037492573126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35918129576551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21752684184962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82182795562746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.91554181329224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2637454877203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42377971468683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.9956096009709, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95024629295155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.02384747382928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.73848563922941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78634727970504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.46503843997183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.75198886376967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.39876122857235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.11567284541557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.77091533493147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3485194106044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.04122370969267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97807111210727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.82297627909733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88908258807695, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.02494822567454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52813633390632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.77607586946252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84906975105618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10682536410768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60098332710814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16477240647922, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64464350405021, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.34853961981467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.90164291858915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52920571661875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96718442791747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1449985691514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.09214526901171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08808617199072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.57735843418071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.03374091329063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.67153521214688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90721494360177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94800270723887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77341143396697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.16810608211969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1295561924666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6109897663897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09160273927316, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33166346007059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53620789150742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21568894504843, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93343913761625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02299067534886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18544500815403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98907937476646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.45348785433026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02085687929099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84830391916218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43699045607909, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.95759166912262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.47551491598016, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.66498305754212, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36643618283398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3496449568648, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06229907806569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93784310790696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96780942003683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88445131540618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08186481058257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.20796655389181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9654081254928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49393791749024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05007592523164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.84518996211608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.32190345568543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32827178627502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26562867244172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9489490131078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.54756230484855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52695826109523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.16120912048845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73109278013733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.12967158946792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66144197243285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35105870140517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32497954050243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.404028525945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5596224194739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06373732644884, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.82924854494932, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63616550173667, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.79933273190036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.95120755426662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.56403816854014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35426808914588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35865607168631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.90482034285156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9985787957225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8768940380532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86502942650776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82867955654159, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06669061925808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.05805100493505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19478081630376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.4726753044577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87741920594638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.47630925649874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.67940992744533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83387030747774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.77541066961662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21806909335821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2116719393634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.63189068076446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.31676028980675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96917376263126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.3332407570871, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.63597205774145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00130198273087, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05926832590498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.76190103073331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.24963627943364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.73904226779082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.53198582108524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29391446442062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.60323551607766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.17535379161295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.95745054254392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.65432843266518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.33856790601594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.36956060356385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.2507487739047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.98092766917739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.16338627425559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.95283790294347, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.37363985497257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.41734797456819, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46879833485087, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.89779171625212, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.56566914846213, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.12295330761387, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.47229523041987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01642931045993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.97899403484826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.29040521639678, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.62958711128005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94114223449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38592136937638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.493222435549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3474523152517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.84805377401344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.24313248176318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.23716867785055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3344550507391, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.25058017257405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26148603669161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.78124566715694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.30392352510412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05471403229689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26889976544973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.97149252732743, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.49652862514738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49761686858754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96133483843103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60373115569557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43278823558683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.216186422251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.22790913521419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5392105794396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3857390941578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0337408175209, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.39823678210567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08940418013472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65920217896303, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.39853539402684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.65048655775455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.79873760769597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.68828575617101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87251964203307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5300255114375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.79086592344467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57270931229704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88859692291733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.80271734344691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04073002158317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46828834544144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.23692924750448, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43771978777833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09517649815284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.97835234626153, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79133291522645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02945945000636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.45235296621496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.63061442838703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1729530420449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58327824763774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53629152727201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.30651397849368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69842586893596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.16248763742118, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49605102540508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25313944944546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8421663218519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97561455613513, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.01878568439928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7731623418128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3031103300392, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82895908639827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.34460637435383, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.32181327562058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.52607935640549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2357948297768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.68746434551585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58592175261929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.4669708006904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.654447961068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3612670935331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01031054901587, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.37919304454006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.41169786096938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.29381617044329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70386499802939, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.42981226133158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13311787546733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.41698336938475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.39366908316057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89356698837386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.60226357609555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.41574363121151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77307124686526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.32527272706531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02617500869306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.94533987249052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0185892574846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.30963127571127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.25489319248068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74391567498765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20889480054281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11263111652507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.10139698703692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71015543952899, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.47583632063913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75986386635343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.27037620813209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.44774661355898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.99875783176927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.58344310898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.14439051922356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.54039819515216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.9236778577475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.05584126819757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35601781114134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.81351651597147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84701543791368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.72332949821384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51107159043487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.91369044105626, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.12129104458734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.14884637460803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89417488264915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.12845985022912, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6597993052993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.96178874818798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.4511703887473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.89229345893365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.58860576042824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.04178116383622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.4578576609693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.86053478009173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.76430023458303, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.8053175522895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40836408730765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.85612524977265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40863693697362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.09196518919534, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.91994528712154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.4574772984541, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.40486331313025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.8856295626394, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.41673292493975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.3011515367656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.50993042362319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.8443544450889, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.58646684173618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.51863942815191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02582579018504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.64624335712315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.62478266594604, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.97351592845855, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.2565162152012, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.32379857764126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96151236382953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.38409820559012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.76791246698865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.15204268625024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.14536275879573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.92555424660308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28378367357755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6447277617356, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94359099606793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.63169426987818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61709548381037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99406223655019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.51586581649707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88355978598187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.59210068726338, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.20766791171343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03526629028748, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73917319444821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21019311262798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87224010683995, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.42438731231145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32218202085551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84840341954816, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74542752078266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.97099698374726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5673298293271, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.9938401219299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.89305134977978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.62217998545916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36509094658045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88634389481254, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09706919037085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.26411816919232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87466770876313, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60479889553623, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.20308651861096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.03254850546956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.38853458659054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15112623454131, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.96842409215192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.88812859002927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24664780939709, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.55850895917358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87161322114831, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.00535793552656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.4480286140058, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06090359266081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86729712174954, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.52050959132679, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.61545833641877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11576558511285, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.83965947403613, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.12256163749144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01797419460767, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19504665832812, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.52501223027797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70543373709387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.76145907090128, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.99231970762736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.72601264375818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.17294252688178, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.66991995260973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29227941579406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.05260425345361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.08641894302396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.89786622090341, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19281076082636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.00268172437694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8031782169886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30303744020942, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96047444085842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53102238294964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55135190498416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73320965755092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83108861382613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66116571648418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37760682748707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73832896665387, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55125645985115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05801072220544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19615016955767, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71612053106102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35363412291727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.89683728827593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.45394449656699, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64711251538863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20425342905766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27286775878677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11098684044114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.82344576152076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.85991046136218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.76944869834962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.49443525385506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26714007172914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55312747617486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21338289364272, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.50082066300278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2831851440446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64838687037759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7216517557643, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97199380174195, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.55110234448432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.47254018419862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.35333984916058, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.55290357280875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.92761668682888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52405415324874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01759216619796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9301791723341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.98789247555584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.13492749804534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.88900920001714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.63316803265334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.85577813730865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.25060393364089, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37992029678232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.2161626045396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.94097148564505, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61411385344917, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.26633312852945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57486927906898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.25460128509323, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.93806274853755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88821464003595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53437593350753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5558255899151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57746904834741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35186779566517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8222066824917, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.33239215677628, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65684927729922, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07995330778445, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14274907856505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.31638915313647, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.80125655346451, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86908900365832, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43258549076677, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74183853860589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.04661736537737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.18409149189986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27288236124933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66757472286284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.66108329653197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.0113429588981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.01542580767834, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87145951112795, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58043482842866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.28456359684716, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.42689177563531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.10394740945229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.5888902773369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05233318851363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.20379964517136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93054848304011, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.4470753529935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.55093725008568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1771270171211, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.51951955539236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.35054775405881, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.20200706252784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.07198645570766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.13850851279538, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.2608758916971, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93035699558081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.52157669994283, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.49395863364698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.86316250689507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.18352844268802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93546496698286, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.8113095296125, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.54696410392557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.08012041438292, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.23016998477505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.84774198158706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.88558944915762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.52000332438061, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.86871340352687, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.58373696827199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.82208371804109, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.32832910147938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.06529443738525, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.45977666376373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.24686599676619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.21043430906948, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.4518561142622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.80819601768098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.9586155221746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.14254378792333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.6718045936633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.3689677842857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.87620295869029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.06997514477666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.79230048470953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.69842658289039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.84366945841847, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.75521347785288, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.14459057740478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.78540826994568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.0389294134589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.11917253451473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.54841534502786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.03201587878578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94550278474797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.67183298908238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86549713479145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.1916089774142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48697641782272, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.74505140134526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.4324970118259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36317339817481, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3184784020995, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.59194698786014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21300773889088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.93323693635863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.01041702546699, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.12882215455511, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82503838919212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20974209562837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28418162139361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91262465479312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47079432451613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41396612142576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.74208634353057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96112016066532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.14757933275934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.33794797010775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95774776632322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.39809150990905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29624163714647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.98044425919083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71415014911958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68703409584346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.19660477578049, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.09913803201934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13975001075532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7525000464393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67014960303162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.16172259245428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.99277550738105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.726000665382, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27597137389321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.96674656359579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01407453019127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01883446140224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.33686580554885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.61379453469056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44418682978015, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.1261570487614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.90367229199477, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.48715448535594, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.53898885220806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.13695584567007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.74920846022492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28346179234327, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.39446913633991, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.38048314487808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8685385779757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.78335766752544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.08258048792487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.04409706752067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.00584315640894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17754603801194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91386750387461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.07278397148802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.84957817071898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.66685696016805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.29703959359377, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.16284479663989, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.59827392536462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02427769637677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02034152325665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.10227360972624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.55074957264794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4752285310497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.78482968977629, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.64550269913406, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.75829920829567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.28405624956507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.40750734980367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.9736108084372, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.11719582995507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.42442738415961, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.46803368609852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.65390080108091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.55529329412784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.84475344760442, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.34547532849058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.83286932713185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.1414110724743, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.70880723169135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.37107171120152, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17212988349165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88968353827183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17974473578754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.64495810760246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86042757757674, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.42922022261914, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67123710700702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.1262468099545, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99803204217791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.0746490327229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68852164950059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.90683245619206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.6986709588789, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.58028409299915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78930171959787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44349309161048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.63928948741085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.8801021064717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.88804895153031, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9129584357738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.35911188288487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.55107978610341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.24566283787111, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.50854335078685, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85972377687798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94180161552265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42256786175977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39260868907034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47598985042309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2217481384577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43771261461684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.2555639625908, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27520136851216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.22895283520215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84721164221584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.21690016032666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.98012439288168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42241300564716, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.52349736477139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8478017412055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78357735159078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5180376571157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07885735340791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46287786089891, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7806750796624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.99007562374577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3160405598432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.69515591162462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.9307950005457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.49497584845733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.05277773908537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.63017059410102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95560584181007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.85704345214472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.34581983849665, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.55148937480453, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.83406196186097, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.25669377064882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.51637945271536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.57103396676898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4383018584174, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4155507445711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.92267680402585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.75883349843212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.974264479532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.70988332181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21365266173217, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.08294324004584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11928874045203, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31180164071337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.00054275724283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.65255133629894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96503242935937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79138811772026, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.47378044689603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31284487928606, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.73200506980342, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3363427106496, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.56611574901736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.13272204200155, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.89963627791985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.38755792776327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.35474381234252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.97868642263798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.11962753041762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25728100943367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.076645155786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13617368469758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9576189114394, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.38251520181134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.58405172820402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.18256483496931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31778631274507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.92748490697555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11485299409067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.46828746700025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.7892083341232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.2850707768965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.61528686513479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16045065160826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98923853245553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.78083136801966, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98736762370623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41242668783207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7821059253462, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.01676230346942, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.90986422948514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85698353324744, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.72982041802001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60761748093444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0385605171193, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.09198940082088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21597248424331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.490691270523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2706953210234, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.23704650718707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.30522444084696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.82731858826376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91407429365688, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5460351903365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93028933684711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0553633238757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47484452500944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.10094020807114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01428360585086, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.38292648890776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48513559668872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.27497370614257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.14886606297294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.29611163730506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.23350982317787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.79948982072462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98472225444857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.71079305814114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3396263042363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98172498582129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.42795373397291, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.6321305493393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.76479352938595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48958247666037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.73111789636546, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.61885876679554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.85401562603096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.49175141105384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.84289871423181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.99377199128872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.76186428614056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.48850513355184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.12395315196963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.53863571252707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.6026762767146, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.09752132137899, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.4927463612385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.82226372897985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.79148532437995, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.11483711173116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.80033950220171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63729064888537, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.11575917668634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.28032546622858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.53344904132358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.29557459823668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.01730754421833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07935604760307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.79620422510413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.24797305894252, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.19373825703377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.40514794332339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.55648566288775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.55716667120137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.91494018138197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.48501201892987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.90008526748947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.83721845974864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26504549069784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.06840340797214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26053581327312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.42454996605802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94825682250638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05109746301977, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.1969266603545, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.27193710609464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.97039812035842, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.34802647272141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.07904244701469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.79316819026657, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.5721771606179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.6253449835299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88599336671724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9167314813735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.23555143341264, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69172330670986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40326355089037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32320287324674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32022315669313, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.22613575397045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.08195298394907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5883765126535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6323490375275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0747399163529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.55723413541229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.78282068603487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66145085922012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.46346097050873, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.00404625454874, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.66092881844989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.49919123199933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.97621398907071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41257974165285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05124864668421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01899188310071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2559389154428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.12609495739092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25576346468043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4705053051443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72410136704386, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19884636287924, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86432033375576, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34050558738045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10587138419956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72930751574246, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25639421821361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59980860135867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.54277270362404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92591784638046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14258894906092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11423308566697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03147452036931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9724517338113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49318704896338, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68468709145579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32003795658395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26674166444458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26630934814938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41533319810328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36350758058099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16332285120929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34043899579565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74219820454567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.55413171456674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58180279933771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02408626223293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87657341045228, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.55590567361486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08074161986468, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80457382221171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8131686939551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25793142134573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95253144170447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14743781912107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87835645740229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9764387193147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94516537050167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89603764932446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63800292429943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.24337208101042, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59556244009269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28446378378608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13025499622808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.23383791902404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3328854638381, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96067846320523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94965457520625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16625059748041, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8269642033066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81310669049034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25554422109529, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45622372930102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.83947343135847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43135259957857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.53295655650527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78816229160893, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9413213129086, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40648296911729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.30279435197399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65263067129817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8239628759463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7795218814571, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36068460994301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47451059527033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.09791235411565, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64232209133355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9960341944844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86057544771678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03722443992689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02540027670304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23831571579666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61642884685872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95873360404138, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78520963834742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12207131713245, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.030634236321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2580641252632, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57471719502651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16033087447514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64298714231596, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75555986268628, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29534460790408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82043015696519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34161824742394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61753779742976, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15624068230731, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25917455813928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5936848786624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98045633035186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98797939638727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35827005631805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69155799194061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68091309416992, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70456318827733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16469231313611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8799099382491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11566093967609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80161139315015, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15377445359951, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15715297991916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86962603101975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72926386277882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1579385275225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74116822603293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31971390482754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20782644697857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01885490875779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42230012835576, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99288411883725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.082184046767, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85101362331126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98564664788431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86959357102904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20013868958425, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84924924581607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31289310035527, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30858201402589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99373607498532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.18572768435916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33439114940057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07429869254726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04790943044299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64069907229371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26235855896988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50379403067527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43691170957882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37005197510278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.27057437223934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.09337235241868, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71128565229746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02883456195461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80490335979457, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9287597961482, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.17470692964342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24931526786432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60050033989026, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09469925407369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3111349289259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18816369089683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42938460793316, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41602741852829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42310978968692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50953693273829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3312342786166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96020937715257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53068640749544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56091640875552, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89910933295498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.42727078867868, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.19572149206287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68137345397398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.48011498833462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73481537380023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9817766831428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62422399002075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25402747101043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78794113614681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51565520344022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81994141877884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73569183010366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89304084668578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94563028017612, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.70380536433252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.18321579529317, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75634960957339, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99346542277752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07784715364147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82473368702337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80939097372557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.56855092683492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22637736311736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04989016451177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06688407845617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11481000895263, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27282277875311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.10549027383173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02590143870165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0111357952797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36789726372407, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.16759918928896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02364437811006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64247835816664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20232839714717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51418676739564, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81320041849362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27166607324205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2545983932022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9749722820765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67780842750179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45906966920411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76345480442126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43197465037622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3600604543369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44350843545416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39757672508603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.85230151275863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81407145534195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01128875382821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67591197573066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.51279666702179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98461279621962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.18776220832692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68365711276127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52965334263803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97018528191016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.1704075246973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.4092834971355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80397108470676, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7224658447326, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.15638220769824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66063113797075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.93674170823937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02426166276656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2868521233569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06798590582007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.35136606041436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.99746534424483, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.56303029535638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09425361608109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.42070005109457, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41089068186189, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.18677881527823, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43901544778936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.5260369404649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01177208564717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36159823018748, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82082511981079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2807149297715, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9250036260453, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.6150063093046, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.61363931969464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.38004154259691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.96467806287603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70041523761671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.62074541364396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.95651159207542, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05267669381956, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.69416855510607, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.8695133244266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.61012799594214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.05464751490085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.46681240023963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.63067407291008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.96046847840074, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56273021751427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.14638715063298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.75859326793318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97823499949781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1563775636343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.71453147899727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.00941330347686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97249110306038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.44900384555615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.26380626108603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.9389490074607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91676356991597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.13685393625028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92025914672814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.9636459548143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9470309766908, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23464868145118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16095300836626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86371979002091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1658806519524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.80999909964301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.3916052906719, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79830122498419, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92464426243117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74084404129731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77591195761288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.129082151163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.29443539538282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.49821093674116, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.52895961614624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.50773769923417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.20586243304412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1593251595947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86523925470759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.88148378297518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.54298539634833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97268456538903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62712854780935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.74146887774299, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.42853595632805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.84848168731006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83668379255865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.47241973433749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.89842730786603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82455441317694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.16986826544031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.1811588929617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.09911654611166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.55257557802233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60087172956541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.68671023186488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.96517472835335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.05260562521785, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.08006582461334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.79432064186736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.41108821991375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87347025830266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20564533828775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.30309517181773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1406611037728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.24392591685461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.10896639776043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43429707485602, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.99823744300166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.51160983247296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.15695774047701, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.25313076740179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.3503914171167, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47393608345517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.98751697992219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0545116492653, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01799823084976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05081241841745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.31407916672543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.80885265421585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.15205975168703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47241880815605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54172600484964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8976774720573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58791087448299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02271267015783, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1045908395152, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24414870008319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69109127617371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.65306278042235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.39816620647916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1810606061523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49470462633181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01504374556126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67904663244455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74908045175502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28081352108579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72430502818084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91000509633358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0266388958905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0693230610812, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2669116718157, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31911690207038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01378736632232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69057272581715, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86605080021333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54829275642138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92761316198515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07281692163534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2809228591007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11130793179962, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.78210365621945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99114272050637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26603620619443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26895473010688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88756691851471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90535085923925, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8662778443967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.27678234231546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21120724189035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.62182381785365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70089986040492, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98061841891752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.63730668221623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.21809213108293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62513446883317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0550792423482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7111656021986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70112878957045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.22008595203475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26583380518775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84031644841893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.76253265375746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36921450181964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38751561741323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.75942760797071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20505090808616, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01993010545006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25253006691226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9292129294191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.45831791808807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01874761761506, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.70179579177142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.45782648578765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.9654506293958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.69543160906309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.23626703373412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.23730582460071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58630669240723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.24411442253736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80412345904836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33266826608637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08584208568091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20511704388718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73586252939168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6229802242446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66558700926207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74677062129318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54017463980658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.730138438308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49572076787184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77203615539878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91635203682458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91294155802171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85493736088273, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07037492573127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3591812957655, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21752684184962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82182795562746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91554181329224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2637454877203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42377971468683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9956096009709, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95024629295155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02384747382928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.7384856392294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78634727970504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.46503843997183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.75198886376967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.39876122857235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.11567284541557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77091533493147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34851941060441, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.04122370969267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97807111210729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82297627909733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88908258807695, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.02494822567455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52813633390632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77607586946252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84906975105618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10682536410768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60098332710814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16477240647923, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6446435040502, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34853961981467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90164291858915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52920571661875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96718442791747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1449985691514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09214526901171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08808617199072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57735843418071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.03374091329061, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67153521214688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90721494360177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94800270723887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77341143396697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16810608211968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1295561924666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61098976638968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09160273927314, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3316634600706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53620789150742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21568894504843, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93343913761625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02299067534886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18544500815403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98907937476646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.45348785433026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02085687929099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84830391916218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43699045607909, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.95759166912264, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.47551491598014, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66498305754212, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36643618283398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3496449568648, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06229907806569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93784310790696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96780942003683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88445131540618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08186481058257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20796655389181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9654081254928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49393791749024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05007592523162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84518996211608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32190345568543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32827178627502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26562867244172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9489490131078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54756230484855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52695826109522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16120912048845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73109278013733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12967158946793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66144197243285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35105870140517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32497954050243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.404028525945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5596224194739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06373732644884, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82924854494931, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63616550173667, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.79933273190036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95120755426662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56403816854014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35426808914588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35865607168631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90482034285156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9985787957225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8768940380532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86502942650776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82867955654159, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06669061925808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05805100493507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19478081630376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.4726753044577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8774192059464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.47630925649874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67940992744533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83387030747774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77541066961662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21806909335821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2116719393634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63189068076446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31676028980675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96917376263126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3332407570871, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.63597205774145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00130198273088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05926832590498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76190103073331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24963627943366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.73904226779082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53198582108524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29391446442064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60323551607766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.17535379161295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95745054254392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.65432843266518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33856790601594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36956060356385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.2507487739047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9809276691774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16338627425559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95283790294347, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37363985497257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41734797456819, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46879833485087, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89779171625213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.56566914846213, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.12295330761386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.47229523041987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01642931045994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.97899403484826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.29040521639678, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62958711128005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94114223449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38592136937638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.493222435549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3474523152517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84805377401344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.24313248176318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23716867785055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3344550507391, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25058017257405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26148603669161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.78124566715695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.30392352510412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05471403229689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26889976544973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.97149252732743, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49652862514739, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49761686858754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96133483843103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60373115569557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43278823558683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.216186422251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22790913521419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53921057943961, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3857390941578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03374081752091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.39823678210567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08940418013472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65920217896303, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.39853539402684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65048655775453, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.79873760769597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68828575617101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87251964203307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5300255114375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79086592344467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57270931229704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88859692291733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80271734344691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04073002158317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46828834544144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23692924750449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43771978777833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09517649815284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.97835234626153, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79133291522645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02945945000636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.45235296621496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.63061442838703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1729530420449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58327824763774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.536291527272, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.30651397849368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69842586893596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16248763742118, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49605102540508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25313944944546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8421663218519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97561455613513, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01878568439928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7731623418128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3031103300392, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82895908639826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34460637435383, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32181327562058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.5260793564055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2357948297768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.68746434551585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58592175261929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.46697080069039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.654447961068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3612670935331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01031054901587, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.37919304454006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41169786096938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.29381617044329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70386499802939, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.42981226133158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13311787546735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41698336938477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39366908316056, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89356698837386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.60226357609555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.41574363121151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77307124686526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32527272706531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02617500869306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9453398724905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0185892574846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.30963127571127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25489319248068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74391567498766, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20889480054281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11263111652507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10139698703692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71015543952899, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.47583632063913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75986386635343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.27037620813209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44774661355898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99875783176927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58344310898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14439051922356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.54039819515215, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92367785774749, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05584126819757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35601781114134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81351651597147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84701543791368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72332949821384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51107159043485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91369044105626, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12129104458734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.14884637460801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89417488264915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12845985022912, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65979930529929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96178874818798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4511703887473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.89229345893365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58860576042824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.04178116383622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4578576609693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.86053478009173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.76430023458302, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8053175522895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40836408730766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.85612524977265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40863693697362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.09196518919535, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.91994528712154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.45747729845408, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.40486331313025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8856295626394, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.41673292493975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.30115153676562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50993042362319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8443544450889, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58646684173618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.51863942815191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02582579018504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.64624335712315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.62478266594604, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.97351592845854, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.2565162152012, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32379857764127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96151236382953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38409820559012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.76791246698866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.15204268625024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14536275879573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92555424660308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28378367357755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6447277617356, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94359099606793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6316942698782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61709548381037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99406223655019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51586581649707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88355978598187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59210068726337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20766791171343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03526629028747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73917319444821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21019311262799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87224010683994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42438731231145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32218202085551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84840341954816, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74542752078266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.97099698374727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5673298293271, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.99384012192989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89305134977978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62217998545916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36509094658045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88634389481254, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09706919037085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26411816919232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87466770876311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60479889553625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20308651861096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03254850546956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.38853458659054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15112623454132, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96842409215192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.88812859002927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24664780939709, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.55850895917358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87161322114831, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00535793552655, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44802861400582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06090359266082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86729712174954, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.52050959132679, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.61545833641875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11576558511285, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.83965947403613, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12256163749143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01797419460767, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19504665832812, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.52501223027797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70543373709387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76145907090127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99231970762736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72601264375818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.17294252688178, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66991995260973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29227941579406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05260425345361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08641894302396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89786622090341, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19281076082636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00268172437694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8031782169886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30303744020942, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96047444085842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53102238294964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55135190498417, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73320965755093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83108861382613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66116571648418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37760682748707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73832896665387, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55125645985113, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05801072220544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19615016955768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71612053106102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35363412291727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89683728827593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.45394449656698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64711251538864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20425342905766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27286775878677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11098684044114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82344576152076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85991046136218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76944869834962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49443525385506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26714007172913, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55312747617486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21338289364272, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.50082066300278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2831851440446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64838687037759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7216517557643, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97199380174193, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55110234448432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.47254018419862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35333984916059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.55290357280873, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92761668682888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52405415324874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01759216619796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9301791723341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98789247555584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.13492749804534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.88900920001714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63316803265334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.85577813730865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25060393364089, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37992029678232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2161626045396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94097148564506, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61411385344917, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26633312852945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57486927906898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25460128509323, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.93806274853755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88821464003595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53437593350753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.55582558991509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57746904834741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35186779566517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82220668249171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33239215677628, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65684927729923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07995330778445, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14274907856505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.31638915313648, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.80125655346451, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86908900365832, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43258549076675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7418385386059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04661736537737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.18409149189988, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27288236124932, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66757472286285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66108329653198, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0113429588981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01542580767835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87145951112797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58043482842866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.28456359684716, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.4268917756353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.10394740945229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.5888902773369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05233318851361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20379964517137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93054848304011, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.4470753529935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.55093725008568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1771270171211, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.51951955539236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.35054775405881, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20200706252784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07198645570766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13850851279538, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.26087589169711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93035699558081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.52157669994284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.49395863364698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.86316250689507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.18352844268802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93546496698288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.8113095296125, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.54696410392556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.0801204143829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.23016998477505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.84774198158706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.88558944915762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.52000332438061, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.86871340352687, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.58373696827199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.82208371804109, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.32832910147937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.06529443738526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.45977666376373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.24686599676619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.21043430906948, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.45185611426218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.80819601768098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.95861552217461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.14254378792333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.6718045936633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.3689677842857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.87620295869029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.06997514477665, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.79230048470953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.69842658289039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84366945841847, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.75521347785289, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.14459057740478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.78540826994568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.0389294134589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T00:00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Backtrader", + "passed": true, + "scenario_id": "17" + }, "detail": null, + "duration_seconds": 0.6032488059718162, + "framework": "backtrader", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 0.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.11917253451473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.54841534502786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.03201587878578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.94550278474797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.67183298908238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86549713479145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.1916089774142, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.48697641782272, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.74505140134526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.4324970118259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.36317339817481, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3184784020995, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.59194698786014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21300773889088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.93323693635863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.01041702546699, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.12882215455511, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.82503838919212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.20974209562837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28418162139361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91262465479312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47079432451613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41396612142576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.74208634353057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96112016066532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.14757933275934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.33794797010775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95774776632322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.39809150990905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.29624163714647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.98044425919083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71415014911958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68703409584346, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.19660477578049, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.09913803201934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13975001075532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7525000464393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67014960303162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.16172259245428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.99277550738105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.726000665382, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27597137389321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.96674656359579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01407453019127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01883446140224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.33686580554885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.61379453469056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44418682978015, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.1261570487614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.90367229199477, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.48715448535594, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.53898885220806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.13695584567007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.74920846022492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.28346179234327, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.39446913633991, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.38048314487808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8685385779757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.78335766752544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.08258048792487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.04409706752067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.00584315640894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17754603801194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.91386750387461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.07278397148802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.84957817071898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.66685696016805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.29703959359377, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.16284479663989, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.59827392536462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02427769637677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.02034152325665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.10227360972624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.55074957264794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4752285310497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.78482968977629, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.64550269913406, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.75829920829567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.28405624956507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.40750734980367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.9736108084372, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.11719582995507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.42442738415961, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.46803368609852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.65390080108091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.55529329412784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.84475344760442, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.34547532849058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.83286932713185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.1414110724743, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.70880723169135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.37107171120152, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17212988349165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.88968353827183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.17974473578754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.64495810760246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86042757757674, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.42922022261914, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67123710700702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.1262468099545, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.99803204217791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.0746490327229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68852164950059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.90683245619206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.6986709588789, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.58028409299915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78930171959787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.44349309161048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.63928948741085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.8801021064717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.88804895153031, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9129584357738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.35911188288487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.55107978610341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.24566283787111, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.50854335078685, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85972377687798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94180161552265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42256786175977, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.39260868907034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47598985042309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2217481384577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.43771261461684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.2555639625908, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.27520136851216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.22895283520215, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84721164221584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.21690016032666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.98012439288168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.42241300564716, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.52349736477139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.8478017412055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.78357735159078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5180376571157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07885735340791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46287786089891, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7806750796624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.99007562374577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3160405598432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.69515591162462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.9307950005457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.49497584845733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.05277773908537, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.63017059410102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.95560584181007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.85704345214472, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.34581983849665, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.55148937480453, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.83406196186097, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.25669377064882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.51637945271536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.57103396676898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4383018584174, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.4155507445711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.92267680402585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.75883349843212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.974264479532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.70988332181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21365266173217, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.08294324004584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11928874045203, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31180164071337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.00054275724283, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.65255133629894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.96503242935937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.79138811772026, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.47378044689603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.31284487928606, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.73200506980342, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3363427106496, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.56611574901736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.13272204200155, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.89963627791985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.38755792776327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.35474381234252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.97868642263798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.11962753041762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.25728100943367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.076645155786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.13617368469758, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.9576189114394, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.38251520181134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.58405172820402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.18256483496931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31778631274507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.92748490697555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11485299409067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.46828746700025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.7892083341232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.2850707768965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.61528686513479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16045065160826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98923853245553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.78083136801966, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98736762370623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.41242668783207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.7821059253462, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.01676230346942, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.90986422948514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.85698353324744, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.72982041802001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.60761748093444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0385605171193, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.09198940082088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21597248424331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.490691270523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.2706953210234, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.23704650718707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.30522444084696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.82731858826376, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91407429365688, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.5460351903365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93028933684711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.0553633238757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47484452500944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.10094020807114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.01428360585086, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.38292648890776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48513559668872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.27497370614257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.14886606297294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.29611163730506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.23350982317787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.79948982072462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98472225444857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.71079305814114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.3396263042363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.98172498582129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.42795373397291, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.6321305493393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.76479352938595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.48958247666037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.73111789636546, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.61885876679554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.85401562603096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.49175141105384, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.84289871423181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.99377199128872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.76186428614056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.48850513355184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.12395315196963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.53863571252707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.6026762767146, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.09752132137899, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.4927463612385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.82226372897985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.79148532437995, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.11483711173116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.80033950220171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.63729064888537, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.11575917668634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.28032546622858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.53344904132358, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.29557459823668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.01730754421833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07935604760307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.79620422510413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.24797305894252, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.19373825703377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.40514794332339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.55648566288775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.55716667120137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.91494018138197, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.48501201892987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.90008526748947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.83721845974864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26504549069784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.06840340797214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26053581327312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.42454996605802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94825682250638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05109746301977, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.1969266603545, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.27193710609464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.97039812035842, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.34802647272141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.07904244701469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.79316819026657, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.5721771606179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.6253449835299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88599336671724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9167314813735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.23555143341264, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.69172330670986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40326355089037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32320287324674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32022315669313, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.22613575397045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.08195298394907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.5883765126535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6323490375275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0747399163529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.55723413541229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.78282068603487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66145085922012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.46346097050873, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.00404625454874, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.66092881844989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.49919123199933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.97621398907071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41257974165285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.05124864668421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01899188310071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2559389154428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.12609495739092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25576346468043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4705053051443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72410136704386, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19884636287924, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86432033375576, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34050558738045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.10587138419956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72930751574246, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25639421821361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59980860135867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.54277270362404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92591784638046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14258894906092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11423308566697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03147452036931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9724517338113, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49318704896338, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68468709145579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32003795658395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26674166444458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26630934814938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41533319810328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36350758058099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16332285120929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34043899579565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74219820454567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.55413171456674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58180279933771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02408626223293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87657341045228, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.55590567361486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08074161986468, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80457382221171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8131686939551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25793142134573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95253144170447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14743781912107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87835645740229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9764387193147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94516537050167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89603764932446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63800292429943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.24337208101042, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.59556244009269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.28446378378608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13025499622808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.23383791902404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3328854638381, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96067846320523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94965457520625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16625059748041, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8269642033066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81310669049034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25554422109529, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.45622372930102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.83947343135847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43135259957857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.53295655650527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78816229160893, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9413213129086, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.40648296911729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.30279435197399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.65263067129817, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8239628759463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7795218814571, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36068460994301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47451059527033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.09791235411565, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64232209133355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9960341944844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86057544771678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03722443992689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02540027670304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23831571579666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61642884685872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95873360404138, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78520963834742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12207131713245, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.030634236321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2580641252632, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57471719502651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16033087447514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64298714231596, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75555986268628, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29534460790408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82043015696519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34161824742394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61753779742976, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15624068230731, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25917455813928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5936848786624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98045633035186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98797939638727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35827005631805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69155799194061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68091309416992, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.70456318827733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16469231313611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8799099382491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11566093967609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80161139315015, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.15377445359951, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.15715297991916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86962603101975, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72926386277882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1579385275225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74116822603293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31971390482754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20782644697857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01885490875779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42230012835576, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99288411883725, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.082184046767, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85101362331126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98564664788431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86959357102904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20013868958425, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84924924581607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31289310035527, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30858201402589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99373607498532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.18572768435916, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33439114940057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07429869254726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.04790943044299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64069907229371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26235855896988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50379403067527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43691170957882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37005197510278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.27057437223934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.09337235241868, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.71128565229746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02883456195461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80490335979457, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9287597961482, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.17470692964342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24931526786432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60050033989026, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09469925407369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3111349289259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18816369089683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.42938460793316, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.41602741852829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42310978968692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.50953693273829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3312342786166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96020937715257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53068640749544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56091640875552, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89910933295498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.42727078867868, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.19572149206287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68137345397398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.48011498833462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73481537380023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.9817766831428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62422399002075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25402747101043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.78794113614681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51565520344022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81994141877884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73569183010366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89304084668578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94563028017612, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.70380536433252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.18321579529317, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75634960957339, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99346542277752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07784715364147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82473368702337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80939097372557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.56855092683492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22637736311736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04989016451177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06688407845617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11481000895263, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27282277875311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.10549027383173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02590143870165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0111357952797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36789726372407, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.16759918928896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02364437811006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.64247835816664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20232839714717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51418676739564, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.81320041849362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27166607324205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2545983932022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9749722820765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67780842750179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.45906966920411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.76345480442126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43197465037622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3600604543369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44350843545416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39757672508603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.85230151275863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81407145534195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01128875382821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.67591197573066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.51279666702179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98461279621962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.18776220832692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.68365711276127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52965334263803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97018528191016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.1704075246973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.4092834971355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.80397108470676, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.7224658447326, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.15638220769824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66063113797075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.93674170823937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.02426166276656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2868521233569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.06798590582007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.35136606041436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.99746534424483, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.56303029535638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09425361608109, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.42070005109457, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41089068186189, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.18677881527823, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43901544778936, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.5260369404649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01177208564717, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.36159823018748, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82082511981079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2807149297715, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9250036260453, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.6150063093046, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.61363931969464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.38004154259691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.96467806287603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70041523761671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.62074541364396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.95651159207542, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05267669381956, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.69416855510607, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.8695133244266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.61012799594214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.05464751490085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.46681240023963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.63067407291008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.96046847840074, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.56273021751427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.14638715063298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.75859326793318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97823499949781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1563775636343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.71453147899727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.00941330347686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97249110306038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.44900384555615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.26380626108603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.9389490074607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.91676356991597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.13685393625028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92025914672814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.9636459548143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.9470309766908, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.23464868145118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16095300836626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86371979002091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1658806519524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.80999909964301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.3916052906719, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.79830122498419, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92464426243117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.74084404129731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77591195761288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.129082151163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.29443539538282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.49821093674116, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.52895961614624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.50773769923417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.20586243304412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1593251595947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.86523925470759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.88148378297518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.54298539634833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97268456538903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.62712854780935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.74146887774299, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.42853595632805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.84848168731006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83668379255865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.47241973433749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.89842730786603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.82455441317694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.16986826544031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.1811588929617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.09911654611166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.55257557802233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.60087172956541, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.68671023186488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.96517472835335, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.05260562521785, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.08006582461334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.79432064186736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.41108821991375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87347025830266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20564533828775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.30309517181773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1406611037728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.24392591685461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.10896639776043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43429707485602, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.99823744300166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.51160983247296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.15695774047701, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.25313076740179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.3503914171167, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47393608345517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.98751697992219, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0545116492653, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01799823084976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05081241841745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.31407916672543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.80885265421585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.15205975168703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.47241880815605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.54172600484964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8976774720573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58791087448299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02271267015783, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.1045908395152, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24414870008319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69109127617371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.65306278042235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.39816620647916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1810606061523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49470462633181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01504374556126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67904663244455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74908045175502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.28081352108579, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.72430502818084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91000509633358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0266388958905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.0693230610812, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2669116718157, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31911690207038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01378736632232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.69057272581715, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86605080021333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54829275642138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.92761316198515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.07281692163534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.2809228591007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11130793179962, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.78210365621945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.99114272050637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26603620619443, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26895473010688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.88756691851471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.90535085923925, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8662778443967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.27678234231546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21120724189035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.62182381785365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70089986040492, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.98061841891752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.63730668221623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.21809213108293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62513446883317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.0550792423482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7111656021986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.70112878957045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.22008595203475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.26583380518775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84031644841893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.76253265375746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36921450181964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38751561741323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.75942760797071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20505090808616, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01993010545006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25253006691226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9292129294191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.45831791808807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.01874761761506, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.70179579177142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.45782648578765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.9654506293958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.69543160906309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.23626703373412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.23730582460071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58630669240723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.24411442253736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.80412345904836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33266826608637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08584208568091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20511704388718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73586252939168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6229802242446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66558700926207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74677062129318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54017463980658, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.730138438308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49572076787184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77203615539878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.91635203682458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91294155802171, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.85493736088273, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07037492573127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3591812957655, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21752684184962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82182795562746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91554181329224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2637454877203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42377971468683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9956096009709, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95024629295155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.02384747382928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.7384856392294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78634727970504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.46503843997183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.75198886376967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.39876122857235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.11567284541557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77091533493147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34851941060441, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.04122370969267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97807111210729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82297627909733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88908258807695, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.02494822567455, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52813633390632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77607586946252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84906975105618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10682536410768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60098332710814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16477240647923, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.6446435040502, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34853961981467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90164291858915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52920571661875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96718442791747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1449985691514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09214526901171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08808617199072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57735843418071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.03374091329061, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67153521214688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90721494360177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94800270723887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.77341143396697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16810608211968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.1295561924666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61098976638968, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09160273927314, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3316634600706, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53620789150742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21568894504843, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93343913761625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02299067534886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.18544500815403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.98907937476646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.45348785433026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02085687929099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.84830391916218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43699045607909, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.95759166912264, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.47551491598014, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66498305754212, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.36643618283398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3496449568648, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06229907806569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.93784310790696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96780942003683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88445131540618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08186481058257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20796655389181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9654081254928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49393791749024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05007592523162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.84518996211608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32190345568543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32827178627502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26562867244172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9489490131078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54756230484855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.52695826109522, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16120912048845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73109278013733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12967158946793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66144197243285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35105870140517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32497954050243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.404028525945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5596224194739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06373732644884, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82924854494931, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.63616550173667, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.79933273190036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95120755426662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56403816854014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35426808914588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35865607168631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.90482034285156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9985787957225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8768940380532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86502942650776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82867955654159, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06669061925808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05805100493507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19478081630376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.4726753044577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.8774192059464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.47630925649874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.67940992744533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83387030747774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.77541066961662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21806909335821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2116719393634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.63189068076446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.31676028980675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96917376263126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3332407570871, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.63597205774145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.00130198273088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05926832590498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76190103073331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.24963627943366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.73904226779082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53198582108524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.29391446442064, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60323551607766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.17535379161295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95745054254392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.65432843266518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.33856790601594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.36956060356385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.2507487739047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.9809276691774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.16338627425559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.95283790294347, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37363985497257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.41734797456819, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46879833485087, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.89779171625213, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.56566914846213, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.12295330761386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.47229523041987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.01642931045994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.97899403484826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.29040521639678, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.62958711128005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94114223449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38592136937638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.493222435549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3474523152517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.84805377401344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.24313248176318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23716867785055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.3344550507391, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25058017257405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26148603669161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.78124566715695, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.30392352510412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05471403229689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.26889976544973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.97149252732743, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.49652862514739, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49761686858754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96133483843103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.60373115569557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43278823558683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.216186422251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22790913521419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.53921057943961, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3857390941578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03374081752091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.39823678210567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08940418013472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65920217896303, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.39853539402684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65048655775453, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.79873760769597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.68828575617101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87251964203307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5300255114375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.79086592344467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57270931229704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88859692291733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.80271734344691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04073002158317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.46828834544144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23692924750449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.43771978777833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.09517649815284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.97835234626153, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.79133291522645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02945945000636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.45235296621496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.63061442838703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.1729530420449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58327824763774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.536291527272, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.30651397849368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.69842586893596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.16248763742118, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.49605102540508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25313944944546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.8421663218519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97561455613513, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.01878568439928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7731623418128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.3031103300392, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82895908639826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.34460637435383, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32181327562058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.5260793564055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.2357948297768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.68746434551585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58592175261929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.46697080069039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.654447961068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.3612670935331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.01031054901587, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.37919304454006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41169786096938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.29381617044329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.70386499802939, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.42981226133158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13311787546735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.41698336938477, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.39366908316056, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.89356698837386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.60226357609555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.41574363121151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.77307124686526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.32527272706531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.02617500869306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.9453398724905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.0185892574846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.30963127571127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25489319248068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.74391567498766, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20889480054281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.11263111652507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.10139698703692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.71015543952899, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.47583632063913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.75986386635343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.27037620813209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44774661355898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99875783176927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.58344310898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14439051922356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.54039819515215, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.92367785774749, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05584126819757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35601781114134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.81351651597147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84701543791368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72332949821384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51107159043485, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.91369044105626, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12129104458734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.14884637460801, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89417488264915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.12845985022912, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.65979930529929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96178874818798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4511703887473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.89229345893365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58860576042824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.04178116383622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.4578576609693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.86053478009173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.76430023458302, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8053175522895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40836408730766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.85612524977265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.40863693697362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.09196518919535, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.91994528712154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.45747729845408, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.40486331313025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8856295626394, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.41673292493975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.30115153676562, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.50993042362319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.8443544450889, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58646684173618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.51863942815191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.02582579018504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.64624335712315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.62478266594604, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.97351592845854, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.2565162152012, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32379857764127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96151236382953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.38409820559012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.76791246698866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.15204268625024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.14536275879573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92555424660308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.28378367357755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6447277617356, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.94359099606793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.6316942698782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.61709548381037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.99406223655019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.51586581649707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88355978598187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.59210068726337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.20766791171343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.03526629028747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73917319444821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.21019311262799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87224010683994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.42438731231145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.32218202085551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84840341954816, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.74542752078266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.97099698374727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.5673298293271, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.99384012192989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89305134977978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.62217998545916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.36509094658045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88634389481254, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.09706919037085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26411816919232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87466770876311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.60479889553625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.20308651861096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.03254850546956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.38853458659054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.15112623454132, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96842409215192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.88812859002927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.24664780939709, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.55850895917358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.87161322114831, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.00535793552655, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.44802861400582, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06090359266082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86729712174954, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.52050959132679, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.61545833641875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11576558511285, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.83965947403613, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.12256163749143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01797419460767, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19504665832812, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.52501223027797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.70543373709387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.76145907090127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.99231970762736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.72601264375818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.17294252688178, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66991995260973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.29227941579406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.05260425345361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.08641894302396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89786622090341, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19281076082636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.00268172437694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.8031782169886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.30303744020942, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96047444085842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.53102238294964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55135190498417, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73320965755093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.83108861382613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66116571648418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.37760682748707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.73832896665387, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55125645985113, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.05801072220544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19615016955768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71612053106102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35363412291727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.89683728827593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.45394449656698, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.64711251538864, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20425342905766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.27286775878677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.11098684044114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82344576152076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.85991046136218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76944869834962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.49443525385506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.26714007172913, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55312747617486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21338289364272, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.50082066300278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.2831851440446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.64838687037759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.7216517557643, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97199380174193, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.55110234448432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.47254018419862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.35333984916059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.55290357280873, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.92761668682888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52405415324874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01759216619796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.9301791723341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.98789247555584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.13492749804534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.88900920001714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.63316803265334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.85577813730865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.25060393364089, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.37992029678232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.2161626045396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.94097148564506, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.61411385344917, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.26633312852945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57486927906898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.25460128509323, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.93806274853755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.88821464003595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.53437593350753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.55582558991509, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57746904834741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35186779566517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.82220668249171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.33239215677628, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.65684927729923, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.07995330778445, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.14274907856505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.31638915313648, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.80125655346451, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.86908900365832, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.43258549076675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.7418385386059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.04661736537737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.18409149189988, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.27288236124932, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.66757472286285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.66108329653198, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.0113429588981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.01542580767835, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87145951112797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58043482842866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.28456359684716, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.4268917756353, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.10394740945229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.5888902773369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.05233318851361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20379964517137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93054848304011, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.4470753529935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.55093725008568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.1771270171211, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.51951955539236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.35054775405881, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20200706252784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.07198645570766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.13850851279538, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.26087589169711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93035699558081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.52157669994284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.49395863364698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.86316250689507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.18352844268802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.93546496698288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.8113095296125, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.54696410392556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.0801204143829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.23016998477505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.84774198158706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.88558944915762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.52000332438061, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.86871340352687, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.58373696827199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.82208371804109, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.32832910147937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.06529443738526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.45977666376373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.24686599676619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.21043430906948, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.45185611426218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.80819601768098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.95861552217461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.14254378792333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.6718045936633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.3689677842857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.87620295869029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.06997514477665, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.79230048470953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.69842658289039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84366945841847, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.75521347785289, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.14459057740478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.78540826994568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.0389294134589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T00:00:00" + } + ], + "final_value": 98797.5798029603, + "framework": "Backtrader", + "num_trades": 600, + "total_pnl": -1202.420197039697, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.11917253451473, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 99.54841534502786, + "exit_time": "2020-01-04T00:00:00", + "gross_pnl": -157.07571894868693, + "pnl": -157.07571894868693, + "pnlcomm": -157.07571894868693, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.03201587878578, + "entry_time": "2020-01-06T00:00:00", + "exit_price": 99.94550278474797, + "exit_time": "2020-01-07T00:00:00", + "gross_pnl": -8.651309403781227, + "pnl": -8.651309403781227, + "pnlcomm": -8.651309403781227, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.67183298908238, + "entry_time": "2020-01-09T00:00:00", + "exit_price": 99.86549713479145, + "exit_time": "2020-01-10T00:00:00", + "gross_pnl": 19.366414570907864, + "pnl": 19.366414570907864, + "pnlcomm": 19.366414570907864, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.1916089774142, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 100.48697641782272, + "exit_time": "2020-01-13T00:00:00", + "gross_pnl": 29.536744040851204, + "pnl": 29.536744040851204, + "pnlcomm": 29.536744040851204, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.74505140134526, + "entry_time": "2020-01-15T00:00:00", + "exit_price": 99.43249701182592, + "exit_time": "2020-01-16T00:00:00", + "gross_pnl": -31.255438951934877, + "pnl": -31.255438951934877, + "pnlcomm": -31.255438951934877, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36317339817481, + "entry_time": "2020-01-18T00:00:00", + "exit_price": 100.3184784020995, + "exit_time": "2020-01-19T00:00:00", + "gross_pnl": 95.53050039246926, + "pnl": 95.53050039246926, + "pnlcomm": 95.53050039246926, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.59194698786014, + "entry_time": "2020-01-21T00:00:00", + "exit_price": 99.21300773889088, + "exit_time": "2020-01-22T00:00:00", + "gross_pnl": -37.89392489692602, + "pnl": -37.89392489692602, + "pnlcomm": -37.89392489692602, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.93323693635863, + "entry_time": "2020-01-24T00:00:00", + "exit_price": 101.01041702546699, + "exit_time": "2020-01-25T00:00:00", + "gross_pnl": 107.71800891083672, + "pnl": 107.71800891083672, + "pnlcomm": 107.71800891083672, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.12882215455511, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 98.82503838919212, + "exit_time": "2020-01-28T00:00:00", + "gross_pnl": -130.37837653629936, + "pnl": -130.37837653629936, + "pnlcomm": -130.37837653629936, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20974209562837, + "entry_time": "2020-01-30T00:00:00", + "exit_price": 99.28418162139361, + "exit_time": "2020-01-31T00:00:00", + "gross_pnl": 7.443952576524282, + "pnl": 7.443952576524282, + "pnlcomm": 7.443952576524282, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91262465479312, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 98.47079432451613, + "exit_time": "2020-02-03T00:00:00", + "gross_pnl": -144.18303302769857, + "pnl": -144.18303302769857, + "pnlcomm": -144.18303302769857, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.41396612142576, + "entry_time": "2020-02-05T00:00:00", + "exit_price": 99.74208634353057, + "exit_time": "2020-02-06T00:00:00", + "gross_pnl": 132.81202221048147, + "pnl": 132.81202221048147, + "pnlcomm": 132.81202221048147, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96112016066532, + "entry_time": "2020-02-08T00:00:00", + "exit_price": 99.14757933275934, + "exit_time": "2020-02-09T00:00:00", + "gross_pnl": 18.64591720940183, + "pnl": 18.64591720940183, + "pnlcomm": 18.64591720940183, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.33794797010775, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 98.95774776632322, + "exit_time": "2020-02-12T00:00:00", + "gross_pnl": -38.02002037845256, + "pnl": -38.02002037845256, + "pnlcomm": -38.02002037845256, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.39809150990905, + "entry_time": "2020-02-14T00:00:00", + "exit_price": 99.29624163714647, + "exit_time": "2020-02-15T00:00:00", + "gross_pnl": -10.18498727625854, + "pnl": -10.18498727625854, + "pnlcomm": -10.18498727625854, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98044425919083, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 98.71415014911958, + "exit_time": "2020-02-18T00:00:00", + "gross_pnl": -26.629411007125725, + "pnl": -26.629411007125725, + "pnlcomm": -26.629411007125725, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68703409584346, + "entry_time": "2020-02-20T00:00:00", + "exit_price": 99.19660477578049, + "exit_time": "2020-02-21T00:00:00", + "gross_pnl": 50.957067993702765, + "pnl": 50.957067993702765, + "pnlcomm": 50.957067993702765, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.09913803201934, + "entry_time": "2020-02-23T00:00:00", + "exit_price": 99.13975001075532, + "exit_time": "2020-02-24T00:00:00", + "gross_pnl": -95.93880212640187, + "pnl": -95.93880212640187, + "pnlcomm": -95.93880212640187, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7525000464393, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 98.67014960303162, + "exit_time": "2020-02-27T00:00:00", + "gross_pnl": -8.235044340767672, + "pnl": -8.235044340767672, + "pnlcomm": -8.235044340767672, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.16172259245428, + "entry_time": "2020-02-29T00:00:00", + "exit_price": 99.99277550738104, + "exit_time": "2020-03-01T00:00:00", + "gross_pnl": 83.1052914926758, + "pnl": 83.1052914926758, + "pnlcomm": 83.1052914926758, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.726000665382, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 99.27597137389321, + "exit_time": "2020-03-04T00:00:00", + "gross_pnl": 54.997070851121066, + "pnl": 54.997070851121066, + "pnlcomm": 54.997070851121066, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.96674656359579, + "entry_time": "2020-03-06T00:00:00", + "exit_price": 99.01407453019127, + "exit_time": "2020-03-07T00:00:00", + "gross_pnl": -95.26720334045251, + "pnl": -95.26720334045251, + "pnlcomm": -95.26720334045251, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01883446140224, + "entry_time": "2020-03-09T00:00:00", + "exit_price": 99.33686580554885, + "exit_time": "2020-03-10T00:00:00", + "gross_pnl": 31.803134414661827, + "pnl": 31.803134414661827, + "pnlcomm": 31.803134414661827, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.61379453469056, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 99.44418682978016, + "exit_time": "2020-03-13T00:00:00", + "gross_pnl": -16.960770491039057, + "pnl": -16.960770491039057, + "pnlcomm": -16.960770491039057, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.1261570487614, + "entry_time": "2020-03-15T00:00:00", + "exit_price": 98.90367229199478, + "exit_time": "2020-03-16T00:00:00", + "gross_pnl": 77.75152432333812, + "pnl": 77.75152432333812, + "pnlcomm": 77.75152432333812, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.48715448535594, + "entry_time": "2020-03-18T00:00:00", + "exit_price": 98.53898885220806, + "exit_time": "2020-03-19T00:00:00", + "gross_pnl": -94.81656331478803, + "pnl": -94.81656331478803, + "pnlcomm": -94.81656331478803, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.13695584567007, + "entry_time": "2020-03-21T00:00:00", + "exit_price": 98.74920846022493, + "exit_time": "2020-03-22T00:00:00", + "gross_pnl": -138.7747385445138, + "pnl": -138.7747385445138, + "pnlcomm": -138.7747385445138, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.28346179234327, + "entry_time": "2020-03-24T00:00:00", + "exit_price": 99.39446913633991, + "exit_time": "2020-03-25T00:00:00", + "gross_pnl": 11.100734399663281, + "pnl": 11.100734399663281, + "pnlcomm": 11.100734399663281, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38048314487808, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 98.86853857797571, + "exit_time": "2020-03-28T00:00:00", + "gross_pnl": -51.19445669023719, + "pnl": -51.19445669023719, + "pnlcomm": -51.19445669023719, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.78335766752544, + "entry_time": "2020-03-30T00:00:00", + "exit_price": 100.08258048792489, + "exit_time": "2020-03-31T00:00:00", + "gross_pnl": 29.922282039945003, + "pnl": 29.922282039945003, + "pnlcomm": 29.922282039945003, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.04409706752067, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 100.00584315640894, + "exit_time": "2020-04-03T00:00:00", + "gross_pnl": -3.8253911111723937, + "pnl": -3.8253911111723937, + "pnlcomm": -3.8253911111723937, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17754603801194, + "entry_time": "2020-04-05T00:00:00", + "exit_price": 99.91386750387461, + "exit_time": "2020-04-06T00:00:00", + "gross_pnl": 73.63214658626731, + "pnl": 73.63214658626731, + "pnlcomm": 73.63214658626731, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.07278397148802, + "entry_time": "2020-04-08T00:00:00", + "exit_price": 99.84957817071898, + "exit_time": "2020-04-09T00:00:00", + "gross_pnl": -122.3205800769037, + "pnl": -122.3205800769037, + "pnlcomm": -122.3205800769037, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.66685696016805, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 100.29703959359377, + "exit_time": "2020-04-12T00:00:00", + "gross_pnl": 63.018263342571856, + "pnl": 63.018263342571856, + "pnlcomm": 63.018263342571856, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.16284479663989, + "entry_time": "2020-04-14T00:00:00", + "exit_price": 99.59827392536462, + "exit_time": "2020-04-15T00:00:00", + "gross_pnl": -56.457087127526506, + "pnl": -56.457087127526506, + "pnlcomm": -56.457087127526506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.02427769637677, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 100.02034152325665, + "exit_time": "2020-04-18T00:00:00", + "gross_pnl": -0.39361731201239536, + "pnl": -0.39361731201239536, + "pnlcomm": -0.39361731201239536, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.10227360972624, + "entry_time": "2020-04-20T00:00:00", + "exit_price": 99.55074957264794, + "exit_time": "2020-04-21T00:00:00", + "gross_pnl": -55.15240370782948, + "pnl": -55.15240370782948, + "pnlcomm": -55.15240370782948, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4752285310497, + "entry_time": "2020-04-23T00:00:00", + "exit_price": 100.78482968977629, + "exit_time": "2020-04-24T00:00:00", + "gross_pnl": 30.960115872659344, + "pnl": 30.960115872659344, + "pnlcomm": 30.960115872659344, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64550269913406, + "entry_time": "2020-04-26T00:00:00", + "exit_price": 100.75829920829567, + "exit_time": "2020-04-27T00:00:00", + "gross_pnl": 11.279650916161188, + "pnl": 11.279650916161188, + "pnlcomm": 11.279650916161188, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.28405624956507, + "entry_time": "2020-04-29T00:00:00", + "exit_price": 100.40750734980367, + "exit_time": "2020-04-30T00:00:00", + "gross_pnl": 12.345110023859718, + "pnl": 12.345110023859718, + "pnlcomm": 12.345110023859718, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.9736108084372, + "entry_time": "2020-05-02T00:00:00", + "exit_price": 99.11719582995507, + "exit_time": "2020-05-03T00:00:00", + "gross_pnl": -185.64149784821353, + "pnl": -185.64149784821353, + "pnlcomm": -185.64149784821353, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.42442738415961, + "entry_time": "2020-05-05T00:00:00", + "exit_price": 100.46803368609852, + "exit_time": "2020-05-06T00:00:00", + "gross_pnl": 4.360630193890813, + "pnl": 4.360630193890813, + "pnlcomm": 4.360630193890813, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.65390080108091, + "entry_time": "2020-05-08T00:00:00", + "exit_price": 101.55529329412784, + "exit_time": "2020-05-09T00:00:00", + "gross_pnl": 90.13924930469273, + "pnl": 90.13924930469273, + "pnlcomm": 90.13924930469273, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.84475344760442, + "entry_time": "2020-05-11T00:00:00", + "exit_price": 101.34547532849058, + "exit_time": "2020-05-12T00:00:00", + "gross_pnl": 50.07218808861609, + "pnl": 50.07218808861609, + "pnlcomm": 50.07218808861609, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.83286932713185, + "entry_time": "2020-05-14T00:00:00", + "exit_price": 100.1414110724743, + "exit_time": "2020-05-15T00:00:00", + "gross_pnl": -69.14582546575474, + "pnl": -69.14582546575474, + "pnlcomm": -69.14582546575474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.70880723169135, + "entry_time": "2020-05-17T00:00:00", + "exit_price": 100.37107171120154, + "exit_time": "2020-05-18T00:00:00", + "gross_pnl": -33.773552048981514, + "pnl": -33.773552048981514, + "pnlcomm": -33.773552048981514, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17212988349165, + "entry_time": "2020-05-20T00:00:00", + "exit_price": 100.88968353827181, + "exit_time": "2020-05-21T00:00:00", + "gross_pnl": 171.75536547801613, + "pnl": 171.75536547801613, + "pnlcomm": 171.75536547801613, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17974473578754, + "entry_time": "2020-05-23T00:00:00", + "exit_price": 99.64495810760246, + "exit_time": "2020-05-24T00:00:00", + "gross_pnl": 46.521337181492584, + "pnl": 46.521337181492584, + "pnlcomm": 46.521337181492584, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86042757757674, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 99.42922022261914, + "exit_time": "2020-05-27T00:00:00", + "gross_pnl": 56.8792645042393, + "pnl": 56.8792645042393, + "pnlcomm": 56.8792645042393, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67123710700702, + "entry_time": "2020-05-29T00:00:00", + "exit_price": 99.1262468099545, + "exit_time": "2020-05-30T00:00:00", + "gross_pnl": 45.500970294747844, + "pnl": 45.500970294747844, + "pnlcomm": 45.500970294747844, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99803204217791, + "entry_time": "2020-06-01T00:00:00", + "exit_price": 98.0746490327229, + "exit_time": "2020-06-02T00:00:00", + "gross_pnl": 7.661699054499138, + "pnl": 7.661699054499138, + "pnlcomm": 7.661699054499138, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68852164950059, + "entry_time": "2020-06-04T00:00:00", + "exit_price": 98.90683245619206, + "exit_time": "2020-06-05T00:00:00", + "gross_pnl": 21.831080669147696, + "pnl": 21.831080669147696, + "pnlcomm": 21.831080669147696, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.6986709588789, + "entry_time": "2020-06-07T00:00:00", + "exit_price": 98.58028409299915, + "exit_time": "2020-06-08T00:00:00", + "gross_pnl": -11.838686587975644, + "pnl": -11.838686587975644, + "pnlcomm": -11.838686587975644, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78930171959787, + "entry_time": "2020-06-10T00:00:00", + "exit_price": 99.44349309161046, + "exit_time": "2020-06-11T00:00:00", + "gross_pnl": 65.41913720125905, + "pnl": 65.41913720125905, + "pnlcomm": 65.41913720125905, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.63928948741085, + "entry_time": "2020-06-13T00:00:00", + "exit_price": 99.8801021064717, + "exit_time": "2020-06-14T00:00:00", + "gross_pnl": 24.081261906084706, + "pnl": 24.081261906084706, + "pnlcomm": 24.081261906084706, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88804895153031, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 98.9129584357738, + "exit_time": "2020-06-17T00:00:00", + "gross_pnl": 2.490948424349426, + "pnl": 2.490948424349426, + "pnlcomm": 2.490948424349426, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.35911188288487, + "entry_time": "2020-06-19T00:00:00", + "exit_price": 99.55107978610341, + "exit_time": "2020-06-20T00:00:00", + "gross_pnl": 19.196790321853996, + "pnl": 19.196790321853996, + "pnlcomm": 19.196790321853996, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.24566283787111, + "entry_time": "2020-06-22T00:00:00", + "exit_price": 99.50854335078685, + "exit_time": "2020-06-23T00:00:00", + "gross_pnl": 26.288051291574277, + "pnl": 26.288051291574277, + "pnlcomm": 26.288051291574277, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85972377687798, + "entry_time": "2020-06-25T00:00:00", + "exit_price": 98.94180161552265, + "exit_time": "2020-06-26T00:00:00", + "gross_pnl": 8.207783864466478, + "pnl": 8.207783864466478, + "pnlcomm": 8.207783864466478, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42256786175977, + "entry_time": "2020-06-28T00:00:00", + "exit_price": 98.39260868907034, + "exit_time": "2020-06-29T00:00:00", + "gross_pnl": -2.99591726894306, + "pnl": -2.99591726894306, + "pnlcomm": -2.99591726894306, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47598985042309, + "entry_time": "2020-07-01T00:00:00", + "exit_price": 98.2217481384577, + "exit_time": "2020-07-02T00:00:00", + "gross_pnl": -25.42417119653919, + "pnl": -25.42417119653919, + "pnlcomm": -25.42417119653919, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43771261461684, + "entry_time": "2020-07-04T00:00:00", + "exit_price": 99.25556396259081, + "exit_time": "2020-07-05T00:00:00", + "gross_pnl": -18.214865202602937, + "pnl": -18.214865202602937, + "pnlcomm": -18.214865202602937, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27520136851216, + "entry_time": "2020-07-07T00:00:00", + "exit_price": 99.22895283520214, + "exit_time": "2020-07-08T00:00:00", + "gross_pnl": -4.624853331002043, + "pnl": -4.624853331002043, + "pnlcomm": -4.624853331002043, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84721164221584, + "entry_time": "2020-07-10T00:00:00", + "exit_price": 98.21690016032666, + "exit_time": "2020-07-11T00:00:00", + "gross_pnl": -63.031148188917996, + "pnl": -63.031148188917996, + "pnlcomm": -63.031148188917996, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98012439288168, + "entry_time": "2020-07-13T00:00:00", + "exit_price": 98.42241300564716, + "exit_time": "2020-07-14T00:00:00", + "gross_pnl": -55.77113872345194, + "pnl": -55.77113872345194, + "pnlcomm": -55.77113872345194, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.52349736477139, + "entry_time": "2020-07-16T00:00:00", + "exit_price": 98.84780174120549, + "exit_time": "2020-07-17T00:00:00", + "gross_pnl": -67.56956235659004, + "pnl": -67.56956235659004, + "pnlcomm": -67.56956235659004, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78357735159078, + "entry_time": "2020-07-19T00:00:00", + "exit_price": 98.5180376571157, + "exit_time": "2020-07-20T00:00:00", + "gross_pnl": -26.553969447508052, + "pnl": -26.553969447508052, + "pnlcomm": -26.553969447508052, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07885735340791, + "entry_time": "2020-07-22T00:00:00", + "exit_price": 98.46287786089891, + "exit_time": "2020-07-23T00:00:00", + "gross_pnl": 38.40205074910017, + "pnl": 38.40205074910017, + "pnlcomm": 38.40205074910017, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7806750796624, + "entry_time": "2020-07-25T00:00:00", + "exit_price": 98.99007562374577, + "exit_time": "2020-07-26T00:00:00", + "gross_pnl": 20.94005440833655, + "pnl": 20.94005440833655, + "pnlcomm": 20.94005440833655, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3160405598432, + "entry_time": "2020-07-28T00:00:00", + "exit_price": 97.69515591162462, + "exit_time": "2020-07-29T00:00:00", + "gross_pnl": -62.08846482185777, + "pnl": -62.08846482185777, + "pnlcomm": -62.08846482185777, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.9307950005457, + "entry_time": "2020-07-31T00:00:00", + "exit_price": 97.49497584845733, + "exit_time": "2020-08-01T00:00:00", + "gross_pnl": -43.581915208837074, + "pnl": -43.581915208837074, + "pnlcomm": -43.581915208837074, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.05277773908537, + "entry_time": "2020-08-03T00:00:00", + "exit_price": 97.63017059410102, + "exit_time": "2020-08-04T00:00:00", + "gross_pnl": -42.26071449843545, + "pnl": -42.26071449843545, + "pnlcomm": -42.26071449843545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.95560584181007, + "entry_time": "2020-08-06T00:00:00", + "exit_price": 97.85704345214471, + "exit_time": "2020-08-07T00:00:00", + "gross_pnl": -109.85623896653607, + "pnl": -109.85623896653607, + "pnlcomm": -109.85623896653607, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.34581983849665, + "entry_time": "2020-08-09T00:00:00", + "exit_price": 98.55148937480453, + "exit_time": "2020-08-10T00:00:00", + "gross_pnl": 120.56695363078802, + "pnl": 120.56695363078802, + "pnlcomm": 120.56695363078802, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.83406196186097, + "entry_time": "2020-08-12T00:00:00", + "exit_price": 97.25669377064881, + "exit_time": "2020-08-13T00:00:00", + "gross_pnl": -57.73681912121589, + "pnl": -57.73681912121589, + "pnlcomm": -57.73681912121589, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.51637945271536, + "entry_time": "2020-08-15T00:00:00", + "exit_price": 97.57103396676897, + "exit_time": "2020-08-16T00:00:00", + "gross_pnl": 5.465451405360966, + "pnl": 5.465451405360966, + "pnlcomm": 5.465451405360966, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.4383018584174, + "entry_time": "2020-08-18T00:00:00", + "exit_price": 98.4155507445711, + "exit_time": "2020-08-19T00:00:00", + "gross_pnl": -2.2751113846297244, + "pnl": -2.2751113846297244, + "pnlcomm": -2.2751113846297244, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.92267680402585, + "entry_time": "2020-08-21T00:00:00", + "exit_price": 98.75883349843212, + "exit_time": "2020-08-22T00:00:00", + "gross_pnl": 83.61566944062702, + "pnl": 83.61566944062702, + "pnlcomm": 83.61566944062702, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.974264479532, + "entry_time": "2020-08-24T00:00:00", + "exit_price": 99.70988332181, + "exit_time": "2020-08-25T00:00:00", + "gross_pnl": 173.56188422780008, + "pnl": 173.56188422780008, + "pnlcomm": 173.56188422780008, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21365266173217, + "entry_time": "2020-08-27T00:00:00", + "exit_price": 98.08294324004585, + "exit_time": "2020-08-28T00:00:00", + "gross_pnl": -113.07094216863192, + "pnl": -113.07094216863192, + "pnlcomm": -113.07094216863192, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11928874045203, + "entry_time": "2020-08-30T00:00:00", + "exit_price": 98.31180164071337, + "exit_time": "2020-08-31T00:00:00", + "gross_pnl": 19.25129002613346, + "pnl": 19.25129002613346, + "pnlcomm": 19.25129002613346, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.00054275724283, + "entry_time": "2020-09-02T00:00:00", + "exit_price": 98.65255133629894, + "exit_time": "2020-09-03T00:00:00", + "gross_pnl": 65.20085790561154, + "pnl": 65.20085790561154, + "pnlcomm": 65.20085790561154, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96503242935937, + "entry_time": "2020-09-05T00:00:00", + "exit_price": 98.79138811772025, + "exit_time": "2020-09-06T00:00:00", + "gross_pnl": -17.364431163912286, + "pnl": -17.364431163912286, + "pnlcomm": -17.364431163912286, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.47378044689603, + "entry_time": "2020-09-08T00:00:00", + "exit_price": 98.31284487928606, + "exit_time": "2020-09-09T00:00:00", + "gross_pnl": -116.09355676099682, + "pnl": -116.09355676099682, + "pnlcomm": -116.09355676099682, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.73200506980342, + "entry_time": "2020-09-11T00:00:00", + "exit_price": 98.3363427106496, + "exit_time": "2020-09-12T00:00:00", + "gross_pnl": 60.43376408461825, + "pnl": 60.43376408461825, + "pnlcomm": 60.43376408461825, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.56611574901736, + "entry_time": "2020-09-14T00:00:00", + "exit_price": 98.13272204200155, + "exit_time": "2020-09-15T00:00:00", + "gross_pnl": -43.339370701581004, + "pnl": -43.339370701581004, + "pnlcomm": -43.339370701581004, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.89963627791985, + "entry_time": "2020-09-17T00:00:00", + "exit_price": 98.38755792776327, + "exit_time": "2020-09-18T00:00:00", + "gross_pnl": 148.79216498434147, + "pnl": 148.79216498434147, + "pnlcomm": 148.79216498434147, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.35474381234252, + "entry_time": "2020-09-20T00:00:00", + "exit_price": 98.97868642263799, + "exit_time": "2020-09-21T00:00:00", + "gross_pnl": 62.39426102954724, + "pnl": 62.39426102954724, + "pnlcomm": 62.39426102954724, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.11962753041762, + "entry_time": "2020-09-23T00:00:00", + "exit_price": 99.25728100943367, + "exit_time": "2020-09-24T00:00:00", + "gross_pnl": 13.765347901605196, + "pnl": 13.765347901605196, + "pnlcomm": 13.765347901605196, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.076645155786, + "entry_time": "2020-09-26T00:00:00", + "exit_price": 99.1361736846976, + "exit_time": "2020-09-27T00:00:00", + "gross_pnl": 5.952852891159921, + "pnl": 5.952852891159921, + "pnlcomm": 5.952852891159921, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.9576189114394, + "entry_time": "2020-09-29T00:00:00", + "exit_price": 99.38251520181134, + "exit_time": "2020-09-30T00:00:00", + "gross_pnl": 42.48962903719473, + "pnl": 42.48962903719473, + "pnlcomm": 42.48962903719473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.58405172820402, + "entry_time": "2020-10-02T00:00:00", + "exit_price": 100.1825648349693, + "exit_time": "2020-10-03T00:00:00", + "gross_pnl": 59.85131067652816, + "pnl": 59.85131067652816, + "pnlcomm": 59.85131067652816, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31778631274507, + "entry_time": "2020-10-05T00:00:00", + "exit_price": 98.92748490697555, + "exit_time": "2020-10-06T00:00:00", + "gross_pnl": -39.03014057695202, + "pnl": -39.03014057695202, + "pnlcomm": -39.03014057695202, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11485299409067, + "entry_time": "2020-10-08T00:00:00", + "exit_price": 97.46828746700024, + "exit_time": "2020-10-09T00:00:00", + "gross_pnl": -64.65655270904307, + "pnl": -64.65655270904307, + "pnlcomm": -64.65655270904307, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7892083341232, + "entry_time": "2020-10-11T00:00:00", + "exit_price": 99.2850707768965, + "exit_time": "2020-10-12T00:00:00", + "gross_pnl": 149.58624427733014, + "pnl": 149.58624427733014, + "pnlcomm": 149.58624427733014, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.61528686513479, + "entry_time": "2020-10-14T00:00:00", + "exit_price": 98.16045065160826, + "exit_time": "2020-10-15T00:00:00", + "gross_pnl": 54.51637864734664, + "pnl": 54.51637864734664, + "pnlcomm": 54.51637864734664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98923853245553, + "entry_time": "2020-10-17T00:00:00", + "exit_price": 97.78083136801966, + "exit_time": "2020-10-18T00:00:00", + "gross_pnl": -20.84071644358687, + "pnl": -20.84071644358687, + "pnlcomm": -20.84071644358687, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98736762370623, + "entry_time": "2020-10-20T00:00:00", + "exit_price": 98.41242668783207, + "exit_time": "2020-10-21T00:00:00", + "gross_pnl": 42.50590641258327, + "pnl": 42.50590641258327, + "pnlcomm": 42.50590641258327, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7821059253462, + "entry_time": "2020-10-23T00:00:00", + "exit_price": 98.01676230346942, + "exit_time": "2020-10-24T00:00:00", + "gross_pnl": -76.53436218767808, + "pnl": -76.53436218767808, + "pnlcomm": -76.53436218767808, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.90986422948514, + "entry_time": "2020-10-26T00:00:00", + "exit_price": 98.85698353324744, + "exit_time": "2020-10-27T00:00:00", + "gross_pnl": -5.288069623769331, + "pnl": -5.288069623769331, + "pnlcomm": -5.288069623769331, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.72982041802001, + "entry_time": "2020-10-29T00:00:00", + "exit_price": 98.60761748093444, + "exit_time": "2020-10-30T00:00:00", + "gross_pnl": -12.220293708557506, + "pnl": -12.220293708557506, + "pnlcomm": -12.220293708557506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.0385605171193, + "entry_time": "2020-11-01T00:00:00", + "exit_price": 99.09198940082088, + "exit_time": "2020-11-02T00:00:00", + "gross_pnl": 5.342888370158505, + "pnl": 5.342888370158505, + "pnlcomm": 5.342888370158505, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21597248424331, + "entry_time": "2020-11-04T00:00:00", + "exit_price": 98.490691270523, + "exit_time": "2020-11-05T00:00:00", + "gross_pnl": -72.5281213720308, + "pnl": -72.5281213720308, + "pnlcomm": -72.5281213720308, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.2706953210234, + "entry_time": "2020-11-07T00:00:00", + "exit_price": 98.23704650718707, + "exit_time": "2020-11-08T00:00:00", + "gross_pnl": -3.3648813836322233, + "pnl": -3.3648813836322233, + "pnlcomm": -3.3648813836322233, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30522444084696, + "entry_time": "2020-11-10T00:00:00", + "exit_price": 97.82731858826378, + "exit_time": "2020-11-11T00:00:00", + "gross_pnl": 52.20941474168228, + "pnl": 52.20941474168228, + "pnlcomm": 52.20941474168228, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91407429365688, + "entry_time": "2020-11-13T00:00:00", + "exit_price": 98.5460351903365, + "exit_time": "2020-11-14T00:00:00", + "gross_pnl": -36.80391033203847, + "pnl": -36.80391033203847, + "pnlcomm": -36.80391033203847, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.93028933684711, + "entry_time": "2020-11-16T00:00:00", + "exit_price": 99.0553633238757, + "exit_time": "2020-11-17T00:00:00", + "gross_pnl": 12.507398702858552, + "pnl": 12.507398702858552, + "pnlcomm": 12.507398702858552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47484452500944, + "entry_time": "2020-11-19T00:00:00", + "exit_price": 98.10094020807114, + "exit_time": "2020-11-20T00:00:00", + "gross_pnl": -37.390431693830806, + "pnl": -37.390431693830806, + "pnlcomm": -37.390431693830806, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01428360585086, + "entry_time": "2020-11-22T00:00:00", + "exit_price": 97.38292648890776, + "exit_time": "2020-11-23T00:00:00", + "gross_pnl": -163.13571169431071, + "pnl": -163.13571169431071, + "pnlcomm": -163.13571169431071, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48513559668872, + "entry_time": "2020-11-25T00:00:00", + "exit_price": 97.27497370614257, + "exit_time": "2020-11-26T00:00:00", + "gross_pnl": -121.01618905461464, + "pnl": -121.01618905461464, + "pnlcomm": -121.01618905461464, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.14886606297294, + "entry_time": "2020-11-28T00:00:00", + "exit_price": 98.29611163730506, + "exit_time": "2020-11-29T00:00:00", + "gross_pnl": 14.724557433211771, + "pnl": 14.724557433211771, + "pnlcomm": 14.724557433211771, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.23350982317787, + "entry_time": "2020-12-01T00:00:00", + "exit_price": 97.79948982072462, + "exit_time": "2020-12-02T00:00:00", + "gross_pnl": 56.59799975467479, + "pnl": 56.59799975467479, + "pnlcomm": 56.59799975467479, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98472225444857, + "entry_time": "2020-12-04T00:00:00", + "exit_price": 97.71079305814114, + "exit_time": "2020-12-05T00:00:00", + "gross_pnl": -27.392919630743506, + "pnl": -27.392919630743506, + "pnlcomm": -27.392919630743506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3396263042363, + "entry_time": "2020-12-07T00:00:00", + "exit_price": 97.98172498582129, + "exit_time": "2020-12-08T00:00:00", + "gross_pnl": -35.790131841501704, + "pnl": -35.790131841501704, + "pnlcomm": -35.790131841501704, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.42795373397291, + "entry_time": "2020-12-10T00:00:00", + "exit_price": 96.6321305493393, + "exit_time": "2020-12-11T00:00:00", + "gross_pnl": -79.5823184633619, + "pnl": -79.5823184633619, + "pnlcomm": -79.5823184633619, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76479352938595, + "entry_time": "2020-12-13T00:00:00", + "exit_price": 98.48958247666039, + "exit_time": "2020-12-14T00:00:00", + "gross_pnl": 172.47889472744333, + "pnl": 172.47889472744333, + "pnlcomm": 172.47889472744333, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.73111789636546, + "entry_time": "2020-12-16T00:00:00", + "exit_price": 97.61885876679554, + "exit_time": "2020-12-17T00:00:00", + "gross_pnl": 88.77408704300791, + "pnl": 88.77408704300791, + "pnlcomm": 88.77408704300791, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.85401562603096, + "entry_time": "2020-12-19T00:00:00", + "exit_price": 96.49175141105385, + "exit_time": "2020-12-20T00:00:00", + "gross_pnl": -136.22642149771025, + "pnl": -136.22642149771025, + "pnlcomm": -136.22642149771025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.84289871423181, + "entry_time": "2020-12-22T00:00:00", + "exit_price": 96.99377199128872, + "exit_time": "2020-12-23T00:00:00", + "gross_pnl": -84.91267229430832, + "pnl": -84.91267229430832, + "pnlcomm": -84.91267229430832, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76186428614056, + "entry_time": "2020-12-25T00:00:00", + "exit_price": 96.48850513355184, + "exit_time": "2020-12-26T00:00:00", + "gross_pnl": -27.33591525887249, + "pnl": -27.33591525887249, + "pnlcomm": -27.33591525887249, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.12395315196963, + "entry_time": "2020-12-28T00:00:00", + "exit_price": 97.53863571252707, + "exit_time": "2020-12-29T00:00:00", + "gross_pnl": 41.46825605574378, + "pnl": 41.46825605574378, + "pnlcomm": 41.46825605574378, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6026762767146, + "entry_time": "2020-12-31T00:00:00", + "exit_price": 97.09752132137899, + "exit_time": "2021-01-01T00:00:00", + "gross_pnl": -50.51549553356125, + "pnl": -50.51549553356125, + "pnlcomm": -50.51549553356125, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.4927463612385, + "entry_time": "2021-01-03T00:00:00", + "exit_price": 96.82226372897985, + "exit_time": "2021-01-04T00:00:00", + "gross_pnl": -67.04826322586541, + "pnl": -67.04826322586541, + "pnlcomm": -67.04826322586541, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.79148532437995, + "entry_time": "2021-01-06T00:00:00", + "exit_price": 97.11483711173116, + "exit_time": "2021-01-07T00:00:00", + "gross_pnl": 32.33517873512142, + "pnl": 32.33517873512142, + "pnlcomm": 32.33517873512142, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.80033950220171, + "entry_time": "2021-01-09T00:00:00", + "exit_price": 96.63729064888537, + "exit_time": "2021-01-10T00:00:00", + "gross_pnl": 83.69511466836599, + "pnl": 83.69511466836599, + "pnlcomm": 83.69511466836599, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.11575917668634, + "entry_time": "2021-01-12T00:00:00", + "exit_price": 96.28032546622858, + "exit_time": "2021-01-13T00:00:00", + "gross_pnl": 16.456628954223618, + "pnl": 16.456628954223618, + "pnlcomm": 16.456628954223618, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.53344904132358, + "entry_time": "2021-01-15T00:00:00", + "exit_price": 97.29557459823668, + "exit_time": "2021-01-16T00:00:00", + "gross_pnl": 76.21255569131051, + "pnl": 76.21255569131051, + "pnlcomm": 76.21255569131051, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.01730754421833, + "entry_time": "2021-01-18T00:00:00", + "exit_price": 96.07935604760307, + "exit_time": "2021-01-19T00:00:00", + "gross_pnl": 6.204850338474444, + "pnl": 6.204850338474444, + "pnlcomm": 6.204850338474444, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.79620422510413, + "entry_time": "2021-01-21T00:00:00", + "exit_price": 95.24797305894252, + "exit_time": "2021-01-22T00:00:00", + "gross_pnl": -54.82311661616137, + "pnl": -54.82311661616137, + "pnlcomm": -54.82311661616137, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.19373825703377, + "entry_time": "2021-01-24T00:00:00", + "exit_price": 95.40514794332339, + "exit_time": "2021-01-25T00:00:00", + "gross_pnl": 21.140968628961332, + "pnl": 21.140968628961332, + "pnlcomm": 21.140968628961332, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.55648566288775, + "entry_time": "2021-01-27T00:00:00", + "exit_price": 96.55716667120137, + "exit_time": "2021-01-28T00:00:00", + "gross_pnl": 100.06810083136202, + "pnl": 100.06810083136202, + "pnlcomm": 100.06810083136202, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.91494018138197, + "entry_time": "2021-01-30T00:00:00", + "exit_price": 95.48501201892987, + "exit_time": "2021-01-31T00:00:00", + "gross_pnl": 57.00718375478999, + "pnl": 57.00718375478999, + "pnlcomm": 57.00718375478999, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.90008526748947, + "entry_time": "2021-02-02T00:00:00", + "exit_price": 95.83721845974864, + "exit_time": "2021-02-03T00:00:00", + "gross_pnl": -6.286680774083209, + "pnl": -6.286680774083209, + "pnlcomm": -6.286680774083209, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26504549069784, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 96.06840340797214, + "exit_time": "2021-02-06T00:00:00", + "gross_pnl": 80.33579172742975, + "pnl": 80.33579172742975, + "pnlcomm": 80.33579172742975, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26053581327312, + "entry_time": "2021-02-08T00:00:00", + "exit_price": 95.42454996605802, + "exit_time": "2021-02-09T00:00:00", + "gross_pnl": 16.401415278490106, + "pnl": 16.401415278490106, + "pnlcomm": 16.401415278490106, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94825682250638, + "entry_time": "2021-02-11T00:00:00", + "exit_price": 95.05109746301979, + "exit_time": "2021-02-12T00:00:00", + "gross_pnl": 10.284064051340636, + "pnl": 10.284064051340636, + "pnlcomm": 10.284064051340636, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1969266603545, + "entry_time": "2021-02-14T00:00:00", + "exit_price": 96.27193710609464, + "exit_time": "2021-02-15T00:00:00", + "gross_pnl": 7.501044574013349, + "pnl": 7.501044574013349, + "pnlcomm": 7.501044574013349, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97039812035842, + "entry_time": "2021-02-17T00:00:00", + "exit_price": 96.34802647272141, + "exit_time": "2021-02-18T00:00:00", + "gross_pnl": -62.237164763701, + "pnl": -62.237164763701, + "pnlcomm": -62.237164763701, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.07904244701469, + "entry_time": "2021-02-20T00:00:00", + "exit_price": 96.79316819026657, + "exit_time": "2021-02-21T00:00:00", + "gross_pnl": -28.587425674811584, + "pnl": -28.587425674811584, + "pnlcomm": -28.587425674811584, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5721771606179, + "entry_time": "2021-02-23T00:00:00", + "exit_price": 95.6253449835299, + "exit_time": "2021-02-24T00:00:00", + "gross_pnl": 5.316782291200184, + "pnl": 5.316782291200184, + "pnlcomm": 5.316782291200184, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88599336671724, + "entry_time": "2021-02-26T00:00:00", + "exit_price": 93.9167314813735, + "exit_time": "2021-02-27T00:00:00", + "gross_pnl": -96.92618853437409, + "pnl": -96.92618853437409, + "pnlcomm": -96.92618853437409, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23555143341264, + "entry_time": "2021-03-01T00:00:00", + "exit_price": 94.69172330670986, + "exit_time": "2021-03-02T00:00:00", + "gross_pnl": -54.38281267027776, + "pnl": -54.38281267027776, + "pnlcomm": -54.38281267027776, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.40326355089037, + "entry_time": "2021-03-04T00:00:00", + "exit_price": 94.32320287324674, + "exit_time": "2021-03-05T00:00:00", + "gross_pnl": -8.006067764362967, + "pnl": -8.006067764362967, + "pnlcomm": -8.006067764362967, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32022315669313, + "entry_time": "2021-03-07T00:00:00", + "exit_price": 94.22613575397045, + "exit_time": "2021-03-08T00:00:00", + "gross_pnl": -9.408740272267835, + "pnl": -9.408740272267835, + "pnlcomm": -9.408740272267835, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.08195298394907, + "entry_time": "2021-03-10T00:00:00", + "exit_price": 94.5883765126535, + "exit_time": "2021-03-11T00:00:00", + "gross_pnl": -49.35764712955688, + "pnl": -49.35764712955688, + "pnlcomm": -49.35764712955688, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6323490375275, + "entry_time": "2021-03-13T00:00:00", + "exit_price": 95.0747399163529, + "exit_time": "2021-03-14T00:00:00", + "gross_pnl": 44.23908788253925, + "pnl": 44.23908788253925, + "pnlcomm": 44.23908788253925, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.55723413541229, + "entry_time": "2021-03-16T00:00:00", + "exit_price": 94.78282068603487, + "exit_time": "2021-03-17T00:00:00", + "gross_pnl": 22.558655062258026, + "pnl": 22.558655062258026, + "pnlcomm": 22.558655062258026, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66145085922012, + "entry_time": "2021-03-19T00:00:00", + "exit_price": 95.46346097050873, + "exit_time": "2021-03-20T00:00:00", + "gross_pnl": 180.20101112886096, + "pnl": 180.20101112886096, + "pnlcomm": 180.20101112886096, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.00404625454874, + "entry_time": "2021-03-22T00:00:00", + "exit_price": 94.66092881844988, + "exit_time": "2021-03-23T00:00:00", + "gross_pnl": -34.31174360988649, + "pnl": -34.31174360988649, + "pnlcomm": -34.31174360988649, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.49919123199933, + "entry_time": "2021-03-25T00:00:00", + "exit_price": 93.97621398907071, + "exit_time": "2021-03-26T00:00:00", + "gross_pnl": -152.29772429286186, + "pnl": -152.29772429286186, + "pnlcomm": -152.29772429286186, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41257974165285, + "entry_time": "2021-03-28T00:00:00", + "exit_price": 95.05124864668421, + "exit_time": "2021-03-29T00:00:00", + "gross_pnl": 63.86689050313663, + "pnl": 63.86689050313663, + "pnlcomm": 63.86689050313663, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01899188310071, + "entry_time": "2021-03-31T00:00:00", + "exit_price": 94.2559389154428, + "exit_time": "2021-04-01T00:00:00", + "gross_pnl": 23.694703234208703, + "pnl": 23.694703234208703, + "pnlcomm": 23.694703234208703, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12609495739092, + "entry_time": "2021-04-03T00:00:00", + "exit_price": 94.25576346468043, + "exit_time": "2021-04-04T00:00:00", + "gross_pnl": 12.966850728950874, + "pnl": 12.966850728950874, + "pnlcomm": 12.966850728950874, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4705053051443, + "entry_time": "2021-04-06T00:00:00", + "exit_price": 93.72410136704386, + "exit_time": "2021-04-07T00:00:00", + "gross_pnl": 25.35960618995574, + "pnl": 25.35960618995574, + "pnlcomm": 25.35960618995574, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19884636287924, + "entry_time": "2021-04-09T00:00:00", + "exit_price": 93.86432033375576, + "exit_time": "2021-04-10T00:00:00", + "gross_pnl": 66.54739708765192, + "pnl": 66.54739708765192, + "pnlcomm": 66.54739708765192, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34050558738045, + "entry_time": "2021-04-12T00:00:00", + "exit_price": 94.10587138419956, + "exit_time": "2021-04-13T00:00:00", + "gross_pnl": 76.53657968191112, + "pnl": 76.53657968191112, + "pnlcomm": 76.53657968191112, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72930751574246, + "entry_time": "2021-04-15T00:00:00", + "exit_price": 93.2563942182136, + "exit_time": "2021-04-16T00:00:00", + "gross_pnl": -47.29132975288621, + "pnl": -47.29132975288621, + "pnlcomm": -47.29132975288621, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59980860135867, + "entry_time": "2021-04-18T00:00:00", + "exit_price": 94.54277270362402, + "exit_time": "2021-04-19T00:00:00", + "gross_pnl": 94.29641022653499, + "pnl": 94.29641022653499, + "pnlcomm": 94.29641022653499, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92591784638046, + "entry_time": "2021-04-21T00:00:00", + "exit_price": 94.14258894906092, + "exit_time": "2021-04-22T00:00:00", + "gross_pnl": 121.66711026804649, + "pnl": 121.66711026804649, + "pnlcomm": 121.66711026804649, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11423308566697, + "entry_time": "2021-04-24T00:00:00", + "exit_price": 93.03147452036931, + "exit_time": "2021-04-25T00:00:00", + "gross_pnl": -108.27585652976524, + "pnl": -108.27585652976524, + "pnlcomm": -108.27585652976524, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9724517338113, + "entry_time": "2021-04-27T00:00:00", + "exit_price": 93.49318704896336, + "exit_time": "2021-04-28T00:00:00", + "gross_pnl": -147.92646848479336, + "pnl": -147.92646848479336, + "pnlcomm": -147.92646848479336, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68468709145579, + "entry_time": "2021-04-30T00:00:00", + "exit_price": 93.32003795658395, + "exit_time": "2021-05-01T00:00:00", + "gross_pnl": -36.46491348718399, + "pnl": -36.46491348718399, + "pnlcomm": -36.46491348718399, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26674166444458, + "entry_time": "2021-05-03T00:00:00", + "exit_price": 94.26630934814936, + "exit_time": "2021-05-04T00:00:00", + "gross_pnl": -0.043231629521756076, + "pnl": -0.043231629521756076, + "pnlcomm": -0.043231629521756076, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.41533319810328, + "entry_time": "2021-05-06T00:00:00", + "exit_price": 93.36350758058099, + "exit_time": "2021-05-07T00:00:00", + "gross_pnl": -5.182561752229731, + "pnl": -5.182561752229731, + "pnlcomm": -5.182561752229731, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.16332285120929, + "entry_time": "2021-05-09T00:00:00", + "exit_price": 94.34043899579565, + "exit_time": "2021-05-10T00:00:00", + "gross_pnl": 17.711614458636404, + "pnl": 17.711614458636404, + "pnlcomm": 17.711614458636404, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74219820454567, + "entry_time": "2021-05-12T00:00:00", + "exit_price": 94.55413171456674, + "exit_time": "2021-05-13T00:00:00", + "gross_pnl": 81.19335100210634, + "pnl": 81.19335100210634, + "pnlcomm": 81.19335100210634, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58180279933771, + "entry_time": "2021-05-15T00:00:00", + "exit_price": 94.02408626223293, + "exit_time": "2021-05-16T00:00:00", + "gross_pnl": 44.22834628952188, + "pnl": 44.22834628952188, + "pnlcomm": 44.22834628952188, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87657341045228, + "entry_time": "2021-05-18T00:00:00", + "exit_price": 94.55590567361484, + "exit_time": "2021-05-19T00:00:00", + "gross_pnl": 67.93322631625642, + "pnl": 67.93322631625642, + "pnlcomm": 67.93322631625642, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08074161986468, + "entry_time": "2021-05-21T00:00:00", + "exit_price": 93.80457382221171, + "exit_time": "2021-05-22T00:00:00", + "gross_pnl": 72.3832202347026, + "pnl": 72.3832202347026, + "pnlcomm": 72.3832202347026, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8131686939551, + "entry_time": "2021-05-24T00:00:00", + "exit_price": 93.25793142134573, + "exit_time": "2021-05-25T00:00:00", + "gross_pnl": 44.476272739062495, + "pnl": 44.476272739062495, + "pnlcomm": 44.476272739062495, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95253144170447, + "entry_time": "2021-05-27T00:00:00", + "exit_price": 93.14743781912107, + "exit_time": "2021-05-28T00:00:00", + "gross_pnl": 19.490637741660066, + "pnl": 19.490637741660066, + "pnlcomm": 19.490637741660066, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87835645740229, + "entry_time": "2021-05-30T00:00:00", + "exit_price": 92.9764387193147, + "exit_time": "2021-05-31T00:00:00", + "gross_pnl": 9.808226191240976, + "pnl": 9.808226191240976, + "pnlcomm": 9.808226191240976, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94516537050167, + "entry_time": "2021-06-02T00:00:00", + "exit_price": 92.89603764932446, + "exit_time": "2021-06-03T00:00:00", + "gross_pnl": -4.912772117721431, + "pnl": -4.912772117721431, + "pnlcomm": -4.912772117721431, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63800292429943, + "entry_time": "2021-06-05T00:00:00", + "exit_price": 93.24337208101042, + "exit_time": "2021-06-06T00:00:00", + "gross_pnl": 160.53691567109922, + "pnl": 160.53691567109922, + "pnlcomm": 160.53691567109922, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59556244009269, + "entry_time": "2021-06-08T00:00:00", + "exit_price": 91.28446378378608, + "exit_time": "2021-06-09T00:00:00", + "gross_pnl": -31.109865630661204, + "pnl": -31.109865630661204, + "pnlcomm": -31.109865630661204, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13025499622808, + "entry_time": "2021-06-11T00:00:00", + "exit_price": 92.23383791902404, + "exit_time": "2021-06-12T00:00:00", + "gross_pnl": -89.64170772040347, + "pnl": -89.64170772040347, + "pnlcomm": -89.64170772040347, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3328854638381, + "entry_time": "2021-06-14T00:00:00", + "exit_price": 92.96067846320523, + "exit_time": "2021-06-15T00:00:00", + "gross_pnl": 62.77929993671307, + "pnl": 62.77929993671307, + "pnlcomm": 62.77929993671307, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94965457520625, + "entry_time": "2021-06-17T00:00:00", + "exit_price": 92.16625059748041, + "exit_time": "2021-06-18T00:00:00", + "gross_pnl": 21.65960222741603, + "pnl": 21.65960222741603, + "pnlcomm": 21.65960222741603, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8269642033066, + "entry_time": "2021-06-20T00:00:00", + "exit_price": 91.81310669049036, + "exit_time": "2021-06-21T00:00:00", + "gross_pnl": -1.3857512816244366, + "pnl": -1.3857512816244366, + "pnlcomm": -1.3857512816244366, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.25554422109529, + "entry_time": "2021-06-23T00:00:00", + "exit_price": 92.45622372930102, + "exit_time": "2021-06-24T00:00:00", + "gross_pnl": 20.067950820572378, + "pnl": 20.067950820572378, + "pnlcomm": 20.067950820572378, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.83947343135847, + "entry_time": "2021-06-26T00:00:00", + "exit_price": 92.43135259957857, + "exit_time": "2021-06-27T00:00:00", + "gross_pnl": 59.18791682201032, + "pnl": 59.18791682201032, + "pnlcomm": 59.18791682201032, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.53295655650527, + "entry_time": "2021-06-29T00:00:00", + "exit_price": 91.78816229160894, + "exit_time": "2021-06-30T00:00:00", + "gross_pnl": 25.520573510367228, + "pnl": 25.520573510367228, + "pnlcomm": 25.520573510367228, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9413213129086, + "entry_time": "2021-07-02T00:00:00", + "exit_price": 92.40648296911729, + "exit_time": "2021-07-03T00:00:00", + "gross_pnl": 146.5161656208693, + "pnl": 146.5161656208693, + "pnlcomm": 146.5161656208693, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30279435197399, + "entry_time": "2021-07-05T00:00:00", + "exit_price": 90.65263067129818, + "exit_time": "2021-07-06T00:00:00", + "gross_pnl": -65.01636806758029, + "pnl": -65.01636806758029, + "pnlcomm": -65.01636806758029, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8239628759463, + "entry_time": "2021-07-08T00:00:00", + "exit_price": 91.7795218814571, + "exit_time": "2021-07-09T00:00:00", + "gross_pnl": -4.444099448919303, + "pnl": -4.444099448919303, + "pnlcomm": -4.444099448919303, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36068460994301, + "entry_time": "2021-07-11T00:00:00", + "exit_price": 91.47451059527033, + "exit_time": "2021-07-12T00:00:00", + "gross_pnl": 11.382598532732402, + "pnl": 11.382598532732402, + "pnlcomm": 11.382598532732402, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09791235411565, + "entry_time": "2021-07-14T00:00:00", + "exit_price": 91.64232209133355, + "exit_time": "2021-07-15T00:00:00", + "gross_pnl": 54.44097372179044, + "pnl": 54.44097372179044, + "pnlcomm": 54.44097372179044, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9960341944844, + "entry_time": "2021-07-17T00:00:00", + "exit_price": 90.86057544771678, + "exit_time": "2021-07-18T00:00:00", + "gross_pnl": -13.545874676761116, + "pnl": -13.545874676761116, + "pnlcomm": -13.545874676761116, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03722443992689, + "entry_time": "2021-07-20T00:00:00", + "exit_price": 91.02540027670304, + "exit_time": "2021-07-21T00:00:00", + "gross_pnl": -101.18241632238494, + "pnl": -101.18241632238494, + "pnlcomm": -101.18241632238494, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23831571579666, + "entry_time": "2021-07-23T00:00:00", + "exit_price": 91.61642884685872, + "exit_time": "2021-07-24T00:00:00", + "gross_pnl": 37.81131310620651, + "pnl": 37.81131310620651, + "pnlcomm": 37.81131310620651, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.95873360404138, + "entry_time": "2021-07-26T00:00:00", + "exit_price": 91.78520963834742, + "exit_time": "2021-07-27T00:00:00", + "gross_pnl": -17.352396569395978, + "pnl": -17.352396569395978, + "pnlcomm": -17.352396569395978, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12207131713245, + "entry_time": "2021-07-29T00:00:00", + "exit_price": 93.030634236321, + "exit_time": "2021-07-30T00:00:00", + "gross_pnl": 90.85629191885545, + "pnl": 90.85629191885545, + "pnlcomm": 90.85629191885545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2580641252632, + "entry_time": "2021-08-01T00:00:00", + "exit_price": 92.57471719502651, + "exit_time": "2021-08-02T00:00:00", + "gross_pnl": 31.6653069763305, + "pnl": 31.6653069763305, + "pnlcomm": 31.6653069763305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16033087447514, + "entry_time": "2021-08-04T00:00:00", + "exit_price": 91.64298714231596, + "exit_time": "2021-08-05T00:00:00", + "gross_pnl": -51.73437321591763, + "pnl": -51.73437321591763, + "pnlcomm": -51.73437321591763, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75555986268628, + "entry_time": "2021-08-07T00:00:00", + "exit_price": 93.29534460790408, + "exit_time": "2021-08-08T00:00:00", + "gross_pnl": 53.97847452178013, + "pnl": 53.97847452178013, + "pnlcomm": 53.97847452178013, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82043015696519, + "entry_time": "2021-08-10T00:00:00", + "exit_price": 93.34161824742394, + "exit_time": "2021-08-11T00:00:00", + "gross_pnl": 52.118809045875025, + "pnl": 52.118809045875025, + "pnlcomm": 52.118809045875025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.61753779742976, + "entry_time": "2021-08-13T00:00:00", + "exit_price": 94.15624068230731, + "exit_time": "2021-08-14T00:00:00", + "gross_pnl": 53.87028848775515, + "pnl": 53.87028848775515, + "pnlcomm": 53.87028848775515, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25917455813928, + "entry_time": "2021-08-16T00:00:00", + "exit_price": 93.5936848786624, + "exit_time": "2021-08-17T00:00:00", + "gross_pnl": -66.54896794768774, + "pnl": -66.54896794768774, + "pnlcomm": -66.54896794768774, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98045633035186, + "entry_time": "2021-08-19T00:00:00", + "exit_price": 93.98797939638727, + "exit_time": "2021-08-20T00:00:00", + "gross_pnl": 100.7523066035418, + "pnl": 100.7523066035418, + "pnlcomm": 100.7523066035418, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35827005631805, + "entry_time": "2021-08-22T00:00:00", + "exit_price": 93.69155799194061, + "exit_time": "2021-08-23T00:00:00", + "gross_pnl": 33.328793562256465, + "pnl": 33.328793562256465, + "pnlcomm": 33.328793562256465, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68091309416992, + "entry_time": "2021-08-25T00:00:00", + "exit_price": 92.70456318827733, + "exit_time": "2021-08-26T00:00:00", + "gross_pnl": 2.3650094107409814, + "pnl": 2.3650094107409814, + "pnlcomm": 2.3650094107409814, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16469231313611, + "entry_time": "2021-08-28T00:00:00", + "exit_price": 92.8799099382491, + "exit_time": "2021-08-29T00:00:00", + "gross_pnl": -28.478237488701552, + "pnl": -28.478237488701552, + "pnlcomm": -28.478237488701552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11566093967609, + "entry_time": "2021-08-31T00:00:00", + "exit_price": 93.80161139315015, + "exit_time": "2021-09-01T00:00:00", + "gross_pnl": -31.40495465259363, + "pnl": -31.40495465259363, + "pnlcomm": -31.40495465259363, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15377445359951, + "entry_time": "2021-09-03T00:00:00", + "exit_price": 94.15715297991916, + "exit_time": "2021-09-04T00:00:00", + "gross_pnl": 100.33785263196506, + "pnl": 100.33785263196506, + "pnlcomm": 100.33785263196506, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86962603101975, + "entry_time": "2021-09-06T00:00:00", + "exit_price": 93.72926386277882, + "exit_time": "2021-09-07T00:00:00", + "gross_pnl": -14.036216824092662, + "pnl": -14.036216824092662, + "pnlcomm": -14.036216824092662, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1579385275225, + "entry_time": "2021-09-09T00:00:00", + "exit_price": 93.74116822603294, + "exit_time": "2021-09-10T00:00:00", + "gross_pnl": -41.67703014895636, + "pnl": -41.67703014895636, + "pnlcomm": -41.67703014895636, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31971390482754, + "entry_time": "2021-09-12T00:00:00", + "exit_price": 93.20782644697857, + "exit_time": "2021-09-13T00:00:00", + "gross_pnl": -11.188745784896525, + "pnl": -11.188745784896525, + "pnlcomm": -11.188745784896525, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01885490875779, + "entry_time": "2021-09-15T00:00:00", + "exit_price": 94.42230012835577, + "exit_time": "2021-09-16T00:00:00", + "gross_pnl": -59.655478040201615, + "pnl": -59.655478040201615, + "pnlcomm": -59.655478040201615, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.99288411883725, + "entry_time": "2021-09-18T00:00:00", + "exit_price": 94.082184046767, + "exit_time": "2021-09-19T00:00:00", + "gross_pnl": 8.929992792974417, + "pnl": 8.929992792974417, + "pnlcomm": 8.929992792974417, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.85101362331126, + "entry_time": "2021-09-21T00:00:00", + "exit_price": 94.98564664788431, + "exit_time": "2021-09-22T00:00:00", + "gross_pnl": 113.46330245730485, + "pnl": 113.46330245730485, + "pnlcomm": 113.46330245730485, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86959357102904, + "entry_time": "2021-09-24T00:00:00", + "exit_price": 94.20013868958425, + "exit_time": "2021-09-25T00:00:00", + "gross_pnl": 33.05451185552073, + "pnl": 33.05451185552073, + "pnlcomm": 33.05451185552073, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84924924581607, + "entry_time": "2021-09-27T00:00:00", + "exit_price": 93.31289310035527, + "exit_time": "2021-09-28T00:00:00", + "gross_pnl": -153.63561454608003, + "pnl": -153.63561454608003, + "pnlcomm": -153.63561454608003, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30858201402589, + "entry_time": "2021-09-30T00:00:00", + "exit_price": 93.99373607498532, + "exit_time": "2021-10-01T00:00:00", + "gross_pnl": -31.484593904056624, + "pnl": -31.484593904056624, + "pnlcomm": -31.484593904056624, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.18572768435916, + "entry_time": "2021-10-03T00:00:00", + "exit_price": 94.33439114940059, + "exit_time": "2021-10-04T00:00:00", + "gross_pnl": -85.13365349585769, + "pnl": -85.13365349585769, + "pnlcomm": -85.13365349585769, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07429869254726, + "entry_time": "2021-10-06T00:00:00", + "exit_price": 94.04790943044297, + "exit_time": "2021-10-07T00:00:00", + "gross_pnl": -2.638926210428849, + "pnl": -2.638926210428849, + "pnlcomm": -2.638926210428849, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64069907229371, + "entry_time": "2021-10-09T00:00:00", + "exit_price": 94.26235855896988, + "exit_time": "2021-10-10T00:00:00", + "gross_pnl": 62.16594866761653, + "pnl": 62.16594866761653, + "pnlcomm": 62.16594866761653, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50379403067527, + "entry_time": "2021-10-12T00:00:00", + "exit_price": 94.43691170957882, + "exit_time": "2021-10-13T00:00:00", + "gross_pnl": -6.688232109644332, + "pnl": -6.688232109644332, + "pnlcomm": -6.688232109644332, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37005197510278, + "entry_time": "2021-10-15T00:00:00", + "exit_price": 94.27057437223934, + "exit_time": "2021-10-16T00:00:00", + "gross_pnl": -9.947760286344476, + "pnl": -9.947760286344476, + "pnlcomm": -9.947760286344476, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09337235241868, + "entry_time": "2021-10-18T00:00:00", + "exit_price": 94.71128565229746, + "exit_time": "2021-10-19T00:00:00", + "gross_pnl": -38.20867001212207, + "pnl": -38.20867001212207, + "pnlcomm": -38.20867001212207, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02883456195461, + "entry_time": "2021-10-21T00:00:00", + "exit_price": 94.80490335979458, + "exit_time": "2021-10-22T00:00:00", + "gross_pnl": 77.60687978399687, + "pnl": 77.60687978399687, + "pnlcomm": 77.60687978399687, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9287597961482, + "entry_time": "2021-10-24T00:00:00", + "exit_price": 95.17470692964342, + "exit_time": "2021-10-25T00:00:00", + "gross_pnl": 124.59471334952212, + "pnl": 124.59471334952212, + "pnlcomm": 124.59471334952212, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.24931526786432, + "entry_time": "2021-10-27T00:00:00", + "exit_price": 93.60050033989026, + "exit_time": "2021-10-28T00:00:00", + "gross_pnl": -64.88149279740583, + "pnl": -64.88149279740583, + "pnlcomm": -64.88149279740583, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09469925407369, + "entry_time": "2021-10-30T00:00:00", + "exit_price": 94.3111349289259, + "exit_time": "2021-10-31T00:00:00", + "gross_pnl": 21.64356748522067, + "pnl": 21.64356748522067, + "pnlcomm": 21.64356748522067, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18816369089683, + "entry_time": "2021-11-02T00:00:00", + "exit_price": 94.42938460793316, + "exit_time": "2021-11-03T00:00:00", + "gross_pnl": 24.122091703632975, + "pnl": 24.122091703632975, + "pnlcomm": 24.122091703632975, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.41602741852829, + "entry_time": "2021-11-05T00:00:00", + "exit_price": 93.42310978968692, + "exit_time": "2021-11-06T00:00:00", + "gross_pnl": 0.7082371158631418, + "pnl": 0.7082371158631418, + "pnlcomm": 0.7082371158631418, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50953693273829, + "entry_time": "2021-11-08T00:00:00", + "exit_price": 93.33123427861662, + "exit_time": "2021-11-09T00:00:00", + "gross_pnl": 82.16973458783343, + "pnl": 82.16973458783343, + "pnlcomm": 82.16973458783343, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96020937715257, + "entry_time": "2021-11-11T00:00:00", + "exit_price": 93.53068640749544, + "exit_time": "2021-11-12T00:00:00", + "gross_pnl": 57.04770303428717, + "pnl": 57.04770303428717, + "pnlcomm": 57.04770303428717, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56091640875552, + "entry_time": "2021-11-14T00:00:00", + "exit_price": 92.89910933295498, + "exit_time": "2021-11-15T00:00:00", + "gross_pnl": 33.81929241994612, + "pnl": 33.81929241994612, + "pnlcomm": 33.81929241994612, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.42727078867868, + "entry_time": "2021-11-17T00:00:00", + "exit_price": 92.19572149206287, + "exit_time": "2021-11-18T00:00:00", + "gross_pnl": -23.154929661581036, + "pnl": -23.154929661581036, + "pnlcomm": -23.154929661581036, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68137345397398, + "entry_time": "2021-11-20T00:00:00", + "exit_price": 92.48011498833463, + "exit_time": "2021-11-21T00:00:00", + "gross_pnl": -20.125846563934147, + "pnl": -20.125846563934147, + "pnlcomm": -20.125846563934147, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73481537380023, + "entry_time": "2021-11-23T00:00:00", + "exit_price": 93.9817766831428, + "exit_time": "2021-11-24T00:00:00", + "gross_pnl": 124.69613093425664, + "pnl": 124.69613093425664, + "pnlcomm": 124.69613093425664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62422399002075, + "entry_time": "2021-11-26T00:00:00", + "exit_price": 92.25402747101043, + "exit_time": "2021-11-27T00:00:00", + "gross_pnl": -37.01965190103209, + "pnl": -37.01965190103209, + "pnlcomm": -37.01965190103209, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78794113614681, + "entry_time": "2021-11-29T00:00:00", + "exit_price": 92.51565520344022, + "exit_time": "2021-11-30T00:00:00", + "gross_pnl": -27.228593270659474, + "pnl": -27.228593270659474, + "pnlcomm": -27.228593270659474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81994141877884, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 91.73569183010366, + "exit_time": "2021-12-03T00:00:00", + "gross_pnl": -8.424958867517773, + "pnl": -8.424958867517773, + "pnlcomm": -8.424958867517773, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89304084668578, + "entry_time": "2021-12-05T00:00:00", + "exit_price": 91.94563028017612, + "exit_time": "2021-12-06T00:00:00", + "gross_pnl": 5.258943349033984, + "pnl": 5.258943349033984, + "pnlcomm": 5.258943349033984, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.70380536433252, + "entry_time": "2021-12-08T00:00:00", + "exit_price": 92.18321579529317, + "exit_time": "2021-12-09T00:00:00", + "gross_pnl": 47.94104309606411, + "pnl": 47.94104309606411, + "pnlcomm": 47.94104309606411, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75634960957339, + "entry_time": "2021-12-11T00:00:00", + "exit_price": 92.99346542277752, + "exit_time": "2021-12-12T00:00:00", + "gross_pnl": 23.711581320412733, + "pnl": 23.711581320412733, + "pnlcomm": 23.711581320412733, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07784715364147, + "entry_time": "2021-12-14T00:00:00", + "exit_price": 92.82473368702337, + "exit_time": "2021-12-15T00:00:00", + "gross_pnl": -25.31134666181032, + "pnl": -25.31134666181032, + "pnlcomm": -25.31134666181032, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80939097372557, + "entry_time": "2021-12-17T00:00:00", + "exit_price": 93.56855092683492, + "exit_time": "2021-12-18T00:00:00", + "gross_pnl": -24.084004689065353, + "pnl": -24.084004689065353, + "pnlcomm": -24.084004689065353, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22637736311736, + "entry_time": "2021-12-20T00:00:00", + "exit_price": 93.04989016451177, + "exit_time": "2021-12-21T00:00:00", + "gross_pnl": -17.648719860559936, + "pnl": -17.648719860559936, + "pnlcomm": -17.648719860559936, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06688407845617, + "entry_time": "2021-12-23T00:00:00", + "exit_price": 93.11481000895263, + "exit_time": "2021-12-24T00:00:00", + "gross_pnl": 4.792593049646143, + "pnl": 4.792593049646143, + "pnlcomm": 4.792593049646143, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27282277875311, + "entry_time": "2021-12-26T00:00:00", + "exit_price": 92.10549027383173, + "exit_time": "2021-12-27T00:00:00", + "gross_pnl": -116.73325049213759, + "pnl": -116.73325049213759, + "pnlcomm": -116.73325049213759, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02590143870165, + "entry_time": "2021-12-29T00:00:00", + "exit_price": 93.0111357952797, + "exit_time": "2021-12-30T00:00:00", + "gross_pnl": 98.52343565780473, + "pnl": 98.52343565780473, + "pnlcomm": 98.52343565780473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36789726372407, + "entry_time": "2022-01-01T00:00:00", + "exit_price": 91.16759918928896, + "exit_time": "2022-01-02T00:00:00", + "gross_pnl": -20.02980744351106, + "pnl": -20.02980744351106, + "pnlcomm": -20.02980744351106, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02364437811006, + "entry_time": "2022-01-04T00:00:00", + "exit_price": 91.64247835816664, + "exit_time": "2022-01-05T00:00:00", + "gross_pnl": -38.11660199434215, + "pnl": -38.11660199434215, + "pnlcomm": -38.11660199434215, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20232839714717, + "entry_time": "2022-01-07T00:00:00", + "exit_price": 92.51418676739564, + "exit_time": "2022-01-08T00:00:00", + "gross_pnl": 31.185837024847274, + "pnl": 31.185837024847274, + "pnlcomm": 31.185837024847274, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81320041849362, + "entry_time": "2022-01-10T00:00:00", + "exit_price": 92.27166607324205, + "exit_time": "2022-01-11T00:00:00", + "gross_pnl": 45.84656547484229, + "pnl": 45.84656547484229, + "pnlcomm": 45.84656547484229, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2545983932022, + "entry_time": "2022-01-13T00:00:00", + "exit_price": 91.97497228207648, + "exit_time": "2022-01-14T00:00:00", + "gross_pnl": -27.962611112572233, + "pnl": -27.962611112572233, + "pnlcomm": -27.962611112572233, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67780842750179, + "entry_time": "2022-01-16T00:00:00", + "exit_price": 91.45906966920411, + "exit_time": "2022-01-17T00:00:00", + "gross_pnl": -21.87387582976754, + "pnl": -21.87387582976754, + "pnlcomm": -21.87387582976754, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76345480442126, + "entry_time": "2022-01-19T00:00:00", + "exit_price": 91.43197465037622, + "exit_time": "2022-01-20T00:00:00", + "gross_pnl": -33.148015404503894, + "pnl": -33.148015404503894, + "pnlcomm": -33.148015404503894, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3600604543369, + "entry_time": "2022-01-22T00:00:00", + "exit_price": 92.44350843545416, + "exit_time": "2022-01-23T00:00:00", + "gross_pnl": 8.344798111725993, + "pnl": 8.344798111725993, + "pnlcomm": 8.344798111725993, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39757672508603, + "entry_time": "2022-01-25T00:00:00", + "exit_price": 91.85230151275863, + "exit_time": "2022-01-26T00:00:00", + "gross_pnl": 45.47247876726033, + "pnl": 45.47247876726033, + "pnlcomm": 45.47247876726033, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.81407145534195, + "entry_time": "2022-01-28T00:00:00", + "exit_price": 91.01128875382821, + "exit_time": "2022-01-29T00:00:00", + "gross_pnl": 19.721729848626524, + "pnl": 19.721729848626524, + "pnlcomm": 19.721729848626524, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67591197573066, + "entry_time": "2022-01-31T00:00:00", + "exit_price": 90.51279666702179, + "exit_time": "2022-02-01T00:00:00", + "gross_pnl": -116.31153087088677, + "pnl": -116.31153087088677, + "pnlcomm": -116.31153087088677, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98461279621962, + "entry_time": "2022-02-03T00:00:00", + "exit_price": 91.18776220832692, + "exit_time": "2022-02-04T00:00:00", + "gross_pnl": -79.68505878927061, + "pnl": -79.68505878927061, + "pnlcomm": -79.68505878927061, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68365711276127, + "entry_time": "2022-02-06T00:00:00", + "exit_price": 92.52965334263803, + "exit_time": "2022-02-07T00:00:00", + "gross_pnl": -15.40037701232393, + "pnl": -15.40037701232393, + "pnlcomm": -15.40037701232393, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97018528191016, + "entry_time": "2022-02-09T00:00:00", + "exit_price": 92.1704075246973, + "exit_time": "2022-02-10T00:00:00", + "gross_pnl": 20.022224278713452, + "pnl": 20.022224278713452, + "pnlcomm": 20.022224278713452, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.4092834971355, + "entry_time": "2022-02-12T00:00:00", + "exit_price": 91.80397108470675, + "exit_time": "2022-02-13T00:00:00", + "gross_pnl": 39.46875875712408, + "pnl": 39.46875875712408, + "pnlcomm": 39.46875875712408, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7224658447326, + "entry_time": "2022-02-15T00:00:00", + "exit_price": 91.15638220769824, + "exit_time": "2022-02-16T00:00:00", + "gross_pnl": -56.608363703435316, + "pnl": -56.608363703435316, + "pnlcomm": -56.608363703435316, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66063113797075, + "entry_time": "2022-02-18T00:00:00", + "exit_price": 91.93674170823937, + "exit_time": "2022-02-19T00:00:00", + "gross_pnl": 27.611057026861374, + "pnl": 27.611057026861374, + "pnlcomm": 27.611057026861374, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.02426166276656, + "entry_time": "2022-02-21T00:00:00", + "exit_price": 92.2868521233569, + "exit_time": "2022-02-22T00:00:00", + "gross_pnl": 126.25904605903315, + "pnl": 126.25904605903315, + "pnlcomm": 126.25904605903315, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06798590582007, + "entry_time": "2022-02-24T00:00:00", + "exit_price": 91.35136606041436, + "exit_time": "2022-02-25T00:00:00", + "gross_pnl": 28.338015459429755, + "pnl": 28.338015459429755, + "pnlcomm": 28.338015459429755, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99746534424483, + "entry_time": "2022-02-27T00:00:00", + "exit_price": 91.56303029535638, + "exit_time": "2022-02-28T00:00:00", + "gross_pnl": 56.556495111155414, + "pnl": 56.556495111155414, + "pnlcomm": 56.556495111155414, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09425361608109, + "entry_time": "2022-03-02T00:00:00", + "exit_price": 91.42070005109457, + "exit_time": "2022-03-03T00:00:00", + "gross_pnl": -67.35535649865199, + "pnl": -67.35535649865199, + "pnlcomm": -67.35535649865199, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41089068186189, + "entry_time": "2022-03-05T00:00:00", + "exit_price": 90.18677881527823, + "exit_time": "2022-03-06T00:00:00", + "gross_pnl": -122.41118665836552, + "pnl": -122.41118665836552, + "pnlcomm": -122.41118665836552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43901544778936, + "entry_time": "2022-03-08T00:00:00", + "exit_price": 91.5260369404649, + "exit_time": "2022-03-09T00:00:00", + "gross_pnl": 8.70214926755466, + "pnl": 8.70214926755466, + "pnlcomm": 8.70214926755466, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.01177208564717, + "entry_time": "2022-03-11T00:00:00", + "exit_price": 91.36159823018748, + "exit_time": "2022-03-12T00:00:00", + "gross_pnl": 34.98261445403159, + "pnl": 34.98261445403159, + "pnlcomm": 34.98261445403159, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82082511981079, + "entry_time": "2022-03-14T00:00:00", + "exit_price": 91.28071492977152, + "exit_time": "2022-03-15T00:00:00", + "gross_pnl": 45.988980996072826, + "pnl": 45.988980996072826, + "pnlcomm": 45.988980996072826, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9250036260453, + "entry_time": "2022-03-17T00:00:00", + "exit_price": 90.6150063093046, + "exit_time": "2022-03-18T00:00:00", + "gross_pnl": -130.99973167406915, + "pnl": -130.99973167406915, + "pnlcomm": -130.99973167406915, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.61363931969464, + "entry_time": "2022-03-20T00:00:00", + "exit_price": 90.38004154259693, + "exit_time": "2022-03-21T00:00:00", + "gross_pnl": -23.35977770977138, + "pnl": -23.35977770977138, + "pnlcomm": -23.35977770977138, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.96467806287603, + "entry_time": "2022-03-23T00:00:00", + "exit_price": 90.70041523761671, + "exit_time": "2022-03-24T00:00:00", + "gross_pnl": -26.426282525932265, + "pnl": -26.426282525932265, + "pnlcomm": -26.426282525932265, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.62074541364396, + "entry_time": "2022-03-26T00:00:00", + "exit_price": 90.95651159207543, + "exit_time": "2022-03-27T00:00:00", + "gross_pnl": 33.576617843147005, + "pnl": 33.576617843147005, + "pnlcomm": 33.576617843147005, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05267669381956, + "entry_time": "2022-03-29T00:00:00", + "exit_price": 91.69416855510607, + "exit_time": "2022-03-30T00:00:00", + "gross_pnl": 64.14918612865108, + "pnl": 64.14918612865108, + "pnlcomm": 64.14918612865108, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8695133244266, + "entry_time": "2022-04-01T00:00:00", + "exit_price": 90.61012799594212, + "exit_time": "2022-04-02T00:00:00", + "gross_pnl": -25.938532848448403, + "pnl": -25.938532848448403, + "pnlcomm": -25.938532848448403, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05464751490085, + "entry_time": "2022-04-04T00:00:00", + "exit_price": 90.46681240023963, + "exit_time": "2022-04-05T00:00:00", + "gross_pnl": 41.21648853387825, + "pnl": 41.21648853387825, + "pnlcomm": 41.21648853387825, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63067407291008, + "entry_time": "2022-04-07T00:00:00", + "exit_price": 89.96046847840074, + "exit_time": "2022-04-08T00:00:00", + "gross_pnl": -67.02055945093406, + "pnl": -67.02055945093406, + "pnlcomm": -67.02055945093406, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56273021751427, + "entry_time": "2022-04-10T00:00:00", + "exit_price": 90.14638715063298, + "exit_time": "2022-04-11T00:00:00", + "gross_pnl": -41.63430668812964, + "pnl": -41.63430668812964, + "pnlcomm": -41.63430668812964, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75859326793318, + "entry_time": "2022-04-13T00:00:00", + "exit_price": 90.97823499949781, + "exit_time": "2022-04-14T00:00:00", + "gross_pnl": 121.96417315646357, + "pnl": 121.96417315646357, + "pnlcomm": 121.96417315646357, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.1563775636343, + "entry_time": "2022-04-16T00:00:00", + "exit_price": 89.71453147899727, + "exit_time": "2022-04-17T00:00:00", + "gross_pnl": -44.18460846370209, + "pnl": -44.18460846370209, + "pnlcomm": -44.18460846370209, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.00941330347686, + "entry_time": "2022-04-19T00:00:00", + "exit_price": 90.97249110306038, + "exit_time": "2022-04-20T00:00:00", + "gross_pnl": 96.3077799583516, + "pnl": 96.3077799583516, + "pnlcomm": 96.3077799583516, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.44900384555615, + "entry_time": "2022-04-22T00:00:00", + "exit_price": 90.26380626108603, + "exit_time": "2022-04-23T00:00:00", + "gross_pnl": -18.519758447011725, + "pnl": -18.519758447011725, + "pnlcomm": -18.519758447011725, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9389490074607, + "entry_time": "2022-04-25T00:00:00", + "exit_price": 90.91676356991597, + "exit_time": "2022-04-26T00:00:00", + "gross_pnl": 97.7814562455265, + "pnl": 97.7814562455265, + "pnlcomm": 97.7814562455265, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.13685393625028, + "entry_time": "2022-04-28T00:00:00", + "exit_price": 90.92025914672816, + "exit_time": "2022-04-29T00:00:00", + "gross_pnl": 78.34052104778806, + "pnl": 78.34052104778806, + "pnlcomm": 78.34052104778806, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9636459548143, + "entry_time": "2022-05-01T00:00:00", + "exit_price": 90.9470309766908, + "exit_time": "2022-05-02T00:00:00", + "gross_pnl": 98.33850218765008, + "pnl": 98.33850218765008, + "pnlcomm": 98.33850218765008, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23464868145118, + "entry_time": "2022-05-04T00:00:00", + "exit_price": 92.16095300836626, + "exit_time": "2022-05-05T00:00:00", + "gross_pnl": 92.6304326915087, + "pnl": 92.6304326915087, + "pnlcomm": 92.6304326915087, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86371979002091, + "entry_time": "2022-05-07T00:00:00", + "exit_price": 90.1658806519524, + "exit_time": "2022-05-08T00:00:00", + "gross_pnl": -69.78391380685025, + "pnl": -69.78391380685025, + "pnlcomm": -69.78391380685025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80999909964301, + "entry_time": "2022-05-10T00:00:00", + "exit_price": 91.3916052906719, + "exit_time": "2022-05-11T00:00:00", + "gross_pnl": 58.160619102889655, + "pnl": 58.160619102889655, + "pnlcomm": 58.160619102889655, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79830122498419, + "entry_time": "2022-05-13T00:00:00", + "exit_price": 91.92464426243117, + "exit_time": "2022-05-14T00:00:00", + "gross_pnl": 12.634303744698627, + "pnl": 12.634303744698627, + "pnlcomm": 12.634303744698627, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74084404129731, + "entry_time": "2022-05-16T00:00:00", + "exit_price": 91.77591195761288, + "exit_time": "2022-05-17T00:00:00", + "gross_pnl": 3.5067916315568937, + "pnl": 3.5067916315568937, + "pnlcomm": 3.5067916315568937, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129082151163, + "entry_time": "2022-05-19T00:00:00", + "exit_price": 91.29443539538282, + "exit_time": "2022-05-20T00:00:00", + "gross_pnl": 16.535324421981556, + "pnl": 16.535324421981556, + "pnlcomm": 16.535324421981556, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.49821093674116, + "entry_time": "2022-05-22T00:00:00", + "exit_price": 90.52895961614624, + "exit_time": "2022-05-23T00:00:00", + "gross_pnl": 103.07486794050789, + "pnl": 103.07486794050789, + "pnlcomm": 103.07486794050789, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.50773769923417, + "entry_time": "2022-05-25T00:00:00", + "exit_price": 90.20586243304412, + "exit_time": "2022-05-26T00:00:00", + "gross_pnl": -30.18752661900521, + "pnl": -30.18752661900521, + "pnlcomm": -30.18752661900521, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1593251595947, + "entry_time": "2022-05-28T00:00:00", + "exit_price": 90.8652392547076, + "exit_time": "2022-05-29T00:00:00", + "gross_pnl": -29.408590488709763, + "pnl": -29.408590488709763, + "pnlcomm": -29.408590488709763, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.88148378297518, + "entry_time": "2022-05-31T00:00:00", + "exit_price": 90.54298539634833, + "exit_time": "2022-06-01T00:00:00", + "gross_pnl": 66.15016133731473, + "pnl": 66.15016133731473, + "pnlcomm": 66.15016133731473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.97268456538903, + "entry_time": "2022-06-03T00:00:00", + "exit_price": 91.62712854780935, + "exit_time": "2022-06-04T00:00:00", + "gross_pnl": 65.44439824203181, + "pnl": 65.44439824203181, + "pnlcomm": 65.44439824203181, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.74146887774299, + "entry_time": "2022-06-06T00:00:00", + "exit_price": 90.42853595632805, + "exit_time": "2022-06-07T00:00:00", + "gross_pnl": -31.293292141494078, + "pnl": -31.293292141494078, + "pnlcomm": -31.293292141494078, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84848168731006, + "entry_time": "2022-06-09T00:00:00", + "exit_price": 90.83668379255865, + "exit_time": "2022-06-10T00:00:00", + "gross_pnl": -1.1797894751410354, + "pnl": -1.1797894751410354, + "pnlcomm": -1.1797894751410354, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.47241973433749, + "entry_time": "2022-06-12T00:00:00", + "exit_price": 89.89842730786603, + "exit_time": "2022-06-13T00:00:00", + "gross_pnl": -57.39924264714631, + "pnl": -57.39924264714631, + "pnlcomm": -57.39924264714631, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82455441317694, + "entry_time": "2022-06-15T00:00:00", + "exit_price": 90.16986826544031, + "exit_time": "2022-06-16T00:00:00", + "gross_pnl": -65.46861477366264, + "pnl": -65.46861477366264, + "pnlcomm": -65.46861477366264, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1811588929617, + "entry_time": "2022-06-18T00:00:00", + "exit_price": 90.09911654611165, + "exit_time": "2022-06-19T00:00:00", + "gross_pnl": 91.79576531499407, + "pnl": 91.79576531499407, + "pnlcomm": 91.79576531499407, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.55257557802233, + "entry_time": "2022-06-21T00:00:00", + "exit_price": 90.6008717295654, + "exit_time": "2022-06-22T00:00:00", + "gross_pnl": 4.829615154307021, + "pnl": 4.829615154307021, + "pnlcomm": 4.829615154307021, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.68671023186488, + "entry_time": "2022-06-24T00:00:00", + "exit_price": 89.96517472835333, + "exit_time": "2022-06-25T00:00:00", + "gross_pnl": -72.15355035115465, + "pnl": -72.15355035115465, + "pnlcomm": -72.15355035115465, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05260562521785, + "entry_time": "2022-06-27T00:00:00", + "exit_price": 90.08006582461334, + "exit_time": "2022-06-28T00:00:00", + "gross_pnl": 2.7460199395491713, + "pnl": 2.7460199395491713, + "pnlcomm": 2.7460199395491713, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79432064186736, + "entry_time": "2022-06-30T00:00:00", + "exit_price": 92.41108821991375, + "exit_time": "2022-07-01T00:00:00", + "gross_pnl": 161.67675780463924, + "pnl": 161.67675780463924, + "pnlcomm": 161.67675780463924, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87347025830266, + "entry_time": "2022-07-03T00:00:00", + "exit_price": 91.20564533828777, + "exit_time": "2022-07-04T00:00:00", + "gross_pnl": 33.2175079985106, + "pnl": 33.2175079985106, + "pnlcomm": 33.2175079985106, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30309517181773, + "entry_time": "2022-07-06T00:00:00", + "exit_price": 90.1406611037728, + "exit_time": "2022-07-07T00:00:00", + "gross_pnl": -116.24340680449308, + "pnl": -116.24340680449308, + "pnlcomm": -116.24340680449308, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.24392591685461, + "entry_time": "2022-07-09T00:00:00", + "exit_price": 91.10896639776044, + "exit_time": "2022-07-10T00:00:00", + "gross_pnl": 86.5040480905833, + "pnl": 86.5040480905833, + "pnlcomm": 86.5040480905833, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43429707485602, + "entry_time": "2022-07-12T00:00:00", + "exit_price": 90.99823744300166, + "exit_time": "2022-07-13T00:00:00", + "gross_pnl": -43.60596318543628, + "pnl": -43.60596318543628, + "pnlcomm": -43.60596318543628, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51160983247296, + "entry_time": "2022-07-15T00:00:00", + "exit_price": 91.15695774047701, + "exit_time": "2022-07-16T00:00:00", + "gross_pnl": 64.53479080040552, + "pnl": 64.53479080040552, + "pnlcomm": 64.53479080040552, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.25313076740179, + "entry_time": "2022-07-18T00:00:00", + "exit_price": 90.3503914171167, + "exit_time": "2022-07-19T00:00:00", + "gross_pnl": -90.27393502850884, + "pnl": -90.27393502850884, + "pnlcomm": -90.27393502850884, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47393608345517, + "entry_time": "2022-07-21T00:00:00", + "exit_price": 89.98751697992218, + "exit_time": "2022-07-22T00:00:00", + "gross_pnl": -148.64191035329952, + "pnl": -148.64191035329952, + "pnlcomm": -148.64191035329952, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.0545116492653, + "entry_time": "2022-07-24T00:00:00", + "exit_price": 91.01799823084976, + "exit_time": "2022-07-25T00:00:00", + "gross_pnl": -103.6513418415538, + "pnl": -103.6513418415538, + "pnlcomm": -103.6513418415538, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05081241841745, + "entry_time": "2022-07-27T00:00:00", + "exit_price": 91.31407916672543, + "exit_time": "2022-07-28T00:00:00", + "gross_pnl": 26.326674830798424, + "pnl": 26.326674830798424, + "pnlcomm": 26.326674830798424, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80885265421585, + "entry_time": "2022-07-30T00:00:00", + "exit_price": 91.15205975168703, + "exit_time": "2022-07-31T00:00:00", + "gross_pnl": 34.32070974711792, + "pnl": 34.32070974711792, + "pnlcomm": 34.32070974711792, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47241880815605, + "entry_time": "2022-08-02T00:00:00", + "exit_price": 91.54172600484964, + "exit_time": "2022-08-03T00:00:00", + "gross_pnl": 6.930719669358609, + "pnl": 6.930719669358609, + "pnlcomm": 6.930719669358609, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8976774720573, + "entry_time": "2022-08-05T00:00:00", + "exit_price": 91.58791087448299, + "exit_time": "2022-08-06T00:00:00", + "gross_pnl": -30.97665975743098, + "pnl": -30.97665975743098, + "pnlcomm": -30.97665975743098, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02271267015783, + "entry_time": "2022-08-08T00:00:00", + "exit_price": 91.10459083951521, + "exit_time": "2022-08-09T00:00:00", + "gross_pnl": -91.81218306426189, + "pnl": -91.81218306426189, + "pnlcomm": -91.81218306426189, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24414870008319, + "entry_time": "2022-08-11T00:00:00", + "exit_price": 92.69109127617371, + "exit_time": "2022-08-12T00:00:00", + "gross_pnl": 44.6942576090521, + "pnl": 44.6942576090521, + "pnlcomm": 44.6942576090521, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.65306278042235, + "entry_time": "2022-08-14T00:00:00", + "exit_price": 92.39816620647916, + "exit_time": "2022-08-15T00:00:00", + "gross_pnl": 74.5103426056815, + "pnl": 74.5103426056815, + "pnlcomm": 74.5103426056815, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1810606061523, + "entry_time": "2022-08-17T00:00:00", + "exit_price": 92.49470462633181, + "exit_time": "2022-08-18T00:00:00", + "gross_pnl": -68.63559798204903, + "pnl": -68.63559798204903, + "pnlcomm": -68.63559798204903, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01504374556126, + "entry_time": "2022-08-20T00:00:00", + "exit_price": 92.67904663244455, + "exit_time": "2022-08-21T00:00:00", + "gross_pnl": 66.40028868832957, + "pnl": 66.40028868832957, + "pnlcomm": 66.40028868832957, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74908045175502, + "entry_time": "2022-08-23T00:00:00", + "exit_price": 93.28081352108578, + "exit_time": "2022-08-24T00:00:00", + "gross_pnl": -46.82669306692446, + "pnl": -46.82669306692446, + "pnlcomm": -46.82669306692446, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72430502818084, + "entry_time": "2022-08-26T00:00:00", + "exit_price": 92.91000509633356, + "exit_time": "2022-08-27T00:00:00", + "gross_pnl": -81.42999318472732, + "pnl": -81.42999318472732, + "pnlcomm": -81.42999318472732, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0266388958905, + "entry_time": "2022-08-29T00:00:00", + "exit_price": 93.06932306108122, + "exit_time": "2022-08-30T00:00:00", + "gross_pnl": 4.268416519072105, + "pnl": 4.268416519072105, + "pnlcomm": 4.268416519072105, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2669116718157, + "entry_time": "2022-09-01T00:00:00", + "exit_price": 93.31911690207038, + "exit_time": "2022-09-02T00:00:00", + "gross_pnl": 5.220523025467116, + "pnl": 5.220523025467116, + "pnlcomm": 5.220523025467116, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01378736632232, + "entry_time": "2022-09-04T00:00:00", + "exit_price": 92.69057272581715, + "exit_time": "2022-09-05T00:00:00", + "gross_pnl": -32.32146405051708, + "pnl": -32.32146405051708, + "pnlcomm": -32.32146405051708, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86605080021333, + "entry_time": "2022-09-07T00:00:00", + "exit_price": 93.54829275642138, + "exit_time": "2022-09-08T00:00:00", + "gross_pnl": 68.22419562080455, + "pnl": 68.22419562080455, + "pnlcomm": 68.22419562080455, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92761316198515, + "entry_time": "2022-09-10T00:00:00", + "exit_price": 92.07281692163534, + "exit_time": "2022-09-11T00:00:00", + "gross_pnl": -185.47962403498133, + "pnl": -185.47962403498133, + "pnlcomm": -185.47962403498133, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2809228591007, + "entry_time": "2022-09-13T00:00:00", + "exit_price": 94.11130793179962, + "exit_time": "2022-09-14T00:00:00", + "gross_pnl": -16.96149273010832, + "pnl": -16.96149273010832, + "pnlcomm": -16.96149273010832, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78210365621945, + "entry_time": "2022-09-16T00:00:00", + "exit_price": 94.99114272050637, + "exit_time": "2022-09-17T00:00:00", + "gross_pnl": 20.903906428692665, + "pnl": 20.903906428692665, + "pnlcomm": 20.903906428692665, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26603620619443, + "entry_time": "2022-09-19T00:00:00", + "exit_price": 95.26895473010688, + "exit_time": "2022-09-20T00:00:00", + "gross_pnl": 100.29185239124558, + "pnl": 100.29185239124558, + "pnlcomm": 100.29185239124558, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88756691851471, + "entry_time": "2022-09-22T00:00:00", + "exit_price": 94.90535085923925, + "exit_time": "2022-09-23T00:00:00", + "gross_pnl": 1.778394072454148, + "pnl": 1.778394072454148, + "pnlcomm": 1.778394072454148, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8662778443967, + "entry_time": "2022-09-25T00:00:00", + "exit_price": 94.27678234231546, + "exit_time": "2022-09-26T00:00:00", + "gross_pnl": -58.94955020812489, + "pnl": -58.94955020812489, + "pnlcomm": -58.94955020812489, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21120724189035, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 93.62182381785365, + "exit_time": "2022-09-29T00:00:00", + "gross_pnl": -58.93834240366971, + "pnl": -58.93834240366971, + "pnlcomm": -58.93834240366971, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70089986040492, + "entry_time": "2022-10-01T00:00:00", + "exit_price": 94.98061841891752, + "exit_time": "2022-10-02T00:00:00", + "gross_pnl": 27.971855851259875, + "pnl": 27.971855851259875, + "pnlcomm": 27.971855851259875, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.63730668221623, + "entry_time": "2022-10-04T00:00:00", + "exit_price": 95.21809213108293, + "exit_time": "2022-10-05T00:00:00", + "gross_pnl": 58.07854488666919, + "pnl": 58.07854488666919, + "pnlcomm": 58.07854488666919, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62513446883317, + "entry_time": "2022-10-07T00:00:00", + "exit_price": 95.0550792423482, + "exit_time": "2022-10-08T00:00:00", + "gross_pnl": 42.994477351503235, + "pnl": 42.994477351503235, + "pnlcomm": 42.994477351503235, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7111656021986, + "entry_time": "2022-10-10T00:00:00", + "exit_price": 94.70112878957045, + "exit_time": "2022-10-11T00:00:00", + "gross_pnl": 98.9963187371842, + "pnl": 98.9963187371842, + "pnlcomm": 98.9963187371842, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22008595203475, + "entry_time": "2022-10-13T00:00:00", + "exit_price": 95.26583380518775, + "exit_time": "2022-10-14T00:00:00", + "gross_pnl": 104.57478531530029, + "pnl": 104.57478531530029, + "pnlcomm": 104.57478531530029, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84031644841893, + "entry_time": "2022-10-16T00:00:00", + "exit_price": 94.76253265375746, + "exit_time": "2022-10-17T00:00:00", + "gross_pnl": -7.778379466147101, + "pnl": -7.778379466147101, + "pnlcomm": -7.778379466147101, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36921450181964, + "entry_time": "2022-10-19T00:00:00", + "exit_price": 94.38751561741323, + "exit_time": "2022-10-20T00:00:00", + "gross_pnl": 101.83011155935873, + "pnl": 101.83011155935873, + "pnlcomm": 101.83011155935873, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.75942760797071, + "entry_time": "2022-10-22T00:00:00", + "exit_price": 94.20505090808615, + "exit_time": "2022-10-23T00:00:00", + "gross_pnl": -55.437669988455696, + "pnl": -55.437669988455696, + "pnlcomm": -55.437669988455696, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01993010545006, + "entry_time": "2022-10-25T00:00:00", + "exit_price": 94.25253006691226, + "exit_time": "2022-10-26T00:00:00", + "gross_pnl": -76.74000385378008, + "pnl": -76.74000385378008, + "pnlcomm": -76.74000385378008, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9292129294191, + "entry_time": "2022-10-28T00:00:00", + "exit_price": 95.45831791808807, + "exit_time": "2022-10-29T00:00:00", + "gross_pnl": 52.910498866897626, + "pnl": 52.910498866897626, + "pnlcomm": 52.910498866897626, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01874761761506, + "entry_time": "2022-10-31T00:00:00", + "exit_price": 95.70179579177142, + "exit_time": "2022-11-01T00:00:00", + "gross_pnl": 68.30481741563545, + "pnl": 68.30481741563545, + "pnlcomm": 68.30481741563545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.45782648578765, + "entry_time": "2022-11-03T00:00:00", + "exit_price": 95.9654506293958, + "exit_time": "2022-11-04T00:00:00", + "gross_pnl": -49.237585639184545, + "pnl": -49.237585639184545, + "pnlcomm": -49.237585639184545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.69543160906309, + "entry_time": "2022-11-06T00:00:00", + "exit_price": 96.23626703373414, + "exit_time": "2022-11-07T00:00:00", + "gross_pnl": 54.08354246710445, + "pnl": 54.08354246710445, + "pnlcomm": 54.08354246710445, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23730582460071, + "entry_time": "2022-11-09T00:00:00", + "exit_price": 94.58630669240723, + "exit_time": "2022-11-10T00:00:00", + "gross_pnl": -65.09991321934763, + "pnl": -65.09991321934763, + "pnlcomm": -65.09991321934763, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.24411442253736, + "entry_time": "2022-11-12T00:00:00", + "exit_price": 94.80412345904836, + "exit_time": "2022-11-13T00:00:00", + "gross_pnl": -43.999096348900935, + "pnl": -43.999096348900935, + "pnlcomm": -43.999096348900935, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33266826608637, + "entry_time": "2022-11-15T00:00:00", + "exit_price": 94.08584208568091, + "exit_time": "2022-11-16T00:00:00", + "gross_pnl": -24.682618040546345, + "pnl": -24.682618040546345, + "pnlcomm": -24.682618040546345, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20511704388718, + "entry_time": "2022-11-18T00:00:00", + "exit_price": 93.73586252939168, + "exit_time": "2022-11-19T00:00:00", + "gross_pnl": -46.92545144955034, + "pnl": -46.92545144955034, + "pnlcomm": -46.92545144955034, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6229802242446, + "entry_time": "2022-11-21T00:00:00", + "exit_price": 93.66558700926207, + "exit_time": "2022-11-22T00:00:00", + "gross_pnl": -95.7393214982531, + "pnl": -95.7393214982531, + "pnlcomm": -95.7393214982531, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74677062129318, + "entry_time": "2022-11-24T00:00:00", + "exit_price": 93.54017463980657, + "exit_time": "2022-11-25T00:00:00", + "gross_pnl": -20.659598148661473, + "pnl": -20.659598148661473, + "pnlcomm": -20.659598148661473, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.730138438308, + "entry_time": "2022-11-27T00:00:00", + "exit_price": 93.49572076787184, + "exit_time": "2022-11-28T00:00:00", + "gross_pnl": -23.44176704361587, + "pnl": -23.44176704361587, + "pnlcomm": -23.44176704361587, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77203615539878, + "entry_time": "2022-11-30T00:00:00", + "exit_price": 92.91635203682458, + "exit_time": "2022-12-01T00:00:00", + "gross_pnl": -85.5684118574203, + "pnl": -85.5684118574203, + "pnlcomm": -85.5684118574203, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91294155802171, + "entry_time": "2022-12-03T00:00:00", + "exit_price": 92.85493736088272, + "exit_time": "2022-12-04T00:00:00", + "gross_pnl": -105.80041971389988, + "pnl": -105.80041971389988, + "pnlcomm": -105.80041971389988, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07037492573127, + "entry_time": "2022-12-06T00:00:00", + "exit_price": 93.35918129576551, + "exit_time": "2022-12-07T00:00:00", + "gross_pnl": -71.11936299657629, + "pnl": -71.11936299657629, + "pnlcomm": -71.11936299657629, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21752684184962, + "entry_time": "2022-12-09T00:00:00", + "exit_price": 93.82182795562746, + "exit_time": "2022-12-10T00:00:00", + "gross_pnl": 60.430111377783646, + "pnl": 60.430111377783646, + "pnlcomm": 60.430111377783646, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91554181329224, + "entry_time": "2022-12-12T00:00:00", + "exit_price": 93.2637454877203, + "exit_time": "2022-12-13T00:00:00", + "gross_pnl": -65.17963255719366, + "pnl": -65.17963255719366, + "pnlcomm": -65.17963255719366, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42377971468683, + "entry_time": "2022-12-15T00:00:00", + "exit_price": 92.9956096009709, + "exit_time": "2022-12-16T00:00:00", + "gross_pnl": -42.817011371593594, + "pnl": -42.817011371593594, + "pnlcomm": -42.817011371593594, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95024629295155, + "entry_time": "2022-12-18T00:00:00", + "exit_price": 92.02384747382928, + "exit_time": "2022-12-19T00:00:00", + "gross_pnl": -92.63988191222694, + "pnl": -92.63988191222694, + "pnlcomm": -92.63988191222694, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.7384856392294, + "entry_time": "2022-12-21T00:00:00", + "exit_price": 91.78634727970504, + "exit_time": "2022-12-22T00:00:00", + "gross_pnl": 104.78616404756451, + "pnl": 104.78616404756451, + "pnlcomm": 104.78616404756451, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.46503843997183, + "entry_time": "2022-12-24T00:00:00", + "exit_price": 91.75198886376967, + "exit_time": "2022-12-25T00:00:00", + "gross_pnl": 28.69504237978333, + "pnl": 28.69504237978333, + "pnlcomm": 28.69504237978333, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.39876122857235, + "entry_time": "2022-12-27T00:00:00", + "exit_price": 92.11567284541557, + "exit_time": "2022-12-28T00:00:00", + "gross_pnl": -28.30883831567803, + "pnl": -28.30883831567803, + "pnlcomm": -28.30883831567803, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77091533493147, + "entry_time": "2022-12-30T00:00:00", + "exit_price": 93.3485194106044, + "exit_time": "2022-12-31T00:00:00", + "gross_pnl": 57.760407567292305, + "pnl": 57.760407567292305, + "pnlcomm": 57.760407567292305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04122370969267, + "entry_time": "2023-01-02T00:00:00", + "exit_price": 92.97807111210727, + "exit_time": "2023-01-03T00:00:00", + "gross_pnl": 93.68474024145996, + "pnl": 93.68474024145996, + "pnlcomm": 93.68474024145996, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82297627909733, + "entry_time": "2023-01-05T00:00:00", + "exit_price": 92.88908258807695, + "exit_time": "2023-01-06T00:00:00", + "gross_pnl": 6.6106308979613, + "pnl": 6.6106308979613, + "pnlcomm": 6.6106308979613, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.02494822567455, + "entry_time": "2023-01-08T00:00:00", + "exit_price": 92.52813633390632, + "exit_time": "2023-01-09T00:00:00", + "gross_pnl": -49.68118917682318, + "pnl": -49.68118917682318, + "pnlcomm": -49.68118917682318, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77607586946252, + "entry_time": "2023-01-11T00:00:00", + "exit_price": 92.84906975105618, + "exit_time": "2023-01-12T00:00:00", + "gross_pnl": 7.29938815936606, + "pnl": 7.29938815936606, + "pnlcomm": 7.29938815936606, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10682536410768, + "entry_time": "2023-01-14T00:00:00", + "exit_price": 92.60098332710814, + "exit_time": "2023-01-15T00:00:00", + "gross_pnl": -50.58420369995389, + "pnl": -50.58420369995389, + "pnlcomm": -50.58420369995389, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16477240647923, + "entry_time": "2023-01-17T00:00:00", + "exit_price": 93.64464350405021, + "exit_time": "2023-01-18T00:00:00", + "gross_pnl": 47.98710975709781, + "pnl": 47.98710975709781, + "pnlcomm": 47.98710975709781, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34853961981467, + "entry_time": "2023-01-20T00:00:00", + "exit_price": 92.90164291858915, + "exit_time": "2023-01-21T00:00:00", + "gross_pnl": 55.31032987744737, + "pnl": 55.31032987744737, + "pnlcomm": 55.31032987744737, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52920571661875, + "entry_time": "2023-01-23T00:00:00", + "exit_price": 92.96718442791747, + "exit_time": "2023-01-24T00:00:00", + "gross_pnl": -56.20212887012741, + "pnl": -56.20212887012741, + "pnlcomm": -56.20212887012741, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1449985691514, + "entry_time": "2023-01-26T00:00:00", + "exit_price": 93.09214526901171, + "exit_time": "2023-01-27T00:00:00", + "gross_pnl": -105.2853300139688, + "pnl": -105.2853300139688, + "pnlcomm": -105.2853300139688, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08808617199072, + "entry_time": "2023-01-29T00:00:00", + "exit_price": 93.57735843418071, + "exit_time": "2023-01-30T00:00:00", + "gross_pnl": -51.0727737810015, + "pnl": -51.0727737810015, + "pnlcomm": -51.0727737810015, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.03374091329061, + "entry_time": "2023-02-01T00:00:00", + "exit_price": 92.67153521214688, + "exit_time": "2023-02-02T00:00:00", + "gross_pnl": -136.22057011437363, + "pnl": -136.22057011437363, + "pnlcomm": -136.22057011437363, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90721494360177, + "entry_time": "2023-02-04T00:00:00", + "exit_price": 92.94800270723887, + "exit_time": "2023-02-05T00:00:00", + "gross_pnl": 4.078776363709835, + "pnl": 4.078776363709835, + "pnlcomm": 4.078776363709835, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77341143396697, + "entry_time": "2023-02-07T00:00:00", + "exit_price": 93.16810608211969, + "exit_time": "2023-02-08T00:00:00", + "gross_pnl": -60.530535184727796, + "pnl": -60.530535184727796, + "pnlcomm": -60.530535184727796, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1295561924666, + "entry_time": "2023-02-10T00:00:00", + "exit_price": 93.6109897663897, + "exit_time": "2023-02-11T00:00:00", + "gross_pnl": 48.14335739230984, + "pnl": 48.14335739230984, + "pnlcomm": 48.14335739230984, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09160273927314, + "entry_time": "2023-02-13T00:00:00", + "exit_price": 93.33166346007059, + "exit_time": "2023-02-14T00:00:00", + "gross_pnl": -75.99392792025554, + "pnl": -75.99392792025554, + "pnlcomm": -75.99392792025554, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53620789150742, + "entry_time": "2023-02-16T00:00:00", + "exit_price": 94.21568894504843, + "exit_time": "2023-02-17T00:00:00", + "gross_pnl": -32.051894645898926, + "pnl": -32.051894645898926, + "pnlcomm": -32.051894645898926, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93343913761625, + "entry_time": "2023-02-19T00:00:00", + "exit_price": 94.02299067534886, + "exit_time": "2023-02-20T00:00:00", + "gross_pnl": 8.95515377326177, + "pnl": 8.95515377326177, + "pnlcomm": 8.95515377326177, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18544500815403, + "entry_time": "2023-02-22T00:00:00", + "exit_price": 93.98907937476646, + "exit_time": "2023-02-23T00:00:00", + "gross_pnl": -19.636563338757185, + "pnl": -19.636563338757185, + "pnlcomm": -19.636563338757185, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45348785433026, + "entry_time": "2023-02-25T00:00:00", + "exit_price": 95.02085687929099, + "exit_time": "2023-02-26T00:00:00", + "gross_pnl": 56.73690249607262, + "pnl": 56.73690249607262, + "pnlcomm": 56.73690249607262, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84830391916218, + "entry_time": "2023-02-28T00:00:00", + "exit_price": 94.43699045607909, + "exit_time": "2023-03-01T00:00:00", + "gross_pnl": -41.13134630830899, + "pnl": -41.13134630830899, + "pnlcomm": -41.13134630830899, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.95759166912264, + "entry_time": "2023-03-03T00:00:00", + "exit_price": 93.47551491598016, + "exit_time": "2023-03-04T00:00:00", + "gross_pnl": -48.20767531424792, + "pnl": -48.20767531424792, + "pnlcomm": -48.20767531424792, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66498305754212, + "entry_time": "2023-03-06T00:00:00", + "exit_price": 93.36643618283398, + "exit_time": "2023-03-07T00:00:00", + "gross_pnl": -29.8546874708137, + "pnl": -29.8546874708137, + "pnlcomm": -29.8546874708137, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3496449568648, + "entry_time": "2023-03-09T00:00:00", + "exit_price": 93.06229907806569, + "exit_time": "2023-03-10T00:00:00", + "gross_pnl": -28.734587879910123, + "pnl": -28.734587879910123, + "pnlcomm": -28.734587879910123, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93784310790696, + "entry_time": "2023-03-12T00:00:00", + "exit_price": 92.96780942003683, + "exit_time": "2023-03-13T00:00:00", + "gross_pnl": -97.00336878701279, + "pnl": -97.00336878701279, + "pnlcomm": -97.00336878701279, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88445131540618, + "entry_time": "2023-03-15T00:00:00", + "exit_price": 94.08186481058257, + "exit_time": "2023-03-16T00:00:00", + "gross_pnl": 19.74134951763915, + "pnl": 19.74134951763915, + "pnlcomm": 19.74134951763915, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20796655389181, + "entry_time": "2023-03-18T00:00:00", + "exit_price": 91.9654081254928, + "exit_time": "2023-03-19T00:00:00", + "gross_pnl": -24.255842839900765, + "pnl": -24.255842839900765, + "pnlcomm": -24.255842839900765, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49393791749024, + "entry_time": "2023-03-21T00:00:00", + "exit_price": 92.05007592523164, + "exit_time": "2023-03-22T00:00:00", + "gross_pnl": -44.38619922586042, + "pnl": -44.38619922586042, + "pnlcomm": -44.38619922586042, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.84518996211608, + "entry_time": "2023-03-24T00:00:00", + "exit_price": 92.32190345568543, + "exit_time": "2023-03-25T00:00:00", + "gross_pnl": 47.67134935693491, + "pnl": 47.67134935693491, + "pnlcomm": 47.67134935693491, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32827178627502, + "entry_time": "2023-03-27T00:00:00", + "exit_price": 93.26562867244172, + "exit_time": "2023-03-28T00:00:00", + "gross_pnl": -6.264311383330323, + "pnl": -6.264311383330323, + "pnlcomm": -6.264311383330323, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9489490131078, + "entry_time": "2023-03-30T00:00:00", + "exit_price": 93.54756230484855, + "exit_time": "2023-03-31T00:00:00", + "gross_pnl": 59.86132917407474, + "pnl": 59.86132917407474, + "pnlcomm": 59.86132917407474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52695826109522, + "entry_time": "2023-04-02T00:00:00", + "exit_price": 93.16120912048845, + "exit_time": "2023-04-03T00:00:00", + "gross_pnl": -36.57491406067663, + "pnl": -36.57491406067663, + "pnlcomm": -36.57491406067663, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73109278013733, + "entry_time": "2023-04-05T00:00:00", + "exit_price": 92.12967158946792, + "exit_time": "2023-04-06T00:00:00", + "gross_pnl": -60.14211906694129, + "pnl": -60.14211906694129, + "pnlcomm": -60.14211906694129, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66144197243285, + "entry_time": "2023-04-08T00:00:00", + "exit_price": 92.35105870140517, + "exit_time": "2023-04-09T00:00:00", + "gross_pnl": -31.038327102768903, + "pnl": -31.038327102768903, + "pnlcomm": -31.038327102768903, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32497954050243, + "entry_time": "2023-04-11T00:00:00", + "exit_price": 92.404028525945, + "exit_time": "2023-04-12T00:00:00", + "gross_pnl": -92.09510145574313, + "pnl": -92.09510145574313, + "pnlcomm": -92.09510145574313, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5596224194739, + "entry_time": "2023-04-14T00:00:00", + "exit_price": 93.06373732644884, + "exit_time": "2023-04-15T00:00:00", + "gross_pnl": 50.4114906974948, + "pnl": 50.4114906974948, + "pnlcomm": 50.4114906974948, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82924854494931, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 92.63616550173667, + "exit_time": "2023-04-18T00:00:00", + "gross_pnl": -19.308304321263847, + "pnl": -19.308304321263847, + "pnlcomm": -19.308304321263847, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79933273190036, + "entry_time": "2023-04-20T00:00:00", + "exit_price": 92.95120755426662, + "exit_time": "2023-04-21T00:00:00", + "gross_pnl": 15.187482236625272, + "pnl": 15.187482236625272, + "pnlcomm": 15.187482236625272, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56403816854014, + "entry_time": "2023-04-23T00:00:00", + "exit_price": 92.35426808914588, + "exit_time": "2023-04-24T00:00:00", + "gross_pnl": -20.977007939426073, + "pnl": -20.977007939426073, + "pnlcomm": -20.977007939426073, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35865607168631, + "entry_time": "2023-04-26T00:00:00", + "exit_price": 92.90482034285156, + "exit_time": "2023-04-27T00:00:00", + "gross_pnl": -45.3835728834747, + "pnl": -45.3835728834747, + "pnlcomm": -45.3835728834747, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9985787957225, + "entry_time": "2023-04-29T00:00:00", + "exit_price": 92.8768940380532, + "exit_time": "2023-04-30T00:00:00", + "gross_pnl": -12.168475766929987, + "pnl": -12.168475766929987, + "pnlcomm": -12.168475766929987, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86502942650776, + "entry_time": "2023-05-02T00:00:00", + "exit_price": 92.82867955654159, + "exit_time": "2023-05-03T00:00:00", + "gross_pnl": -3.6349869966173287, + "pnl": -3.6349869966173287, + "pnlcomm": -3.6349869966173287, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06669061925808, + "entry_time": "2023-05-05T00:00:00", + "exit_price": 93.05805100493505, + "exit_time": "2023-05-06T00:00:00", + "gross_pnl": -0.8639614323030287, + "pnl": -0.8639614323030287, + "pnlcomm": -0.8639614323030287, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19478081630376, + "entry_time": "2023-05-08T00:00:00", + "exit_price": 92.4726753044577, + "exit_time": "2023-05-09T00:00:00", + "gross_pnl": -72.21055118460669, + "pnl": -72.21055118460669, + "pnlcomm": -72.21055118460669, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8774192059464, + "entry_time": "2023-05-11T00:00:00", + "exit_price": 93.47630925649874, + "exit_time": "2023-05-12T00:00:00", + "gross_pnl": 159.88900505523418, + "pnl": 159.88900505523418, + "pnlcomm": 159.88900505523418, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67940992744533, + "entry_time": "2023-05-14T00:00:00", + "exit_price": 93.83387030747774, + "exit_time": "2023-05-15T00:00:00", + "gross_pnl": 115.4460380032404, + "pnl": 115.4460380032404, + "pnlcomm": 115.4460380032404, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77541066961662, + "entry_time": "2023-05-17T00:00:00", + "exit_price": 93.21806909335821, + "exit_time": "2023-05-18T00:00:00", + "gross_pnl": 44.26584237415909, + "pnl": 44.26584237415909, + "pnlcomm": 44.26584237415909, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2116719393634, + "entry_time": "2023-05-20T00:00:00", + "exit_price": 93.63189068076446, + "exit_time": "2023-05-21T00:00:00", + "gross_pnl": 42.02187414010581, + "pnl": 42.02187414010581, + "pnlcomm": 42.02187414010581, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31676028980675, + "entry_time": "2023-05-23T00:00:00", + "exit_price": 93.96917376263126, + "exit_time": "2023-05-24T00:00:00", + "gross_pnl": 65.24134728245059, + "pnl": 65.24134728245059, + "pnlcomm": 65.24134728245059, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.3332407570871, + "entry_time": "2023-05-26T00:00:00", + "exit_price": 94.63597205774145, + "exit_time": "2023-05-27T00:00:00", + "gross_pnl": 30.273130065435794, + "pnl": 30.273130065435794, + "pnlcomm": 30.273130065435794, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00130198273088, + "entry_time": "2023-05-29T00:00:00", + "exit_price": 94.05926832590498, + "exit_time": "2023-05-30T00:00:00", + "gross_pnl": 5.79663431741011, + "pnl": 5.79663431741011, + "pnlcomm": 5.79663431741011, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76190103073331, + "entry_time": "2023-06-01T00:00:00", + "exit_price": 94.24963627943364, + "exit_time": "2023-06-02T00:00:00", + "gross_pnl": 148.7735248700332, + "pnl": 148.7735248700332, + "pnlcomm": 148.7735248700332, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.73904226779082, + "entry_time": "2023-06-04T00:00:00", + "exit_price": 94.53198582108524, + "exit_time": "2023-06-05T00:00:00", + "gross_pnl": -20.705644670557888, + "pnl": -20.705644670557888, + "pnlcomm": -20.705644670557888, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29391446442064, + "entry_time": "2023-06-07T00:00:00", + "exit_price": 94.60323551607766, + "exit_time": "2023-06-08T00:00:00", + "gross_pnl": 30.93210516570224, + "pnl": 30.93210516570224, + "pnlcomm": 30.93210516570224, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.17535379161295, + "entry_time": "2023-06-10T00:00:00", + "exit_price": 94.95745054254392, + "exit_time": "2023-06-11T00:00:00", + "gross_pnl": 78.20967509309753, + "pnl": 78.20967509309753, + "pnlcomm": 78.20967509309753, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65432843266518, + "entry_time": "2023-06-13T00:00:00", + "exit_price": 94.33856790601594, + "exit_time": "2023-06-14T00:00:00", + "gross_pnl": -31.576052664924248, + "pnl": -31.576052664924248, + "pnlcomm": -31.576052664924248, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.36956060356385, + "entry_time": "2023-06-16T00:00:00", + "exit_price": 95.2507487739047, + "exit_time": "2023-06-17T00:00:00", + "gross_pnl": 88.11881703408488, + "pnl": 88.11881703408488, + "pnlcomm": 88.11881703408488, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9809276691774, + "entry_time": "2023-06-19T00:00:00", + "exit_price": 94.16338627425559, + "exit_time": "2023-06-20T00:00:00", + "gross_pnl": -81.75413949218182, + "pnl": -81.75413949218182, + "pnlcomm": -81.75413949218182, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95283790294347, + "entry_time": "2023-06-22T00:00:00", + "exit_price": 94.37363985497257, + "exit_time": "2023-06-23T00:00:00", + "gross_pnl": -57.919804797090535, + "pnl": -57.919804797090535, + "pnlcomm": -57.919804797090535, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41734797456819, + "entry_time": "2023-06-25T00:00:00", + "exit_price": 94.46879833485087, + "exit_time": "2023-06-26T00:00:00", + "gross_pnl": 5.145036028268635, + "pnl": 5.145036028268635, + "pnlcomm": 5.145036028268635, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89779171625213, + "entry_time": "2023-06-28T00:00:00", + "exit_price": 94.56566914846213, + "exit_time": "2023-06-29T00:00:00", + "gross_pnl": 66.78774322100054, + "pnl": 66.78774322100054, + "pnlcomm": 66.78774322100054, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12295330761386, + "entry_time": "2023-07-01T00:00:00", + "exit_price": 94.47229523041987, + "exit_time": "2023-07-02T00:00:00", + "gross_pnl": 34.934192280601906, + "pnl": 34.934192280601906, + "pnlcomm": 34.934192280601906, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01642931045994, + "entry_time": "2023-07-04T00:00:00", + "exit_price": 94.97899403484826, + "exit_time": "2023-07-05T00:00:00", + "gross_pnl": 96.25647243883151, + "pnl": 96.25647243883151, + "pnlcomm": 96.25647243883151, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29040521639678, + "entry_time": "2023-07-07T00:00:00", + "exit_price": 94.62958711128005, + "exit_time": "2023-07-08T00:00:00", + "gross_pnl": -66.08181051167321, + "pnl": -66.08181051167321, + "pnlcomm": -66.08181051167321, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94114223449, + "entry_time": "2023-07-10T00:00:00", + "exit_price": 94.38592136937638, + "exit_time": "2023-07-11T00:00:00", + "gross_pnl": -55.522086511362545, + "pnl": -55.522086511362545, + "pnlcomm": -55.522086511362545, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493222435549, + "entry_time": "2023-07-13T00:00:00", + "exit_price": 94.3474523152517, + "exit_time": "2023-07-14T00:00:00", + "gross_pnl": -14.577012029729985, + "pnl": -14.577012029729985, + "pnlcomm": -14.577012029729985, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.84805377401344, + "entry_time": "2023-07-16T00:00:00", + "exit_price": 93.24313248176318, + "exit_time": "2023-07-17T00:00:00", + "gross_pnl": -60.49212922502534, + "pnl": -60.49212922502534, + "pnlcomm": -60.49212922502534, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23716867785055, + "entry_time": "2023-07-19T00:00:00", + "exit_price": 94.3344550507391, + "exit_time": "2023-07-20T00:00:00", + "gross_pnl": 109.72863728885471, + "pnl": 109.72863728885471, + "pnlcomm": 109.72863728885471, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25058017257405, + "entry_time": "2023-07-22T00:00:00", + "exit_price": 94.26148603669161, + "exit_time": "2023-07-23T00:00:00", + "gross_pnl": 1.0905864117560782, + "pnl": 1.0905864117560782, + "pnlcomm": 1.0905864117560782, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78124566715695, + "entry_time": "2023-07-25T00:00:00", + "exit_price": 93.30392352510412, + "exit_time": "2023-07-26T00:00:00", + "gross_pnl": -147.73221420528273, + "pnl": -147.73221420528273, + "pnlcomm": -147.73221420528273, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05471403229689, + "entry_time": "2023-07-28T00:00:00", + "exit_price": 93.26889976544973, + "exit_time": "2023-07-29T00:00:00", + "gross_pnl": -78.58142668471544, + "pnl": -78.58142668471544, + "pnlcomm": -78.58142668471544, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.97149252732743, + "entry_time": "2023-07-31T00:00:00", + "exit_price": 92.49652862514738, + "exit_time": "2023-08-01T00:00:00", + "gross_pnl": -147.49639021800505, + "pnl": -147.49639021800505, + "pnlcomm": -147.49639021800505, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49761686858754, + "entry_time": "2023-08-03T00:00:00", + "exit_price": 93.96133483843103, + "exit_time": "2023-08-04T00:00:00", + "gross_pnl": 46.371796984348634, + "pnl": 46.371796984348634, + "pnlcomm": 46.371796984348634, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60373115569557, + "entry_time": "2023-08-06T00:00:00", + "exit_price": 94.43278823558683, + "exit_time": "2023-08-07T00:00:00", + "gross_pnl": 82.90570798912569, + "pnl": 82.90570798912569, + "pnlcomm": 82.90570798912569, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.216186422251, + "entry_time": "2023-08-09T00:00:00", + "exit_price": 93.22790913521419, + "exit_time": "2023-08-10T00:00:00", + "gross_pnl": -98.82772870368086, + "pnl": -98.82772870368086, + "pnlcomm": -98.82772870368086, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53921057943961, + "entry_time": "2023-08-12T00:00:00", + "exit_price": 93.3857390941578, + "exit_time": "2023-08-13T00:00:00", + "gross_pnl": -115.34714852818126, + "pnl": -115.34714852818126, + "pnlcomm": -115.34714852818126, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.03374081752091, + "entry_time": "2023-08-15T00:00:00", + "exit_price": 94.39823678210567, + "exit_time": "2023-08-16T00:00:00", + "gross_pnl": 136.4495964584762, + "pnl": 136.4495964584762, + "pnlcomm": 136.4495964584762, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08940418013472, + "entry_time": "2023-08-18T00:00:00", + "exit_price": 92.65920217896303, + "exit_time": "2023-08-19T00:00:00", + "gross_pnl": -143.02020011716934, + "pnl": -143.02020011716934, + "pnlcomm": -143.02020011716934, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39853539402684, + "entry_time": "2023-08-21T00:00:00", + "exit_price": 93.65048655775455, + "exit_time": "2023-08-22T00:00:00", + "gross_pnl": 25.195116372771054, + "pnl": 25.195116372771054, + "pnlcomm": 25.195116372771054, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79873760769597, + "entry_time": "2023-08-24T00:00:00", + "exit_price": 93.68828575617101, + "exit_time": "2023-08-25T00:00:00", + "gross_pnl": 88.95481484750434, + "pnl": 88.95481484750434, + "pnlcomm": 88.95481484750434, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87251964203307, + "entry_time": "2023-08-27T00:00:00", + "exit_price": 93.5300255114375, + "exit_time": "2023-08-28T00:00:00", + "gross_pnl": -34.249413059556844, + "pnl": -34.249413059556844, + "pnlcomm": -34.249413059556844, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79086592344467, + "entry_time": "2023-08-30T00:00:00", + "exit_price": 92.57270931229704, + "exit_time": "2023-08-31T00:00:00", + "gross_pnl": -121.81566111476343, + "pnl": -121.81566111476343, + "pnlcomm": -121.81566111476343, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88859692291733, + "entry_time": "2023-09-02T00:00:00", + "exit_price": 93.80271734344691, + "exit_time": "2023-09-03T00:00:00", + "gross_pnl": -8.587957947041502, + "pnl": -8.587957947041502, + "pnlcomm": -8.587957947041502, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04073002158317, + "entry_time": "2023-09-05T00:00:00", + "exit_price": 94.46828834544144, + "exit_time": "2023-09-06T00:00:00", + "gross_pnl": 142.7558323858264, + "pnl": 142.7558323858264, + "pnlcomm": 142.7558323858264, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23692924750449, + "entry_time": "2023-09-08T00:00:00", + "exit_price": 94.43771978777833, + "exit_time": "2023-09-09T00:00:00", + "gross_pnl": 20.079054027384302, + "pnl": 20.079054027384302, + "pnlcomm": 20.079054027384302, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09517649815284, + "entry_time": "2023-09-11T00:00:00", + "exit_price": 94.97835234626153, + "exit_time": "2023-09-12T00:00:00", + "gross_pnl": 88.31758481086922, + "pnl": 88.31758481086922, + "pnlcomm": 88.31758481086922, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79133291522645, + "entry_time": "2023-09-14T00:00:00", + "exit_price": 94.02945945000636, + "exit_time": "2023-09-15T00:00:00", + "gross_pnl": -76.18734652200914, + "pnl": -76.18734652200914, + "pnlcomm": -76.18734652200914, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45235296621496, + "entry_time": "2023-09-17T00:00:00", + "exit_price": 94.63061442838703, + "exit_time": "2023-09-18T00:00:00", + "gross_pnl": 17.826146217207395, + "pnl": 17.826146217207395, + "pnlcomm": 17.826146217207395, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1729530420449, + "entry_time": "2023-09-20T00:00:00", + "exit_price": 93.58327824763774, + "exit_time": "2023-09-21T00:00:00", + "gross_pnl": -58.96747944071592, + "pnl": -58.96747944071592, + "pnlcomm": -58.96747944071592, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.536291527272, + "entry_time": "2023-09-23T00:00:00", + "exit_price": 93.30651397849368, + "exit_time": "2023-09-24T00:00:00", + "gross_pnl": -22.977754877831558, + "pnl": -22.977754877831558, + "pnlcomm": -22.977754877831558, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69842586893596, + "entry_time": "2023-09-26T00:00:00", + "exit_price": 93.16248763742118, + "exit_time": "2023-09-27T00:00:00", + "gross_pnl": -53.59382315147769, + "pnl": -53.59382315147769, + "pnlcomm": -53.59382315147769, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49605102540508, + "entry_time": "2023-09-29T00:00:00", + "exit_price": 94.25313944944546, + "exit_time": "2023-09-30T00:00:00", + "gross_pnl": 75.70884240403757, + "pnl": 75.70884240403757, + "pnlcomm": 75.70884240403757, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8421663218519, + "entry_time": "2023-10-02T00:00:00", + "exit_price": 92.97561455613513, + "exit_time": "2023-10-03T00:00:00", + "gross_pnl": 13.344823428322172, + "pnl": 13.344823428322172, + "pnlcomm": 13.344823428322172, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01878568439928, + "entry_time": "2023-10-05T00:00:00", + "exit_price": 92.7731623418128, + "exit_time": "2023-10-06T00:00:00", + "gross_pnl": -24.562334258646956, + "pnl": -24.562334258646956, + "pnlcomm": -24.562334258646956, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3031103300392, + "entry_time": "2023-10-08T00:00:00", + "exit_price": 92.82895908639827, + "exit_time": "2023-10-09T00:00:00", + "gross_pnl": -47.41512436409323, + "pnl": -47.41512436409323, + "pnlcomm": -47.41512436409323, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34460637435383, + "entry_time": "2023-10-11T00:00:00", + "exit_price": 92.32181327562058, + "exit_time": "2023-10-12T00:00:00", + "gross_pnl": -2.2793098733245643, + "pnl": -2.2793098733245643, + "pnlcomm": -2.2793098733245643, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.5260793564055, + "entry_time": "2023-10-14T00:00:00", + "exit_price": 92.2357948297768, + "exit_time": "2023-10-15T00:00:00", + "gross_pnl": 70.97154733712898, + "pnl": 70.97154733712898, + "pnlcomm": 70.97154733712898, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68746434551585, + "entry_time": "2023-10-17T00:00:00", + "exit_price": 91.58592175261929, + "exit_time": "2023-10-18T00:00:00", + "gross_pnl": -10.154259289656409, + "pnl": -10.154259289656409, + "pnlcomm": -10.154259289656409, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.46697080069039, + "entry_time": "2023-10-20T00:00:00", + "exit_price": 91.654447961068, + "exit_time": "2023-10-21T00:00:00", + "gross_pnl": 18.74771603776111, + "pnl": 18.74771603776111, + "pnlcomm": 18.74771603776111, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3612670935331, + "entry_time": "2023-10-23T00:00:00", + "exit_price": 91.01031054901587, + "exit_time": "2023-10-24T00:00:00", + "gross_pnl": -135.09565445172314, + "pnl": -135.09565445172314, + "pnlcomm": -135.09565445172314, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.37919304454006, + "entry_time": "2023-10-26T00:00:00", + "exit_price": 91.41169786096938, + "exit_time": "2023-10-27T00:00:00", + "gross_pnl": -96.74951835706764, + "pnl": -96.74951835706764, + "pnlcomm": -96.74951835706764, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.29381617044329, + "entry_time": "2023-10-29T00:00:00", + "exit_price": 90.70386499802939, + "exit_time": "2023-10-30T00:00:00", + "gross_pnl": -58.99511724139046, + "pnl": -58.99511724139046, + "pnlcomm": -58.99511724139046, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.42981226133158, + "entry_time": "2023-11-01T00:00:00", + "exit_price": 91.13311787546733, + "exit_time": "2023-11-02T00:00:00", + "gross_pnl": -29.669438586424235, + "pnl": -29.669438586424235, + "pnlcomm": -29.669438586424235, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41698336938477, + "entry_time": "2023-11-04T00:00:00", + "exit_price": 91.39366908316057, + "exit_time": "2023-11-05T00:00:00", + "gross_pnl": -2.331428622419196, + "pnl": -2.331428622419196, + "pnlcomm": -2.331428622419196, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89356698837386, + "entry_time": "2023-11-07T00:00:00", + "exit_price": 91.60226357609555, + "exit_time": "2023-11-08T00:00:00", + "gross_pnl": -29.130341227831025, + "pnl": -29.130341227831025, + "pnlcomm": -29.130341227831025, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.41574363121151, + "entry_time": "2023-11-10T00:00:00", + "exit_price": 91.77307124686526, + "exit_time": "2023-11-11T00:00:00", + "gross_pnl": -64.26723843462554, + "pnl": -64.26723843462554, + "pnlcomm": -64.26723843462554, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32527272706531, + "entry_time": "2023-11-13T00:00:00", + "exit_price": 94.02617500869306, + "exit_time": "2023-11-14T00:00:00", + "gross_pnl": 170.0902281627748, + "pnl": 170.0902281627748, + "pnlcomm": 170.0902281627748, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9453398724905, + "entry_time": "2023-11-16T00:00:00", + "exit_price": 92.0185892574846, + "exit_time": "2023-11-17T00:00:00", + "gross_pnl": -92.67506150059006, + "pnl": -92.67506150059006, + "pnlcomm": -92.67506150059006, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.30963127571127, + "entry_time": "2023-11-19T00:00:00", + "exit_price": 92.25489319248068, + "exit_time": "2023-11-20T00:00:00", + "gross_pnl": -5.473808323058904, + "pnl": -5.473808323058904, + "pnlcomm": -5.473808323058904, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74391567498766, + "entry_time": "2023-11-22T00:00:00", + "exit_price": 93.20889480054281, + "exit_time": "2023-11-23T00:00:00", + "gross_pnl": 46.49791255551463, + "pnl": 46.49791255551463, + "pnlcomm": 46.49791255551463, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11263111652507, + "entry_time": "2023-11-25T00:00:00", + "exit_price": 93.10139698703692, + "exit_time": "2023-11-26T00:00:00", + "gross_pnl": -101.12341294881446, + "pnl": -101.12341294881446, + "pnlcomm": -101.12341294881446, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71015543952899, + "entry_time": "2023-11-28T00:00:00", + "exit_price": 92.47583632063913, + "exit_time": "2023-11-29T00:00:00", + "gross_pnl": -123.43191188898572, + "pnl": -123.43191188898572, + "pnlcomm": -123.43191188898572, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75986386635343, + "entry_time": "2023-12-01T00:00:00", + "exit_price": 94.27037620813209, + "exit_time": "2023-12-02T00:00:00", + "gross_pnl": 151.05123417786643, + "pnl": 151.05123417786643, + "pnlcomm": 151.05123417786643, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44774661355898, + "entry_time": "2023-12-04T00:00:00", + "exit_price": 93.99875783176927, + "exit_time": "2023-12-05T00:00:00", + "gross_pnl": 55.10112182102915, + "pnl": 55.10112182102915, + "pnlcomm": 55.10112182102915, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58344310898, + "entry_time": "2023-12-07T00:00:00", + "exit_price": 94.14439051922356, + "exit_time": "2023-12-08T00:00:00", + "gross_pnl": 56.0947410243557, + "pnl": 56.0947410243557, + "pnlcomm": 56.0947410243557, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.54039819515215, + "entry_time": "2023-12-10T00:00:00", + "exit_price": 92.9236778577475, + "exit_time": "2023-12-11T00:00:00", + "gross_pnl": 38.32796625953563, + "pnl": 38.32796625953563, + "pnlcomm": 38.32796625953563, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05584126819757, + "entry_time": "2023-12-13T00:00:00", + "exit_price": 93.35601781114134, + "exit_time": "2023-12-14T00:00:00", + "gross_pnl": 130.0176542943774, + "pnl": 130.0176542943774, + "pnlcomm": 130.0176542943774, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81351651597147, + "entry_time": "2023-12-16T00:00:00", + "exit_price": 92.84701543791368, + "exit_time": "2023-12-17T00:00:00", + "gross_pnl": 3.349892194221127, + "pnl": 3.349892194221127, + "pnlcomm": 3.349892194221127, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72332949821384, + "entry_time": "2023-12-19T00:00:00", + "exit_price": 92.51107159043487, + "exit_time": "2023-12-20T00:00:00", + "gross_pnl": -21.225790777897657, + "pnl": -21.225790777897657, + "pnlcomm": -21.225790777897657, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91369044105626, + "entry_time": "2023-12-22T00:00:00", + "exit_price": 93.12129104458734, + "exit_time": "2023-12-23T00:00:00", + "gross_pnl": -79.23993964689231, + "pnl": -79.23993964689231, + "pnlcomm": -79.23993964689231, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.14884637460801, + "entry_time": "2023-12-25T00:00:00", + "exit_price": 92.89417488264915, + "exit_time": "2023-12-26T00:00:00", + "gross_pnl": 74.53285080411405, + "pnl": 74.53285080411405, + "pnlcomm": 74.53285080411405, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12845985022912, + "entry_time": "2023-12-28T00:00:00", + "exit_price": 93.6597993052993, + "exit_time": "2023-12-29T00:00:00", + "gross_pnl": 53.133945507018154, + "pnl": 53.133945507018154, + "pnlcomm": 53.133945507018154, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96178874818798, + "entry_time": "2023-12-31T00:00:00", + "exit_price": 94.4511703887473, + "exit_time": "2024-01-01T00:00:00", + "gross_pnl": 48.938164055931566, + "pnl": 48.938164055931566, + "pnlcomm": 48.938164055931566, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.89229345893365, + "entry_time": "2024-01-03T00:00:00", + "exit_price": 94.58860576042824, + "exit_time": "2024-01-04T00:00:00", + "gross_pnl": -30.368769850541355, + "pnl": -30.368769850541355, + "pnlcomm": -30.368769850541355, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.04178116383622, + "entry_time": "2024-01-06T00:00:00", + "exit_price": 94.4578576609693, + "exit_time": "2024-01-07T00:00:00", + "gross_pnl": -58.39235028669236, + "pnl": -58.39235028669236, + "pnlcomm": -58.39235028669236, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.86053478009173, + "entry_time": "2024-01-09T00:00:00", + "exit_price": 94.76430023458303, + "exit_time": "2024-01-10T00:00:00", + "gross_pnl": -9.623454550869326, + "pnl": -9.623454550869326, + "pnlcomm": -9.623454550869326, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8053175522895, + "entry_time": "2024-01-12T00:00:00", + "exit_price": 94.40836408730765, + "exit_time": "2024-01-13T00:00:00", + "gross_pnl": -39.69534649818485, + "pnl": -39.69534649818485, + "pnlcomm": -39.69534649818485, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.85612524977265, + "entry_time": "2024-01-15T00:00:00", + "exit_price": 94.40863693697362, + "exit_time": "2024-01-16T00:00:00", + "gross_pnl": -44.74883127990239, + "pnl": -44.74883127990239, + "pnlcomm": -44.74883127990239, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09196518919535, + "entry_time": "2024-01-18T00:00:00", + "exit_price": 94.91994528712154, + "exit_time": "2024-01-19T00:00:00", + "gross_pnl": -17.201990207381357, + "pnl": -17.201990207381357, + "pnlcomm": -17.201990207381357, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.45747729845408, + "entry_time": "2024-01-21T00:00:00", + "exit_price": 95.40486331313025, + "exit_time": "2024-01-22T00:00:00", + "gross_pnl": -5.261398532383055, + "pnl": -5.261398532383055, + "pnlcomm": -5.261398532383055, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8856295626394, + "entry_time": "2024-01-24T00:00:00", + "exit_price": 95.41673292493975, + "exit_time": "2024-01-25T00:00:00", + "gross_pnl": 53.11033623003567, + "pnl": 53.11033623003567, + "pnlcomm": 53.11033623003567, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.30115153676562, + "entry_time": "2024-01-27T00:00:00", + "exit_price": 94.50993042362319, + "exit_time": "2024-01-28T00:00:00", + "gross_pnl": -79.12211131424272, + "pnl": -79.12211131424272, + "pnlcomm": -79.12211131424272, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8443544450889, + "entry_time": "2024-01-30T00:00:00", + "exit_price": 94.58646684173618, + "exit_time": "2024-01-31T00:00:00", + "gross_pnl": -25.788760335271377, + "pnl": -25.788760335271377, + "pnlcomm": -25.788760335271377, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.51863942815191, + "entry_time": "2024-02-02T00:00:00", + "exit_price": 95.02582579018504, + "exit_time": "2024-02-03T00:00:00", + "gross_pnl": -49.28136379668757, + "pnl": -49.28136379668757, + "pnlcomm": -49.28136379668757, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.64624335712315, + "entry_time": "2024-02-05T00:00:00", + "exit_price": 95.62478266594604, + "exit_time": "2024-02-06T00:00:00", + "gross_pnl": -2.1460691177111357, + "pnl": -2.1460691177111357, + "pnlcomm": -2.1460691177111357, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.97351592845854, + "entry_time": "2024-02-08T00:00:00", + "exit_price": 96.2565162152012, + "exit_time": "2024-02-09T00:00:00", + "gross_pnl": 128.3000286742663, + "pnl": 128.3000286742663, + "pnlcomm": 128.3000286742663, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32379857764127, + "entry_time": "2024-02-11T00:00:00", + "exit_price": 93.96151236382953, + "exit_time": "2024-02-12T00:00:00", + "gross_pnl": -36.228621381174264, + "pnl": -36.228621381174264, + "pnlcomm": -36.228621381174264, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38409820559012, + "entry_time": "2024-02-14T00:00:00", + "exit_price": 94.76791246698865, + "exit_time": "2024-02-15T00:00:00", + "gross_pnl": 38.38142613985269, + "pnl": 38.38142613985269, + "pnlcomm": 38.38142613985269, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.15204268625024, + "entry_time": "2024-02-17T00:00:00", + "exit_price": 94.14536275879573, + "exit_time": "2024-02-18T00:00:00", + "gross_pnl": -100.66799274545133, + "pnl": -100.66799274545133, + "pnlcomm": -100.66799274545133, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92555424660308, + "entry_time": "2024-02-20T00:00:00", + "exit_price": 95.28378367357755, + "exit_time": "2024-02-21T00:00:00", + "gross_pnl": 35.82294269744608, + "pnl": 35.82294269744608, + "pnlcomm": 35.82294269744608, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6447277617356, + "entry_time": "2024-02-23T00:00:00", + "exit_price": 93.94359099606793, + "exit_time": "2024-02-24T00:00:00", + "gross_pnl": -70.11367656676697, + "pnl": -70.11367656676697, + "pnlcomm": -70.11367656676697, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6316942698782, + "entry_time": "2024-02-26T00:00:00", + "exit_price": 93.61709548381037, + "exit_time": "2024-02-27T00:00:00", + "gross_pnl": -101.45987860678218, + "pnl": -101.45987860678218, + "pnlcomm": -101.45987860678218, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99406223655019, + "entry_time": "2024-02-29T00:00:00", + "exit_price": 93.51586581649707, + "exit_time": "2024-03-01T00:00:00", + "gross_pnl": 52.180357994687654, + "pnl": 52.180357994687654, + "pnlcomm": 52.180357994687654, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88355978598187, + "entry_time": "2024-03-03T00:00:00", + "exit_price": 93.59210068726338, + "exit_time": "2024-03-04T00:00:00", + "gross_pnl": 70.85409012815092, + "pnl": 70.85409012815092, + "pnlcomm": 70.85409012815092, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.20766791171343, + "entry_time": "2024-03-06T00:00:00", + "exit_price": 93.03526629028748, + "exit_time": "2024-03-07T00:00:00", + "gross_pnl": -17.240162142594784, + "pnl": -17.240162142594784, + "pnlcomm": -17.240162142594784, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73917319444821, + "entry_time": "2024-03-09T00:00:00", + "exit_price": 93.21019311262798, + "exit_time": "2024-03-10T00:00:00", + "gross_pnl": -52.89800818202366, + "pnl": -52.89800818202366, + "pnlcomm": -52.89800818202366, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87224010683994, + "entry_time": "2024-03-12T00:00:00", + "exit_price": 93.42438731231145, + "exit_time": "2024-03-13T00:00:00", + "gross_pnl": -44.78527945284867, + "pnl": -44.78527945284867, + "pnlcomm": -44.78527945284867, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32218202085551, + "entry_time": "2024-03-15T00:00:00", + "exit_price": 92.84840341954816, + "exit_time": "2024-03-16T00:00:00", + "gross_pnl": -47.37786013073446, + "pnl": -47.37786013073446, + "pnlcomm": -47.37786013073446, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74542752078266, + "entry_time": "2024-03-18T00:00:00", + "exit_price": 93.97099698374726, + "exit_time": "2024-03-19T00:00:00", + "gross_pnl": 22.556946296460012, + "pnl": 22.556946296460012, + "pnlcomm": 22.556946296460012, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5673298293271, + "entry_time": "2024-03-21T00:00:00", + "exit_price": 90.9938401219299, + "exit_time": "2024-03-22T00:00:00", + "gross_pnl": -157.34897073971865, + "pnl": -157.34897073971865, + "pnlcomm": -157.34897073971865, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89305134977978, + "entry_time": "2024-03-24T00:00:00", + "exit_price": 92.62217998545916, + "exit_time": "2024-03-25T00:00:00", + "gross_pnl": -27.087136432062664, + "pnl": -27.087136432062664, + "pnlcomm": -27.087136432062664, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36509094658045, + "entry_time": "2024-03-27T00:00:00", + "exit_price": 92.88634389481254, + "exit_time": "2024-03-28T00:00:00", + "gross_pnl": 52.12529482320889, + "pnl": 52.12529482320889, + "pnlcomm": 52.12529482320889, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09706919037085, + "entry_time": "2024-03-30T00:00:00", + "exit_price": 92.26411816919232, + "exit_time": "2024-03-31T00:00:00", + "gross_pnl": -83.29510211785305, + "pnl": -83.29510211785305, + "pnlcomm": -83.29510211785305, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87466770876311, + "entry_time": "2024-04-02T00:00:00", + "exit_price": 92.60479889553623, + "exit_time": "2024-04-03T00:00:00", + "gross_pnl": -26.98688132268785, + "pnl": -26.98688132268785, + "pnlcomm": -26.98688132268785, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20308651861096, + "entry_time": "2024-04-05T00:00:00", + "exit_price": 92.03254850546956, + "exit_time": "2024-04-06T00:00:00", + "gross_pnl": -17.053801314139605, + "pnl": -17.053801314139605, + "pnlcomm": -17.053801314139605, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.38853458659054, + "entry_time": "2024-04-08T00:00:00", + "exit_price": 92.15112623454131, + "exit_time": "2024-04-09T00:00:00", + "gross_pnl": -23.740835204922917, + "pnl": -23.740835204922917, + "pnlcomm": -23.740835204922917, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96842409215192, + "entry_time": "2024-04-11T00:00:00", + "exit_price": 91.88812859002927, + "exit_time": "2024-04-12T00:00:00", + "gross_pnl": -8.029550212265235, + "pnl": -8.029550212265235, + "pnlcomm": -8.029550212265235, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24664780939709, + "entry_time": "2024-04-14T00:00:00", + "exit_price": 92.55850895917358, + "exit_time": "2024-04-15T00:00:00", + "gross_pnl": 31.186114977649027, + "pnl": 31.186114977649027, + "pnlcomm": 31.186114977649027, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87161322114831, + "entry_time": "2024-04-17T00:00:00", + "exit_price": 92.00535793552656, + "exit_time": "2024-04-18T00:00:00", + "gross_pnl": -86.62552856217474, + "pnl": -86.62552856217474, + "pnlcomm": -86.62552856217474, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.44802861400582, + "entry_time": "2024-04-20T00:00:00", + "exit_price": 93.06090359266081, + "exit_time": "2024-04-21T00:00:00", + "gross_pnl": 61.28749786549861, + "pnl": 61.28749786549861, + "pnlcomm": 61.28749786549861, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86729712174954, + "entry_time": "2024-04-23T00:00:00", + "exit_price": 91.52050959132679, + "exit_time": "2024-04-24T00:00:00", + "gross_pnl": -234.6787530422759, + "pnl": -234.6787530422759, + "pnlcomm": -234.6787530422759, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.61545833641875, + "entry_time": "2024-04-26T00:00:00", + "exit_price": 93.11576558511285, + "exit_time": "2024-04-27T00:00:00", + "gross_pnl": 50.03072486940994, + "pnl": 50.03072486940994, + "pnlcomm": 50.03072486940994, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.83965947403613, + "entry_time": "2024-04-29T00:00:00", + "exit_price": 92.12256163749144, + "exit_time": "2024-04-30T00:00:00", + "gross_pnl": -71.70978365446814, + "pnl": -71.70978365446814, + "pnlcomm": -71.70978365446814, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01797419460767, + "entry_time": "2024-05-02T00:00:00", + "exit_price": 93.19504665832812, + "exit_time": "2024-05-03T00:00:00", + "gross_pnl": 117.70724637204495, + "pnl": 117.70724637204495, + "pnlcomm": 117.70724637204495, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.52501223027797, + "entry_time": "2024-05-05T00:00:00", + "exit_price": 93.70543373709387, + "exit_time": "2024-05-06T00:00:00", + "gross_pnl": -81.95784931840961, + "pnl": -81.95784931840961, + "pnlcomm": -81.95784931840961, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.76145907090127, + "entry_time": "2024-05-08T00:00:00", + "exit_price": 93.99231970762736, + "exit_time": "2024-05-09T00:00:00", + "gross_pnl": 23.086063672609214, + "pnl": 23.086063672609214, + "pnlcomm": 23.086063672609214, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72601264375818, + "entry_time": "2024-05-11T00:00:00", + "exit_price": 94.17294252688178, + "exit_time": "2024-05-12T00:00:00", + "gross_pnl": 144.69298831236017, + "pnl": 144.69298831236017, + "pnlcomm": 144.69298831236017, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66991995260973, + "entry_time": "2024-05-14T00:00:00", + "exit_price": 93.29227941579406, + "exit_time": "2024-05-15T00:00:00", + "gross_pnl": -37.76405368156759, + "pnl": -37.76405368156759, + "pnlcomm": -37.76405368156759, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05260425345361, + "entry_time": "2024-05-17T00:00:00", + "exit_price": 93.08641894302396, + "exit_time": "2024-05-18T00:00:00", + "gross_pnl": 3.3814689570348833, + "pnl": 3.3814689570348833, + "pnlcomm": 3.3814689570348833, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89786622090341, + "entry_time": "2024-05-20T00:00:00", + "exit_price": 93.19281076082636, + "exit_time": "2024-05-21T00:00:00", + "gross_pnl": 29.494453992295178, + "pnl": 29.494453992295178, + "pnlcomm": 29.494453992295178, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00268172437694, + "entry_time": "2024-05-23T00:00:00", + "exit_price": 93.8031782169886, + "exit_time": "2024-05-24T00:00:00", + "gross_pnl": 80.04964926116571, + "pnl": 80.04964926116571, + "pnlcomm": 80.04964926116571, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30303744020942, + "entry_time": "2024-05-26T00:00:00", + "exit_price": 93.96047444085842, + "exit_time": "2024-05-27T00:00:00", + "gross_pnl": -34.25629993510029, + "pnl": -34.25629993510029, + "pnlcomm": -34.25629993510029, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53102238294964, + "entry_time": "2024-05-29T00:00:00", + "exit_price": 93.55135190498416, + "exit_time": "2024-05-30T00:00:00", + "gross_pnl": 2.0329522034515435, + "pnl": 2.0329522034515435, + "pnlcomm": 2.0329522034515435, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73320965755093, + "entry_time": "2024-06-01T00:00:00", + "exit_price": 93.83108861382613, + "exit_time": "2024-06-02T00:00:00", + "gross_pnl": 9.78789562751956, + "pnl": 9.78789562751956, + "pnlcomm": 9.78789562751956, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66116571648418, + "entry_time": "2024-06-04T00:00:00", + "exit_price": 93.37760682748707, + "exit_time": "2024-06-05T00:00:00", + "gross_pnl": 71.64411110028936, + "pnl": 71.64411110028936, + "pnlcomm": 71.64411110028936, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73832896665387, + "entry_time": "2024-06-07T00:00:00", + "exit_price": 93.55125645985115, + "exit_time": "2024-06-08T00:00:00", + "gross_pnl": -18.707250680272125, + "pnl": -18.707250680272125, + "pnlcomm": -18.707250680272125, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05801072220544, + "entry_time": "2024-06-10T00:00:00", + "exit_price": 93.19615016955767, + "exit_time": "2024-06-11T00:00:00", + "gross_pnl": -86.18605526477694, + "pnl": -86.18605526477694, + "pnlcomm": -86.18605526477694, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71612053106102, + "entry_time": "2024-06-13T00:00:00", + "exit_price": 92.35363412291727, + "exit_time": "2024-06-14T00:00:00", + "gross_pnl": -36.24864081437522, + "pnl": -36.24864081437522, + "pnlcomm": -36.24864081437522, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89683728827593, + "entry_time": "2024-06-16T00:00:00", + "exit_price": 93.45394449656699, + "exit_time": "2024-06-17T00:00:00", + "gross_pnl": 55.71072082910575, + "pnl": 55.71072082910575, + "pnlcomm": 55.71072082910575, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64711251538864, + "entry_time": "2024-06-19T00:00:00", + "exit_price": 94.20425342905766, + "exit_time": "2024-06-20T00:00:00", + "gross_pnl": 55.71409136690164, + "pnl": 55.71409136690164, + "pnlcomm": 55.71409136690164, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27286775878677, + "entry_time": "2024-06-22T00:00:00", + "exit_price": 93.11098684044114, + "exit_time": "2024-06-23T00:00:00", + "gross_pnl": -16.188091834563068, + "pnl": -16.188091834563068, + "pnlcomm": -16.188091834563068, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82344576152076, + "entry_time": "2024-06-25T00:00:00", + "exit_price": 93.85991046136218, + "exit_time": "2024-06-26T00:00:00", + "gross_pnl": 3.6464699841417314, + "pnl": 3.6464699841417314, + "pnlcomm": 3.6464699841417314, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76944869834962, + "entry_time": "2024-06-28T00:00:00", + "exit_price": 94.49443525385506, + "exit_time": "2024-06-29T00:00:00", + "gross_pnl": 172.49865555054384, + "pnl": 172.49865555054384, + "pnlcomm": 172.49865555054384, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26714007172913, + "entry_time": "2024-07-01T00:00:00", + "exit_price": 93.55312747617486, + "exit_time": "2024-07-02T00:00:00", + "gross_pnl": -71.40125955542658, + "pnl": -71.40125955542658, + "pnlcomm": -71.40125955542658, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21338289364272, + "entry_time": "2024-07-04T00:00:00", + "exit_price": 93.50082066300278, + "exit_time": "2024-07-05T00:00:00", + "gross_pnl": -71.25622306399322, + "pnl": -71.25622306399322, + "pnlcomm": -71.25622306399322, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2831851440446, + "entry_time": "2024-07-07T00:00:00", + "exit_price": 92.64838687037759, + "exit_time": "2024-07-08T00:00:00", + "gross_pnl": -63.47982736670019, + "pnl": -63.47982736670019, + "pnlcomm": -63.47982736670019, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7216517557643, + "entry_time": "2024-07-10T00:00:00", + "exit_price": 92.97199380174195, + "exit_time": "2024-07-11T00:00:00", + "gross_pnl": -74.96579540223536, + "pnl": -74.96579540223536, + "pnlcomm": -74.96579540223536, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55110234448432, + "entry_time": "2024-07-13T00:00:00", + "exit_price": 92.47254018419862, + "exit_time": "2024-07-14T00:00:00", + "gross_pnl": -107.85621602856992, + "pnl": -107.85621602856992, + "pnlcomm": -107.85621602856992, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.35333984916059, + "entry_time": "2024-07-16T00:00:00", + "exit_price": 92.55290357280875, + "exit_time": "2024-07-17T00:00:00", + "gross_pnl": 19.956372364815422, + "pnl": 19.956372364815422, + "pnlcomm": 19.956372364815422, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.92761668682888, + "entry_time": "2024-07-19T00:00:00", + "exit_price": 92.52405415324874, + "exit_time": "2024-07-20T00:00:00", + "gross_pnl": 59.64374664198573, + "pnl": 59.64374664198573, + "pnlcomm": 59.64374664198573, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01759216619796, + "entry_time": "2024-07-22T00:00:00", + "exit_price": 91.9301791723341, + "exit_time": "2024-07-23T00:00:00", + "gross_pnl": -8.741299386385037, + "pnl": -8.741299386385037, + "pnlcomm": -8.741299386385037, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98789247555584, + "entry_time": "2024-07-25T00:00:00", + "exit_price": 92.13492749804534, + "exit_time": "2024-07-26T00:00:00", + "gross_pnl": 14.703502248950429, + "pnl": 14.703502248950429, + "pnlcomm": 14.703502248950429, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.88900920001714, + "entry_time": "2024-07-28T00:00:00", + "exit_price": 91.63316803265334, + "exit_time": "2024-07-29T00:00:00", + "gross_pnl": -25.58411673637977, + "pnl": -25.58411673637977, + "pnlcomm": -25.58411673637977, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.85577813730865, + "entry_time": "2024-07-31T00:00:00", + "exit_price": 92.25060393364089, + "exit_time": "2024-08-01T00:00:00", + "gross_pnl": 39.48257963322419, + "pnl": 39.48257963322419, + "pnlcomm": 39.48257963322419, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37992029678232, + "entry_time": "2024-08-03T00:00:00", + "exit_price": 91.2161626045396, + "exit_time": "2024-08-04T00:00:00", + "gross_pnl": -16.375769224271153, + "pnl": -16.375769224271153, + "pnlcomm": -16.375769224271153, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94097148564506, + "entry_time": "2024-08-06T00:00:00", + "exit_price": 91.61411385344917, + "exit_time": "2024-08-07T00:00:00", + "gross_pnl": -32.6857632195896, + "pnl": -32.6857632195896, + "pnlcomm": -32.6857632195896, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.26633312852945, + "entry_time": "2024-08-09T00:00:00", + "exit_price": 92.57486927906898, + "exit_time": "2024-08-10T00:00:00", + "gross_pnl": 30.85361505395241, + "pnl": 30.85361505395241, + "pnlcomm": 30.85361505395241, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25460128509323, + "entry_time": "2024-08-12T00:00:00", + "exit_price": 92.93806274853755, + "exit_time": "2024-08-13T00:00:00", + "gross_pnl": -31.653853655568298, + "pnl": -31.653853655568298, + "pnlcomm": -31.653853655568298, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88821464003595, + "entry_time": "2024-08-15T00:00:00", + "exit_price": 92.53437593350753, + "exit_time": "2024-08-16T00:00:00", + "gross_pnl": -35.38387065284212, + "pnl": -35.38387065284212, + "pnlcomm": -35.38387065284212, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.55582558991509, + "entry_time": "2024-08-18T00:00:00", + "exit_price": 92.57746904834741, + "exit_time": "2024-08-19T00:00:00", + "gross_pnl": 2.1643458432322404, + "pnl": 2.1643458432322404, + "pnlcomm": 2.1643458432322404, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35186779566517, + "entry_time": "2024-08-21T00:00:00", + "exit_price": 93.8222066824917, + "exit_time": "2024-08-22T00:00:00", + "gross_pnl": 47.0338886826525, + "pnl": 47.0338886826525, + "pnlcomm": 47.0338886826525, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33239215677628, + "entry_time": "2024-08-24T00:00:00", + "exit_price": 92.65684927729922, + "exit_time": "2024-08-25T00:00:00", + "gross_pnl": -67.55428794770637, + "pnl": -67.55428794770637, + "pnlcomm": -67.55428794770637, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07995330778445, + "entry_time": "2024-08-27T00:00:00", + "exit_price": 93.14274907856505, + "exit_time": "2024-08-28T00:00:00", + "gross_pnl": 6.279577078059617, + "pnl": 6.279577078059617, + "pnlcomm": 6.279577078059617, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.31638915313648, + "entry_time": "2024-08-30T00:00:00", + "exit_price": 92.80125655346451, + "exit_time": "2024-08-31T00:00:00", + "gross_pnl": -151.5132599671972, + "pnl": -151.5132599671972, + "pnlcomm": -151.5132599671972, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86908900365832, + "entry_time": "2024-09-02T00:00:00", + "exit_price": 92.43258549076677, + "exit_time": "2024-09-03T00:00:00", + "gross_pnl": -43.6503512891548, + "pnl": -43.6503512891548, + "pnlcomm": -43.6503512891548, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.7418385386059, + "entry_time": "2024-09-05T00:00:00", + "exit_price": 93.04661736537737, + "exit_time": "2024-09-06T00:00:00", + "gross_pnl": 30.477882677146795, + "pnl": 30.477882677146795, + "pnlcomm": 30.477882677146795, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.18409149189988, + "entry_time": "2024-09-08T00:00:00", + "exit_price": 92.27288236124933, + "exit_time": "2024-09-09T00:00:00", + "gross_pnl": 108.87908693494524, + "pnl": 108.87908693494524, + "pnlcomm": 108.87908693494524, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66757472286285, + "entry_time": "2024-09-11T00:00:00", + "exit_price": 91.66108329653197, + "exit_time": "2024-09-12T00:00:00", + "gross_pnl": -100.64914263308822, + "pnl": -100.64914263308822, + "pnlcomm": -100.64914263308822, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0113429588981, + "entry_time": "2024-09-14T00:00:00", + "exit_price": 92.01542580767834, + "exit_time": "2024-09-15T00:00:00", + "gross_pnl": 100.40828487802429, + "pnl": 100.40828487802429, + "pnlcomm": 100.40828487802429, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87145951112797, + "entry_time": "2024-09-17T00:00:00", + "exit_price": 91.58043482842866, + "exit_time": "2024-09-18T00:00:00", + "gross_pnl": 70.89753173006983, + "pnl": 70.89753173006983, + "pnlcomm": 70.89753173006983, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28456359684716, + "entry_time": "2024-09-20T00:00:00", + "exit_price": 91.42689177563531, + "exit_time": "2024-09-21T00:00:00", + "gross_pnl": 114.23281787881479, + "pnl": 114.23281787881479, + "pnlcomm": 114.23281787881479, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.10394740945229, + "entry_time": "2024-09-23T00:00:00", + "exit_price": 91.5888902773369, + "exit_time": "2024-09-24T00:00:00", + "gross_pnl": 148.49428678846124, + "pnl": 148.49428678846124, + "pnlcomm": 148.49428678846124, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05233318851361, + "entry_time": "2024-09-26T00:00:00", + "exit_price": 91.20379964517136, + "exit_time": "2024-09-27T00:00:00", + "gross_pnl": 15.146645665774372, + "pnl": 15.146645665774372, + "pnlcomm": 15.146645665774372, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93054848304011, + "entry_time": "2024-09-29T00:00:00", + "exit_price": 91.4470753529935, + "exit_time": "2024-09-30T00:00:00", + "gross_pnl": 51.652686995338115, + "pnl": 51.652686995338115, + "pnlcomm": 51.652686995338115, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55093725008568, + "entry_time": "2024-10-02T00:00:00", + "exit_price": 90.1771270171211, + "exit_time": "2024-10-03T00:00:00", + "gross_pnl": -137.3810232964587, + "pnl": -137.3810232964587, + "pnlcomm": -137.3810232964587, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51951955539236, + "entry_time": "2024-10-05T00:00:00", + "exit_price": 90.35054775405881, + "exit_time": "2024-10-06T00:00:00", + "gross_pnl": -16.897180133355505, + "pnl": -16.897180133355505, + "pnlcomm": -16.897180133355505, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20200706252784, + "entry_time": "2024-10-08T00:00:00", + "exit_price": 91.07198645570766, + "exit_time": "2024-10-09T00:00:00", + "gross_pnl": -13.002060682018168, + "pnl": -13.002060682018168, + "pnlcomm": -13.002060682018168, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.13850851279538, + "entry_time": "2024-10-11T00:00:00", + "exit_price": 90.2608758916971, + "exit_time": "2024-10-12T00:00:00", + "gross_pnl": -87.76326210982859, + "pnl": -87.76326210982859, + "pnlcomm": -87.76326210982859, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93035699558081, + "entry_time": "2024-10-14T00:00:00", + "exit_price": 90.52157669994283, + "exit_time": "2024-10-15T00:00:00", + "gross_pnl": -40.87802956379818, + "pnl": -40.87802956379818, + "pnlcomm": -40.87802956379818, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49395863364698, + "entry_time": "2024-10-17T00:00:00", + "exit_price": 89.86316250689507, + "exit_time": "2024-10-18T00:00:00", + "gross_pnl": -63.079612675191754, + "pnl": -63.079612675191754, + "pnlcomm": -63.079612675191754, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.18352844268802, + "entry_time": "2024-10-20T00:00:00", + "exit_price": 88.93546496698286, + "exit_time": "2024-10-21T00:00:00", + "gross_pnl": -124.80634757051519, + "pnl": -124.80634757051519, + "pnlcomm": -124.80634757051519, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.8113095296125, + "entry_time": "2024-10-23T00:00:00", + "exit_price": 89.54696410392557, + "exit_time": "2024-10-24T00:00:00", + "gross_pnl": -26.43454256869262, + "pnl": -26.43454256869262, + "pnlcomm": -26.43454256869262, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.0801204143829, + "entry_time": "2024-10-26T00:00:00", + "exit_price": 89.23016998477505, + "exit_time": "2024-10-27T00:00:00", + "gross_pnl": 15.004957039214162, + "pnl": 15.004957039214162, + "pnlcomm": 15.004957039214162, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.84774198158706, + "entry_time": "2024-10-29T00:00:00", + "exit_price": 89.88558944915762, + "exit_time": "2024-10-30T00:00:00", + "gross_pnl": 3.784746757055757, + "pnl": 3.784746757055757, + "pnlcomm": 3.784746757055757, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52000332438061, + "entry_time": "2024-11-01T00:00:00", + "exit_price": 88.86871340352687, + "exit_time": "2024-11-02T00:00:00", + "gross_pnl": 34.87100791462581, + "pnl": 34.87100791462581, + "pnlcomm": 34.87100791462581, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.58373696827199, + "entry_time": "2024-11-04T00:00:00", + "exit_price": 88.82208371804109, + "exit_time": "2024-11-05T00:00:00", + "gross_pnl": -76.1653250230907, + "pnl": -76.1653250230907, + "pnlcomm": -76.1653250230907, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32832910147937, + "entry_time": "2024-11-07T00:00:00", + "exit_price": 89.06529443738525, + "exit_time": "2024-11-08T00:00:00", + "gross_pnl": -26.303466409412124, + "pnl": -26.303466409412124, + "pnlcomm": -26.303466409412124, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45977666376373, + "entry_time": "2024-11-10T00:00:00", + "exit_price": 89.24686599676619, + "exit_time": "2024-11-11T00:00:00", + "gross_pnl": -121.29106669975442, + "pnl": -121.29106669975442, + "pnlcomm": -121.29106669975442, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21043430906948, + "entry_time": "2024-11-13T00:00:00", + "exit_price": 88.4518561142622, + "exit_time": "2024-11-14T00:00:00", + "gross_pnl": -75.8578194807285, + "pnl": -75.8578194807285, + "pnlcomm": -75.8578194807285, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.80819601768098, + "entry_time": "2024-11-16T00:00:00", + "exit_price": 88.9586155221746, + "exit_time": "2024-11-17T00:00:00", + "gross_pnl": 15.041950449361252, + "pnl": 15.041950449361252, + "pnlcomm": 15.041950449361252, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.14254378792333, + "entry_time": "2024-11-19T00:00:00", + "exit_price": 88.6718045936633, + "exit_time": "2024-11-20T00:00:00", + "gross_pnl": -47.073919426003386, + "pnl": -47.073919426003386, + "pnlcomm": -47.073919426003386, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.3689677842857, + "entry_time": "2024-11-22T00:00:00", + "exit_price": 88.87620295869029, + "exit_time": "2024-11-23T00:00:00", + "gross_pnl": -49.276482559541535, + "pnl": -49.276482559541535, + "pnlcomm": -49.276482559541535, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.06997514477665, + "entry_time": "2024-11-25T00:00:00", + "exit_price": 88.79230048470953, + "exit_time": "2024-11-26T00:00:00", + "gross_pnl": -27.767466006712027, + "pnl": -27.767466006712027, + "pnlcomm": -27.767466006712027, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.69842658289039, + "entry_time": "2024-11-28T00:00:00", + "exit_price": 88.84366945841847, + "exit_time": "2024-11-29T00:00:00", + "gross_pnl": -85.47571244719165, + "pnl": -85.47571244719165, + "pnlcomm": -85.47571244719165, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75521347785289, + "entry_time": "2024-12-01T00:00:00", + "exit_price": 89.14459057740478, + "exit_time": "2024-12-02T00:00:00", + "gross_pnl": -61.06229004481065, + "pnl": -61.06229004481065, + "pnlcomm": -61.06229004481065, + "size": 100 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.78540826994568, + "entry_time": "2024-12-04T00:00:00", + "exit_price": 89.0389294134589, + "exit_time": "2024-12-05T00:00:00", + "gross_pnl": 25.35211435132254, + "pnl": 25.35211435132254, + "pnlcomm": 25.35211435132254, + "size": 100 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.11917253451473, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.54841534502786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.03201587878578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.94550278474797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.67183298908238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.86549713479145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.19160897741419, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.48697641782272, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.74505140134526, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.43249701182592, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.36317339817481, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.3184784020995, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.59194698786014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.21300773889088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.93323693635863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.01041702546699, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.12882215455511, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.82503838919212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.20974209562837, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.28418162139361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.91262465479313, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.47079432451613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.41396612142576, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.74208634353057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96112016066533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.14757933275934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.33794797010773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.95774776632322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.39809150990904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.29624163714647, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.98044425919083, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.71415014911958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.68703409584347, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.19660477578049, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.09913803201934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.13975001075532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.7525000464393, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67014960303162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.16172259245428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.99277550738104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.726000665382, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.27597137389321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.96674656359579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.01407453019127, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.01883446140224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.33686580554885, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.61379453469056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.44418682978016, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.1261570487614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.90367229199478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.48715448535594, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.53898885220806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.13695584567007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.74920846022493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.28346179234327, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.39446913633991, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.38048314487808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.86853857797571, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.78335766752544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.08258048792489, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.04409706752067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.00584315640894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17754603801194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.91386750387461, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.07278397148802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.84957817071898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.66685696016805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.29703959359377, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.16284479663989, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.59827392536462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.02427769637677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.02034152325665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.10227360972624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.55074957264794, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.4752285310497, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.78482968977629, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.64550269913406, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.75829920829567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.28405624956508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.40750734980367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.9736108084372, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.11719582995507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.4244273841596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.46803368609852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.65390080108091, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.55529329412784, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.84475344760442, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 101.34547532849058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.83286932713185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.1414110724743, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.70880723169135, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.37107171120154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17212988349165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.88968353827181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.17974473578754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.64495810760246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86042757757674, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.42922022261914, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.67123710700702, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.1262468099545, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.99803204217791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.0746490327229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.68852164950059, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.90683245619206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.69867095887889, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.58028409299915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.78930171959787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.44349309161046, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.63928948741085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.8801021064717, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.88804895153031, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.9129584357738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.35911188288489, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.55107978610341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.24566283787111, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.50854335078685, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.85972377687798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.94180161552265, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.42256786175979, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.39260868907034, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.47598985042309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.2217481384577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.43771261461686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25556396259081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.27520136851216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.22895283520214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.84721164221584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.21690016032666, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.98012439288168, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.42241300564716, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5234973647714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.84780174120549, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.78357735159078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5180376571157, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.07885735340791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.46287786089891, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.7806750796624, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.99007562374577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.3160405598432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.69515591162462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.9307950005457, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.49497584845733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.05277773908539, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.63017059410102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.95560584181007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.85704345214471, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.34581983849665, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.55148937480453, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.83406196186097, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.25669377064881, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.51637945271536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.57103396676897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43830185841739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.4155507445711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.92267680402585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.75883349843212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.974264479532, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.70988332181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.21365266173218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.08294324004585, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11928874045202, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31180164071337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.00054275724281, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.65255133629894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.96503242935937, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.79138811772025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.47378044689604, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.31284487928606, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.73200506980342, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.3363427106496, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.56611574901736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.13272204200155, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.89963627791985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.38755792776327, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.35474381234252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.97868642263799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.11962753041762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.25728100943367, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.076645155786, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.1361736846976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.95761891143941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.38251520181134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.58405172820402, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.1825648349693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31778631274507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.92748490697555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.11485299409067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.46828746700024, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.7892083341232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.2850707768965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.61528686513479, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.16045065160826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98923853245553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.78083136801966, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98736762370623, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.41242668783207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.7821059253462, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.01676230346942, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.90986422948514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.85698353324744, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.72982041802001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.60761748093444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.0385605171193, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.09198940082088, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.21597248424331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.490691270523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.2706953210234, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.23704650718707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.30522444084696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.82731858826378, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.91407429365688, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.5460351903365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.93028933684711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.0553633238757, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.47484452500944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.10094020807114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.01428360585088, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.38292648890776, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.48513559668872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.27497370614257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.14886606297294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.29611163730506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.23350982317787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.79948982072462, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.98472225444857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.71079305814114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.3396263042363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.98172498582129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.42795373397291, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.6321305493393, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.76479352938595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.48958247666039, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.73111789636548, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.61885876679554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.85401562603096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.49175141105385, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.84289871423181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.99377199128872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.76186428614056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.48850513355184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.12395315196963, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.53863571252707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.6026762767146, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.09752132137899, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.49274636123849, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.82226372897985, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.79148532437996, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.11483711173116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.80033950220172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.63729064888537, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.11575917668634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.28032546622858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.53344904132359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.29557459823668, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.01730754421833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.07935604760307, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.79620422510413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.24797305894252, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.19373825703377, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.40514794332339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.55648566288775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.55716667120137, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.91494018138198, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.48501201892987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.90008526748946, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.83721845974864, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.26504549069784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.06840340797214, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.26053581327312, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.42454996605802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94825682250637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.05109746301979, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.1969266603545, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.27193710609464, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.97039812035842, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.34802647272141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.07904244701469, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.79316819026657, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.5721771606179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.6253449835299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88599336671724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9167314813735, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.23555143341264, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.69172330670986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.40326355089037, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.32320287324674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.32022315669315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.22613575397045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.08195298394907, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.5883765126535, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6323490375275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.0747399163529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.55723413541229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.78282068603487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.66145085922012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.46346097050873, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.00404625454874, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.66092881844988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.49919123199935, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.97621398907071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.41257974165285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.05124864668421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01899188310071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.2559389154428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.12609495739093, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25576346468043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.47050530514431, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72410136704386, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19884636287922, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86432033375576, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.34050558738045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.10587138419956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72930751574246, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2563942182136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.59980860135867, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.54277270362402, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.92591784638046, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.14258894906092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11423308566697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03147452036931, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.97245173381131, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.49318704896336, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.68468709145579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.32003795658395, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26674166444458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26630934814936, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.4153331981033, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36350758058099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.16332285120929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.34043899579565, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74219820454567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.55413171456674, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.58180279933771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02408626223293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87657341045227, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.55590567361484, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.08074161986468, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.80457382221171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8131686939551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.25793142134573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95253144170447, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14743781912107, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8783564574023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.9764387193147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.94516537050167, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89603764932446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.63800292429943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.24337208101042, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.59556244009269, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28446378378608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13025499622808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.23383791902404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3328854638381, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96067846320523, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.94965457520627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.16625059748041, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.8269642033066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.81310669049036, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2555442210953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.45622372930102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.83947343135847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43135259957857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.53295655650527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78816229160894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9413213129086, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.40648296911729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.30279435197399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.65263067129818, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.8239628759463, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.7795218814571, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36068460994301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.47451059527033, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.09791235411565, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64232209133355, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.9960341944844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.86057544771678, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.03722443992689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.02540027670304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23831571579666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61642884685872, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9587336040414, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78520963834742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.12207131713245, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.030634236321, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2580641252632, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57471719502651, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.16033087447512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64298714231596, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75555986268627, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29534460790408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8204301569652, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.34161824742394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.61753779742976, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15624068230731, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.25917455813928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5936848786624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.98045633035186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98797939638727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35827005631805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.69155799194061, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68091309416992, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.70456318827733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16469231313611, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8799099382491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11566093967609, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.80161139315015, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.15377445359951, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.15715297991916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86962603101973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.72926386277882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1579385275225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.74116822603294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.31971390482752, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20782644697857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01885490875779, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42230012835577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.99288411883724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.082184046767, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.85101362331126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98564664788431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86959357102904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20013868958425, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84924924581607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31289310035527, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30858201402589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.99373607498532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.18572768435918, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.33439114940059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07429869254726, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.04790943044297, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64069907229371, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26235855896988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.50379403067527, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43691170957882, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.37005197510278, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.27057437223934, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.09337235241868, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.71128565229746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.02883456195461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80490335979458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.9287597961482, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.17470692964342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2493152678643, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.60050033989026, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09469925407369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3111349289259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18816369089684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.42938460793316, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.41602741852829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.42310978968692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.50953693273829, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33123427861662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96020937715257, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.53068640749544, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5609164087555, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89910933295498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.4272707886787, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.19572149206287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68137345397398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.48011498833463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73481537380023, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.9817766831428, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.62422399002075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.25402747101043, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.78794113614683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51565520344022, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81994141877884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.73569183010366, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89304084668578, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.94563028017612, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.70380536433252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.18321579529317, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75634960957339, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.99346542277752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07784715364147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82473368702337, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.80939097372557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.56855092683492, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.22637736311736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.04989016451177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06688407845617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11481000895263, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27282277875311, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.10549027383173, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.02590143870165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.0111357952797, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.36789726372409, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.16759918928896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.02364437811006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.64247835816664, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.20232839714718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51418676739564, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.81320041849361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27166607324205, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.2545983932022, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.97497228207648, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.67780842750179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.45906966920411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.76345480442126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.43197465037622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3600604543369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.44350843545416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.39757672508603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.85230151275863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.81407145534195, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01128875382821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.67591197573066, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.51279666702179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.98461279621962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.18776220832692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.68365711276127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52965334263803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.97018528191016, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.1704075246973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.4092834971355, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.80397108470675, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.7224658447326, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.15638220769824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.66063113797075, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.93674170823937, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.02426166276656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2868521233569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.06798590582005, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.35136606041436, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.99746534424483, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.56303029535638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.0942536160811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.42070005109457, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.41089068186189, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.18677881527823, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43901544778934, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.5260369404649, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.01177208564718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.36159823018748, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8208251198108, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.28071492977152, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.9250036260453, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6150063093046, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.61363931969464, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.38004154259693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.96467806287603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70041523761671, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.62074541364396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.95651159207543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05267669381955, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.69416855510607, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.8695133244266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.61012799594212, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.05464751490084, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.46681240023963, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.63067407291008, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.96046847840074, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.56273021751427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.14638715063298, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.75859326793318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97823499949781, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.15637756363428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.71453147899727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.00941330347686, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.97249110306038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.44900384555615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.26380626108603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.9389490074607, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.91676356991597, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.13685393625028, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92025914672816, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.9636459548143, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.9470309766908, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.23464868145118, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.16095300836626, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.86371979002092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1658806519524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.80999909964301, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.3916052906719, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.79830122498419, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.92464426243117, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.74084404129732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77591195761288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.129082151163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.29443539538282, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.49821093674116, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.52895961614624, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.50773769923417, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.20586243304412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.1593251595947, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.8652392547076, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.88148378297518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.54298539634833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.97268456538903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.62712854780935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.74146887774299, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.42853595632805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.84848168731004, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.83668379255865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.47241973433749, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.89842730786603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.82455441317694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.16986826544031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.1811588929617, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.09911654611165, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.55257557802233, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.6008717295654, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.68671023186488, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.96517472835333, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.05260562521785, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.08006582461334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.79432064186736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.41108821991375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87347025830266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.20564533828777, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.30309517181773, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1406611037728, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.24392591685461, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.10896639776044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43429707485602, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.99823744300166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.51160983247296, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.15695774047701, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.25313076740179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.3503914171167, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47393608345517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.98751697992218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.0545116492653, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01799823084976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05081241841744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.31407916672543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.80885265421585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.15205975168703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.47241880815605, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.54172600484964, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.8976774720573, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58791087448299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.02271267015783, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.10459083951521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24414870008319, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69109127617371, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.65306278042236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.39816620647916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1810606061523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.49470462633181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01504374556126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.67904663244455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74908045175502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.28081352108578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.72430502818085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91000509633356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0266388958905, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06932306108122, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2669116718157, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.31911690207038, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.01378736632232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.69057272581715, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86605080021333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.54829275642138, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.92761316198515, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.07281692163534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.2809228591007, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.11130793179962, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.78210365621943, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.99114272050637, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26603620619441, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.26895473010688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.88756691851471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.90535085923925, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.86627784439669, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.27678234231546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21120724189035, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.62182381785365, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.70089986040492, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.98061841891752, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.63730668221625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.21809213108293, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.62513446883317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.0550792423482, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71116560219859, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.70112878957045, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.22008595203475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.26583380518775, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84031644841893, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.76253265375746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.36921450181964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38751561741323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.7594276079707, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20505090808615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01993010545006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25253006691226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.9292129294191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.45831791808807, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.01874761761506, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.70179579177142, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.45782648578765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.9654506293958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.69543160906309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.23626703373414, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.23730582460071, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.58630669240723, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.24411442253736, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.80412345904836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.33266826608637, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08584208568091, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.20511704388718, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.73586252939168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6229802242446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66558700926207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74677062129318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.54017463980657, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.730138438308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.49572076787184, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77203615539878, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.91635203682458, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.91294155802173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.85493736088272, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.07037492573126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35918129576551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.21752684184962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.82182795562746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.91554181329224, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.2637454877203, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.42377971468683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.9956096009709, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.95024629295155, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.02384747382928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.73848563922941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78634727970504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.46503843997183, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.75198886376967, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.39876122857235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.11567284541557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.77091533493147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3485194106044, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.04122370969267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97807111210727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.82297627909733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88908258807695, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.02494822567454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52813633390632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.77607586946252, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84906975105618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.10682536410768, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60098332710814, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.16477240647922, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.64464350405021, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.34853961981467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.90164291858915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52920571661875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96718442791747, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1449985691514, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.09214526901171, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08808617199072, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.57735843418071, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.03374091329063, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.67153521214688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.90721494360177, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.94800270723887, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.77341143396697, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.16810608211969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.1295561924666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6109897663897, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09160273927316, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.33166346007059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.53620789150742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.21568894504843, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93343913761625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02299067534886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.18544500815403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.98907937476646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.45348785433026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02085687929099, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.84830391916218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43699045607909, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.95759166912262, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.47551491598016, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.66498305754212, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.36643618283398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3496449568648, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06229907806569, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.93784310790696, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.96780942003683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88445131540618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.08186481058257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.20796655389181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9654081254928, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.49393791749024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05007592523164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.84518996211608, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.32190345568543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32827178627502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26562867244172, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9489490131078, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.54756230484855, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.52695826109523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.16120912048845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.73109278013733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.12967158946792, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66144197243285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35105870140517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32497954050243, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.404028525945, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5596224194739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06373732644884, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.82924854494932, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.63616550173667, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.79933273190036, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.95120755426662, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.56403816854014, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35426808914588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35865607168631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.90482034285156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.9985787957225, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.8768940380532, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86502942650776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82867955654159, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.06669061925808, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.05805100493505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.19478081630376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.4726753044577, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.87741920594638, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.47630925649874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.67940992744533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83387030747774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.77541066961662, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21806909335821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2116719393634, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.63189068076446, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.31676028980675, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96917376263126, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.3332407570871, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.63597205774145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.00130198273087, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.05926832590498, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.76190103073331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.24963627943364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.73904226779082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.53198582108524, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.29391446442062, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.60323551607766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.17535379161295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.95745054254392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.65432843266518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.33856790601594, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.36956060356385, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.2507487739047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.98092766917739, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.16338627425559, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.95283790294347, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.37363985497257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.41734797456819, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46879833485087, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.89779171625212, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.56566914846213, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.12295330761387, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.47229523041987, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.01642931045993, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.97899403484826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.29040521639678, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.62958711128005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.94114223449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.38592136937638, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.493222435549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3474523152517, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.84805377401344, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.24313248176318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.23716867785055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.3344550507391, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.25058017257405, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.26148603669161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.78124566715694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.30392352510412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05471403229689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.26889976544973, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.97149252732743, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.49652862514738, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49761686858754, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96133483843103, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.60373115569557, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43278823558683, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.216186422251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.22790913521419, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.5392105794396, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.3857390941578, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.0337408175209, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.39823678210567, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.08940418013472, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65920217896303, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.39853539402684, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.65048655775455, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.79873760769597, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.68828575617101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87251964203307, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.5300255114375, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.79086592344467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57270931229704, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88859692291733, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.80271734344691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.04073002158317, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.46828834544144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.23692924750448, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.43771978777833, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.09517649815284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.97835234626153, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.79133291522645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02945945000636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.45235296621496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.63061442838703, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.1729530420449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.58327824763774, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53629152727201, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.30651397849368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.69842586893596, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.16248763742118, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.49605102540508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25313944944546, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.8421663218519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97561455613513, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.01878568439928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.7731623418128, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.3031103300392, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.82895908639827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.34460637435383, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.32181327562058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.52607935640549, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.2357948297768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.68746434551585, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58592175261929, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.4669708006904, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.654447961068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.3612670935331, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.01031054901587, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.37919304454006, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.41169786096938, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.29381617044329, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.70386499802939, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.42981226133158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.13311787546733, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.41698336938475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.39366908316057, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.89356698837386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.60226357609555, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.41574363121151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.77307124686526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.32527272706531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.02617500869306, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.94533987249052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.0185892574846, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.30963127571127, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.25489319248068, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74391567498765, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.20889480054281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.11263111652507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.10139698703692, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.71015543952899, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.47583632063913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.75986386635343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.27037620813209, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.44774661355898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.99875783176927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.58344310898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.14439051922356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.54039819515216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.9236778577475, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.05584126819757, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.35601781114134, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.81351651597147, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84701543791368, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.72332949821384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51107159043487, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.91369044105626, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.12129104458734, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.14884637460803, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.89417488264915, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.12845985022912, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.6597993052993, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.96178874818798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.4511703887473, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.89229345893365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.58860576042824, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.04178116383622, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.4578576609693, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.86053478009173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.76430023458303, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.8053175522895, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40836408730765, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.85612524977265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.40863693697362, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.09196518919534, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.91994528712154, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.4574772984541, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.40486331313025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.8856295626394, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.41673292493975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.3011515367656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.50993042362319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.8443544450889, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.58646684173618, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.51863942815191, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.02582579018504, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.64624335712315, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.62478266594604, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.97351592845855, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.2565162152012, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.32379857764126, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96151236382953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.38409820559012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.76791246698865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.15204268625024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.14536275879573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.92555424660308, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.28378367357755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.6447277617356, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.94359099606793, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.63169426987818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.61709548381037, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.99406223655019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.51586581649707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88355978598187, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.59210068726338, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.20766791171343, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.03526629028748, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73917319444821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.21019311262798, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87224010683995, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.42438731231145, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.32218202085551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84840341954816, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.74542752078266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.97099698374726, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5673298293271, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.9938401219299, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.89305134977978, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.62217998545916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.36509094658045, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.88634389481254, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.09706919037085, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.26411816919232, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87466770876313, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.60479889553623, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.20308651861096, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.03254850546956, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.38853458659054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.15112623454131, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.96842409215192, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.88812859002927, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.24664780939709, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.55850895917358, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.87161322114831, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.00535793552656, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.4480286140058, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.06090359266081, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.86729712174954, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.52050959132679, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.61545833641877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11576558511285, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.83965947403613, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.12256163749144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01797419460767, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19504665832812, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.52501223027797, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.70543373709387, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.76145907090128, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.99231970762736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.72601264375818, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.17294252688178, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.66991995260973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.29227941579406, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.05260425345361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.08641894302396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.89786622090341, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19281076082636, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.00268172437694, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8031782169886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.30303744020942, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.96047444085842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.53102238294964, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55135190498416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73320965755092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.83108861382613, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66116571648418, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.37760682748707, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.73832896665387, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55125645985115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.05801072220544, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.19615016955767, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.71612053106102, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.35363412291727, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.89683728827593, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.45394449656699, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.64711251538863, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.20425342905766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.27286775878677, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.11098684044114, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.82344576152076, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.85991046136218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.76944869834962, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.49443525385506, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.26714007172914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.55312747617486, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.21338289364272, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.50082066300278, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.2831851440446, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.64838687037759, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.7216517557643, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.97199380174195, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.55110234448432, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.47254018419862, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.35333984916058, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.55290357280875, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.92761668682888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.52405415324874, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.01759216619796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.9301791723341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.98789247555584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.13492749804534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.88900920001714, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.63316803265334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.85577813730865, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.25060393364089, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.37992029678232, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.2161626045396, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.94097148564505, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.61411385344917, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.26633312852945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57486927906898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.25460128509323, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.93806274853755, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.88821464003595, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.53437593350753, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.5558255899151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.57746904834741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35186779566517, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.8222066824917, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.33239215677628, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.65684927729922, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.07995330778445, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.14274907856505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.31638915313647, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.80125655346451, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.86908900365832, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.43258549076677, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.74183853860589, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.04661736537737, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.18409149189986, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.27288236124933, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.66757472286284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.66108329653197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.0113429588981, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.01542580767834, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87145951112795, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58043482842866, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.28456359684716, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.42689177563531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.10394740945229, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.5888902773369, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.05233318851363, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.20379964517136, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93054848304011, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.4470753529935, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.55093725008568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.1771270171211, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.51951955539236, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.35054775405881, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.20200706252784, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.07198645570766, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.13850851279538, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.2608758916971, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.93035699558081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.52157669994283, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.49395863364698, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.86316250689507, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.18352844268802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.93546496698286, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.8113095296125, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.54696410392557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.08012041438292, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.23016998477505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.84774198158706, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.88558944915762, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.52000332438061, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.86871340352687, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.58373696827199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.82208371804109, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.32832910147938, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.06529443738525, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.45977666376373, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.24686599676619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.21043430906948, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.4518561142622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.80819601768098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.9586155221746, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.14254378792333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.6718045936633, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.3689677842857, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.87620295869029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.06997514477666, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.79230048470953, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.69842658289039, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.84366945841847, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.75521347785288, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.14459057740478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.78540826994568, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.0389294134589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T00:00:00" + } + ], + "final_value": 98797.57980296039, + "framework": "ml4t.backtest", + "num_trades": 600, + "total_pnl": -1202.4201970396098, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.11917253451473, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 99.54841534502786, + "exit_reason": "signal", + "exit_time": "2020-01-04T00:00:00", + "pnl": -157.0757189486867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.03201587878578, + "entry_time": "2020-01-06T00:00:00", + "exit_price": 99.94550278474797, + "exit_reason": "signal", + "exit_time": "2020-01-07T00:00:00", + "pnl": -8.651309403781852, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.67183298908238, + "entry_time": "2020-01-09T00:00:00", + "exit_price": 99.86549713479145, + "exit_reason": "signal", + "exit_time": "2020-01-10T00:00:00", + "pnl": 19.36641457090809, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.19160897741419, + "entry_time": "2020-01-12T00:00:00", + "exit_price": 100.48697641782272, + "exit_reason": "signal", + "exit_time": "2020-01-13T00:00:00", + "pnl": 29.536744040851772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.74505140134526, + "entry_time": "2020-01-15T00:00:00", + "exit_price": 99.43249701182592, + "exit_reason": "signal", + "exit_time": "2020-01-16T00:00:00", + "pnl": -31.255438951935503, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.36317339817481, + "entry_time": "2020-01-18T00:00:00", + "exit_price": 100.3184784020995, + "exit_reason": "signal", + "exit_time": "2020-01-19T00:00:00", + "pnl": 95.53050039246955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.59194698786014, + "entry_time": "2020-01-21T00:00:00", + "exit_price": 99.21300773889088, + "exit_reason": "signal", + "exit_time": "2020-01-22T00:00:00", + "pnl": -37.893924896925455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.93323693635863, + "entry_time": "2020-01-24T00:00:00", + "exit_price": 101.01041702546699, + "exit_reason": "signal", + "exit_time": "2020-01-25T00:00:00", + "pnl": 107.71800891083694, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.12882215455511, + "entry_time": "2020-01-27T00:00:00", + "exit_price": 98.82503838919212, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -130.37837653629867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.20974209562837, + "entry_time": "2020-01-30T00:00:00", + "exit_price": 99.28418162139361, + "exit_reason": "signal", + "exit_time": "2020-01-31T00:00:00", + "pnl": 7.44395257652468, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.91262465479313, + "entry_time": "2020-02-02T00:00:00", + "exit_price": 98.47079432451613, + "exit_reason": "signal", + "exit_time": "2020-02-03T00:00:00", + "pnl": -144.1830330276989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.41396612142576, + "entry_time": "2020-02-05T00:00:00", + "exit_price": 99.74208634353057, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 132.8120222104808, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96112016066533, + "entry_time": "2020-02-08T00:00:00", + "exit_price": 99.14757933275934, + "exit_reason": "signal", + "exit_time": "2020-02-09T00:00:00", + "pnl": 18.645917209401887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.33794797010773, + "entry_time": "2020-02-11T00:00:00", + "exit_price": 98.95774776632322, + "exit_reason": "signal", + "exit_time": "2020-02-12T00:00:00", + "pnl": -38.02002037845159, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.39809150990904, + "entry_time": "2020-02-14T00:00:00", + "exit_price": 99.29624163714647, + "exit_reason": "signal", + "exit_time": "2020-02-15T00:00:00", + "pnl": -10.184987276257743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98044425919083, + "entry_time": "2020-02-17T00:00:00", + "exit_price": 98.71415014911958, + "exit_reason": "signal", + "exit_time": "2020-02-18T00:00:00", + "pnl": -26.629411007124872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68703409584347, + "entry_time": "2020-02-20T00:00:00", + "exit_price": 99.19660477578049, + "exit_reason": "signal", + "exit_time": "2020-02-21T00:00:00", + "pnl": 50.95706799370237, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.09913803201934, + "entry_time": "2020-02-23T00:00:00", + "exit_price": 99.13975001075532, + "exit_reason": "signal", + "exit_time": "2020-02-24T00:00:00", + "pnl": -95.93880212640215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7525000464393, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 98.67014960303162, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -8.235044340766763, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.16172259245428, + "entry_time": "2020-02-29T00:00:00", + "exit_price": 99.99277550738104, + "exit_reason": "signal", + "exit_time": "2020-03-01T00:00:00", + "pnl": 83.10529149267677, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.726000665382, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 99.27597137389321, + "exit_reason": "signal", + "exit_time": "2020-03-04T00:00:00", + "pnl": 54.99707085112095, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.96674656359579, + "entry_time": "2020-03-06T00:00:00", + "exit_price": 99.01407453019127, + "exit_reason": "signal", + "exit_time": "2020-03-07T00:00:00", + "pnl": -95.2672033404524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01883446140224, + "entry_time": "2020-03-09T00:00:00", + "exit_price": 99.33686580554885, + "exit_reason": "signal", + "exit_time": "2020-03-10T00:00:00", + "pnl": 31.803134414662054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.61379453469056, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 99.44418682978016, + "exit_reason": "signal", + "exit_time": "2020-03-13T00:00:00", + "pnl": -16.96077049103951, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.1261570487614, + "entry_time": "2020-03-15T00:00:00", + "exit_price": 98.90367229199478, + "exit_reason": "signal", + "exit_time": "2020-03-16T00:00:00", + "pnl": 77.75152432333743, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.48715448535594, + "entry_time": "2020-03-18T00:00:00", + "exit_price": 98.53898885220806, + "exit_reason": "signal", + "exit_time": "2020-03-19T00:00:00", + "pnl": -94.81656331478916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.13695584567007, + "entry_time": "2020-03-21T00:00:00", + "exit_price": 98.74920846022493, + "exit_reason": "signal", + "exit_time": "2020-03-22T00:00:00", + "pnl": -138.77473854451455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.28346179234327, + "entry_time": "2020-03-24T00:00:00", + "exit_price": 99.39446913633991, + "exit_reason": "signal", + "exit_time": "2020-03-25T00:00:00", + "pnl": 11.100734399662542, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38048314487808, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 98.86853857797571, + "exit_reason": "signal", + "exit_time": "2020-03-28T00:00:00", + "pnl": -51.19445669023844, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.78335766752544, + "entry_time": "2020-03-30T00:00:00", + "exit_price": 100.08258048792489, + "exit_reason": "signal", + "exit_time": "2020-03-31T00:00:00", + "pnl": 29.922282039944548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.04409706752067, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 100.00584315640894, + "exit_reason": "signal", + "exit_time": "2020-04-03T00:00:00", + "pnl": -3.825391111173303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17754603801194, + "entry_time": "2020-04-05T00:00:00", + "exit_price": 99.91386750387461, + "exit_reason": "signal", + "exit_time": "2020-04-06T00:00:00", + "pnl": 73.63214658626748, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.07278397148802, + "entry_time": "2020-04-08T00:00:00", + "exit_price": 99.84957817071898, + "exit_reason": "signal", + "exit_time": "2020-04-09T00:00:00", + "pnl": -122.32058007690466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.66685696016805, + "entry_time": "2020-04-11T00:00:00", + "exit_price": 100.29703959359377, + "exit_reason": "signal", + "exit_time": "2020-04-12T00:00:00", + "pnl": 63.01826334257203, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.16284479663989, + "entry_time": "2020-04-14T00:00:00", + "exit_price": 99.59827392536462, + "exit_reason": "signal", + "exit_time": "2020-04-15T00:00:00", + "pnl": -56.45708712752639, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.02427769637677, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 100.02034152325665, + "exit_reason": "signal", + "exit_time": "2020-04-18T00:00:00", + "pnl": -0.39361731201279326, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.10227360972624, + "entry_time": "2020-04-20T00:00:00", + "exit_price": 99.55074957264794, + "exit_reason": "signal", + "exit_time": "2020-04-21T00:00:00", + "pnl": -55.15240370782885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4752285310497, + "entry_time": "2020-04-23T00:00:00", + "exit_price": 100.78482968977629, + "exit_reason": "signal", + "exit_time": "2020-04-24T00:00:00", + "pnl": 30.960115872660026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.64550269913406, + "entry_time": "2020-04-26T00:00:00", + "exit_price": 100.75829920829567, + "exit_reason": "signal", + "exit_time": "2020-04-27T00:00:00", + "pnl": 11.2796509161617, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.28405624956508, + "entry_time": "2020-04-29T00:00:00", + "exit_price": 100.40750734980367, + "exit_reason": "signal", + "exit_time": "2020-04-30T00:00:00", + "pnl": 12.345110023859888, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.9736108084372, + "entry_time": "2020-05-02T00:00:00", + "exit_price": 99.11719582995507, + "exit_reason": "signal", + "exit_time": "2020-05-03T00:00:00", + "pnl": -185.64149784821348, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4244273841596, + "entry_time": "2020-05-05T00:00:00", + "exit_price": 100.46803368609852, + "exit_reason": "signal", + "exit_time": "2020-05-06T00:00:00", + "pnl": 4.360630193890756, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.65390080108091, + "entry_time": "2020-05-08T00:00:00", + "exit_price": 101.55529329412784, + "exit_reason": "signal", + "exit_time": "2020-05-09T00:00:00", + "pnl": 90.1392493046933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.84475344760442, + "entry_time": "2020-05-11T00:00:00", + "exit_price": 101.34547532849058, + "exit_reason": "signal", + "exit_time": "2020-05-12T00:00:00", + "pnl": 50.0721880886158, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.83286932713185, + "entry_time": "2020-05-14T00:00:00", + "exit_price": 100.1414110724743, + "exit_reason": "signal", + "exit_time": "2020-05-15T00:00:00", + "pnl": -69.14582546575548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.70880723169135, + "entry_time": "2020-05-17T00:00:00", + "exit_price": 100.37107171120154, + "exit_reason": "signal", + "exit_time": "2020-05-18T00:00:00", + "pnl": -33.77355204898231, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17212988349165, + "entry_time": "2020-05-20T00:00:00", + "exit_price": 100.88968353827181, + "exit_reason": "signal", + "exit_time": "2020-05-21T00:00:00", + "pnl": 171.75536547801676, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.17974473578754, + "entry_time": "2020-05-23T00:00:00", + "exit_price": 99.64495810760246, + "exit_reason": "signal", + "exit_time": "2020-05-24T00:00:00", + "pnl": 46.521337181493436, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86042757757674, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 99.42922022261914, + "exit_reason": "signal", + "exit_time": "2020-05-27T00:00:00", + "pnl": 56.87926450423947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.67123710700702, + "entry_time": "2020-05-29T00:00:00", + "exit_price": 99.1262468099545, + "exit_reason": "signal", + "exit_time": "2020-05-30T00:00:00", + "pnl": 45.500970294748186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.99803204217791, + "entry_time": "2020-06-01T00:00:00", + "exit_price": 98.0746490327229, + "exit_reason": "signal", + "exit_time": "2020-06-02T00:00:00", + "pnl": 7.661699054498968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68852164950059, + "entry_time": "2020-06-04T00:00:00", + "exit_price": 98.90683245619206, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 21.831080669147923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.69867095887889, + "entry_time": "2020-06-07T00:00:00", + "exit_price": 98.58028409299915, + "exit_reason": "signal", + "exit_time": "2020-06-08T00:00:00", + "pnl": -11.838686587974735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78930171959787, + "entry_time": "2020-06-10T00:00:00", + "exit_price": 99.44349309161046, + "exit_reason": "signal", + "exit_time": "2020-06-11T00:00:00", + "pnl": 65.41913720125922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.63928948741085, + "entry_time": "2020-06-13T00:00:00", + "exit_price": 99.8801021064717, + "exit_reason": "signal", + "exit_time": "2020-06-14T00:00:00", + "pnl": 24.081261906085274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.88804895153031, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 98.9129584357738, + "exit_reason": "signal", + "exit_time": "2020-06-17T00:00:00", + "pnl": 2.4909484243489715, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.35911188288489, + "entry_time": "2020-06-19T00:00:00", + "exit_price": 99.55107978610341, + "exit_reason": "signal", + "exit_time": "2020-06-20T00:00:00", + "pnl": 19.19679032185377, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.24566283787111, + "entry_time": "2020-06-22T00:00:00", + "exit_price": 99.50854335078685, + "exit_reason": "signal", + "exit_time": "2020-06-23T00:00:00", + "pnl": 26.288051291574448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.85972377687798, + "entry_time": "2020-06-25T00:00:00", + "exit_price": 98.94180161552265, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": 8.207783864467274, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.42256786175979, + "entry_time": "2020-06-28T00:00:00", + "exit_price": 98.39260868907034, + "exit_reason": "signal", + "exit_time": "2020-06-29T00:00:00", + "pnl": -2.9959172689432307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47598985042309, + "entry_time": "2020-07-01T00:00:00", + "exit_price": 98.2217481384577, + "exit_reason": "signal", + "exit_time": "2020-07-02T00:00:00", + "pnl": -25.424171196538737, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.43771261461686, + "entry_time": "2020-07-04T00:00:00", + "exit_price": 99.25556396259081, + "exit_reason": "signal", + "exit_time": "2020-07-05T00:00:00", + "pnl": -18.214865202604415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.27520136851216, + "entry_time": "2020-07-07T00:00:00", + "exit_price": 99.22895283520214, + "exit_reason": "signal", + "exit_time": "2020-07-08T00:00:00", + "pnl": -4.62485333100085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84721164221584, + "entry_time": "2020-07-10T00:00:00", + "exit_price": 98.21690016032666, + "exit_reason": "signal", + "exit_time": "2020-07-11T00:00:00", + "pnl": -63.03114818891845, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.98012439288168, + "entry_time": "2020-07-13T00:00:00", + "exit_price": 98.42241300564716, + "exit_reason": "signal", + "exit_time": "2020-07-14T00:00:00", + "pnl": -55.77113872345217, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5234973647714, + "entry_time": "2020-07-16T00:00:00", + "exit_price": 98.84780174120549, + "exit_reason": "signal", + "exit_time": "2020-07-17T00:00:00", + "pnl": -67.56956235658981, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.78357735159078, + "entry_time": "2020-07-19T00:00:00", + "exit_price": 98.5180376571157, + "exit_reason": "signal", + "exit_time": "2020-07-20T00:00:00", + "pnl": -26.55396944750828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07885735340791, + "entry_time": "2020-07-22T00:00:00", + "exit_price": 98.46287786089891, + "exit_reason": "signal", + "exit_time": "2020-07-23T00:00:00", + "pnl": 38.402050749100454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7806750796624, + "entry_time": "2020-07-25T00:00:00", + "exit_price": 98.99007562374577, + "exit_reason": "signal", + "exit_time": "2020-07-26T00:00:00", + "pnl": 20.940054408336437, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3160405598432, + "entry_time": "2020-07-28T00:00:00", + "exit_price": 97.69515591162462, + "exit_reason": "signal", + "exit_time": "2020-07-29T00:00:00", + "pnl": -62.088464821858, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.9307950005457, + "entry_time": "2020-07-31T00:00:00", + "exit_price": 97.49497584845733, + "exit_reason": "signal", + "exit_time": "2020-08-01T00:00:00", + "pnl": -43.58191520883702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.05277773908539, + "entry_time": "2020-08-03T00:00:00", + "exit_price": 97.63017059410102, + "exit_reason": "signal", + "exit_time": "2020-08-04T00:00:00", + "pnl": -42.260714498435846, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.95560584181007, + "entry_time": "2020-08-06T00:00:00", + "exit_price": 97.85704345214471, + "exit_reason": "signal", + "exit_time": "2020-08-07T00:00:00", + "pnl": -109.85623896653487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.34581983849665, + "entry_time": "2020-08-09T00:00:00", + "exit_price": 98.55148937480453, + "exit_reason": "signal", + "exit_time": "2020-08-10T00:00:00", + "pnl": 120.5669536307887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.83406196186097, + "entry_time": "2020-08-12T00:00:00", + "exit_price": 97.25669377064881, + "exit_reason": "signal", + "exit_time": "2020-08-13T00:00:00", + "pnl": -57.736819121215376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.51637945271536, + "entry_time": "2020-08-15T00:00:00", + "exit_price": 97.57103396676897, + "exit_reason": "signal", + "exit_time": "2020-08-16T00:00:00", + "pnl": 5.465451405361819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43830185841739, + "entry_time": "2020-08-18T00:00:00", + "exit_price": 98.4155507445711, + "exit_reason": "signal", + "exit_time": "2020-08-19T00:00:00", + "pnl": -2.2751113846297812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.92267680402585, + "entry_time": "2020-08-21T00:00:00", + "exit_price": 98.75883349843212, + "exit_reason": "signal", + "exit_time": "2020-08-22T00:00:00", + "pnl": 83.61566944062724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.974264479532, + "entry_time": "2020-08-24T00:00:00", + "exit_price": 99.70988332181, + "exit_reason": "signal", + "exit_time": "2020-08-25T00:00:00", + "pnl": 173.56188422779996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21365266173218, + "entry_time": "2020-08-27T00:00:00", + "exit_price": 98.08294324004585, + "exit_reason": "signal", + "exit_time": "2020-08-28T00:00:00", + "pnl": -113.07094216863334, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11928874045202, + "entry_time": "2020-08-30T00:00:00", + "exit_price": 98.31180164071337, + "exit_reason": "signal", + "exit_time": "2020-08-31T00:00:00", + "pnl": 19.251290026133574, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.00054275724281, + "entry_time": "2020-09-02T00:00:00", + "exit_price": 98.65255133629894, + "exit_reason": "signal", + "exit_time": "2020-09-03T00:00:00", + "pnl": 65.20085790561279, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.96503242935937, + "entry_time": "2020-09-05T00:00:00", + "exit_price": 98.79138811772025, + "exit_reason": "signal", + "exit_time": "2020-09-06T00:00:00", + "pnl": -17.364431163910922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.47378044689604, + "entry_time": "2020-09-08T00:00:00", + "exit_price": 98.31284487928606, + "exit_reason": "signal", + "exit_time": "2020-09-09T00:00:00", + "pnl": -116.09355676099767, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.73200506980342, + "entry_time": "2020-09-11T00:00:00", + "exit_price": 98.3363427106496, + "exit_reason": "signal", + "exit_time": "2020-09-12T00:00:00", + "pnl": 60.433764084618815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.56611574901736, + "entry_time": "2020-09-14T00:00:00", + "exit_price": 98.13272204200155, + "exit_reason": "signal", + "exit_time": "2020-09-15T00:00:00", + "pnl": -43.339370701580265, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.89963627791985, + "entry_time": "2020-09-17T00:00:00", + "exit_price": 98.38755792776327, + "exit_reason": "signal", + "exit_time": "2020-09-18T00:00:00", + "pnl": 148.79216498434107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.35474381234252, + "entry_time": "2020-09-20T00:00:00", + "exit_price": 98.97868642263799, + "exit_reason": "signal", + "exit_time": "2020-09-21T00:00:00", + "pnl": 62.394261029547124, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.11962753041762, + "entry_time": "2020-09-23T00:00:00", + "exit_price": 99.25728100943367, + "exit_reason": "signal", + "exit_time": "2020-09-24T00:00:00", + "pnl": 13.7653479016044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.076645155786, + "entry_time": "2020-09-26T00:00:00", + "exit_price": 99.1361736846976, + "exit_reason": "signal", + "exit_time": "2020-09-27T00:00:00", + "pnl": 5.952852891159637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.95761891143941, + "entry_time": "2020-09-29T00:00:00", + "exit_price": 99.38251520181134, + "exit_reason": "signal", + "exit_time": "2020-09-30T00:00:00", + "pnl": 42.48962903719439, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.58405172820402, + "entry_time": "2020-10-02T00:00:00", + "exit_price": 100.1825648349693, + "exit_reason": "signal", + "exit_time": "2020-10-03T00:00:00", + "pnl": 59.851310676529465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31778631274507, + "entry_time": "2020-10-05T00:00:00", + "exit_price": 98.92748490697555, + "exit_reason": "signal", + "exit_time": "2020-10-06T00:00:00", + "pnl": -39.03014057695145, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11485299409067, + "entry_time": "2020-10-08T00:00:00", + "exit_price": 97.46828746700024, + "exit_reason": "signal", + "exit_time": "2020-10-09T00:00:00", + "pnl": -64.65655270904244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.7892083341232, + "entry_time": "2020-10-11T00:00:00", + "exit_price": 99.2850707768965, + "exit_reason": "signal", + "exit_time": "2020-10-12T00:00:00", + "pnl": 149.58624427733048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.61528686513479, + "entry_time": "2020-10-14T00:00:00", + "exit_price": 98.16045065160826, + "exit_reason": "signal", + "exit_time": "2020-10-15T00:00:00", + "pnl": 54.516378647347665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98923853245553, + "entry_time": "2020-10-17T00:00:00", + "exit_price": 97.78083136801966, + "exit_reason": "signal", + "exit_time": "2020-10-18T00:00:00", + "pnl": -20.840716443586643, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98736762370623, + "entry_time": "2020-10-20T00:00:00", + "exit_price": 98.41242668783207, + "exit_reason": "signal", + "exit_time": "2020-10-21T00:00:00", + "pnl": 42.5059064125835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.7821059253462, + "entry_time": "2020-10-23T00:00:00", + "exit_price": 98.01676230346942, + "exit_reason": "signal", + "exit_time": "2020-10-24T00:00:00", + "pnl": -76.5343621876782, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.90986422948514, + "entry_time": "2020-10-26T00:00:00", + "exit_price": 98.85698353324744, + "exit_reason": "signal", + "exit_time": "2020-10-27T00:00:00", + "pnl": -5.288069623769843, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.72982041802001, + "entry_time": "2020-10-29T00:00:00", + "exit_price": 98.60761748093444, + "exit_reason": "signal", + "exit_time": "2020-10-30T00:00:00", + "pnl": -12.22029370855671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.0385605171193, + "entry_time": "2020-11-01T00:00:00", + "exit_price": 99.09198940082088, + "exit_reason": "signal", + "exit_time": "2020-11-02T00:00:00", + "pnl": 5.342888370158107, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21597248424331, + "entry_time": "2020-11-04T00:00:00", + "exit_price": 98.490691270523, + "exit_reason": "signal", + "exit_time": "2020-11-05T00:00:00", + "pnl": -72.52812137203, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.2706953210234, + "entry_time": "2020-11-07T00:00:00", + "exit_price": 98.23704650718707, + "exit_reason": "signal", + "exit_time": "2020-11-08T00:00:00", + "pnl": -3.364881383631655, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.30522444084696, + "entry_time": "2020-11-10T00:00:00", + "exit_price": 97.82731858826378, + "exit_reason": "signal", + "exit_time": "2020-11-11T00:00:00", + "pnl": 52.20941474168103, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.91407429365688, + "entry_time": "2020-11-13T00:00:00", + "exit_price": 98.5460351903365, + "exit_reason": "signal", + "exit_time": "2020-11-14T00:00:00", + "pnl": -36.80391033203887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.93028933684711, + "entry_time": "2020-11-16T00:00:00", + "exit_price": 99.0553633238757, + "exit_reason": "signal", + "exit_time": "2020-11-17T00:00:00", + "pnl": 12.507398702859064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47484452500944, + "entry_time": "2020-11-19T00:00:00", + "exit_price": 98.10094020807114, + "exit_reason": "signal", + "exit_time": "2020-11-20T00:00:00", + "pnl": -37.39043169383149, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.01428360585088, + "entry_time": "2020-11-22T00:00:00", + "exit_price": 97.38292648890776, + "exit_reason": "signal", + "exit_time": "2020-11-23T00:00:00", + "pnl": -163.13571169431088, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.48513559668872, + "entry_time": "2020-11-25T00:00:00", + "exit_price": 97.27497370614257, + "exit_reason": "signal", + "exit_time": "2020-11-26T00:00:00", + "pnl": -121.0161890546151, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.14886606297294, + "entry_time": "2020-11-28T00:00:00", + "exit_price": 98.29611163730506, + "exit_reason": "signal", + "exit_time": "2020-11-29T00:00:00", + "pnl": 14.724557433211885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.23350982317787, + "entry_time": "2020-12-01T00:00:00", + "exit_price": 97.79948982072462, + "exit_reason": "signal", + "exit_time": "2020-12-02T00:00:00", + "pnl": 56.597999754674674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.98472225444857, + "entry_time": "2020-12-04T00:00:00", + "exit_price": 97.71079305814114, + "exit_reason": "signal", + "exit_time": "2020-12-05T00:00:00", + "pnl": -27.392919630743563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.3396263042363, + "entry_time": "2020-12-07T00:00:00", + "exit_price": 97.98172498582129, + "exit_reason": "signal", + "exit_time": "2020-12-08T00:00:00", + "pnl": -35.790131841500624, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.42795373397291, + "entry_time": "2020-12-10T00:00:00", + "exit_price": 96.6321305493393, + "exit_reason": "signal", + "exit_time": "2020-12-11T00:00:00", + "pnl": -79.58231846336275, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76479352938595, + "entry_time": "2020-12-13T00:00:00", + "exit_price": 98.48958247666039, + "exit_reason": "signal", + "exit_time": "2020-12-14T00:00:00", + "pnl": 172.47889472744282, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.73111789636548, + "entry_time": "2020-12-16T00:00:00", + "exit_price": 97.61885876679554, + "exit_reason": "signal", + "exit_time": "2020-12-17T00:00:00", + "pnl": 88.77408704300797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.85401562603096, + "entry_time": "2020-12-19T00:00:00", + "exit_price": 96.49175141105385, + "exit_reason": "signal", + "exit_time": "2020-12-20T00:00:00", + "pnl": -136.22642149771127, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.84289871423181, + "entry_time": "2020-12-22T00:00:00", + "exit_price": 96.99377199128872, + "exit_reason": "signal", + "exit_time": "2020-12-23T00:00:00", + "pnl": -84.91267229430923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.76186428614056, + "entry_time": "2020-12-25T00:00:00", + "exit_price": 96.48850513355184, + "exit_reason": "signal", + "exit_time": "2020-12-26T00:00:00", + "pnl": -27.335915258872774, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.12395315196963, + "entry_time": "2020-12-28T00:00:00", + "exit_price": 97.53863571252707, + "exit_reason": "signal", + "exit_time": "2020-12-29T00:00:00", + "pnl": 41.46825605574304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.6026762767146, + "entry_time": "2020-12-31T00:00:00", + "exit_price": 97.09752132137899, + "exit_reason": "signal", + "exit_time": "2021-01-01T00:00:00", + "pnl": -50.51549553356199, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.49274636123849, + "entry_time": "2021-01-03T00:00:00", + "exit_price": 96.82226372897985, + "exit_reason": "signal", + "exit_time": "2021-01-04T00:00:00", + "pnl": -67.0482632258645, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.79148532437996, + "entry_time": "2021-01-06T00:00:00", + "exit_price": 97.11483711173116, + "exit_reason": "signal", + "exit_time": "2021-01-07T00:00:00", + "pnl": 32.33517873512028, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.80033950220172, + "entry_time": "2021-01-09T00:00:00", + "exit_price": 96.63729064888537, + "exit_reason": "signal", + "exit_time": "2021-01-10T00:00:00", + "pnl": 83.69511466836593, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.11575917668634, + "entry_time": "2021-01-12T00:00:00", + "exit_price": 96.28032546622858, + "exit_reason": "signal", + "exit_time": "2021-01-13T00:00:00", + "pnl": 16.45662895422356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.53344904132359, + "entry_time": "2021-01-15T00:00:00", + "exit_price": 97.29557459823668, + "exit_reason": "signal", + "exit_time": "2021-01-16T00:00:00", + "pnl": 76.21255569131063, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.01730754421833, + "entry_time": "2021-01-18T00:00:00", + "exit_price": 96.07935604760307, + "exit_reason": "signal", + "exit_time": "2021-01-19T00:00:00", + "pnl": 6.204850338473989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.79620422510413, + "entry_time": "2021-01-21T00:00:00", + "exit_price": 95.24797305894252, + "exit_reason": "signal", + "exit_time": "2021-01-22T00:00:00", + "pnl": -54.823116616162224, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.19373825703377, + "entry_time": "2021-01-24T00:00:00", + "exit_price": 95.40514794332339, + "exit_reason": "signal", + "exit_time": "2021-01-25T00:00:00", + "pnl": 21.140968628962582, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.55648566288775, + "entry_time": "2021-01-27T00:00:00", + "exit_price": 96.55716667120137, + "exit_reason": "signal", + "exit_time": "2021-01-28T00:00:00", + "pnl": 100.06810083136224, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.91494018138198, + "entry_time": "2021-01-30T00:00:00", + "exit_price": 95.48501201892987, + "exit_reason": "signal", + "exit_time": "2021-01-31T00:00:00", + "pnl": 57.00718375478937, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.90008526748946, + "entry_time": "2021-02-02T00:00:00", + "exit_price": 95.83721845974864, + "exit_reason": "signal", + "exit_time": "2021-02-03T00:00:00", + "pnl": -6.2866807740829245, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26504549069784, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 96.06840340797214, + "exit_reason": "signal", + "exit_time": "2021-02-06T00:00:00", + "pnl": 80.33579172742975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.26053581327312, + "entry_time": "2021-02-08T00:00:00", + "exit_price": 95.42454996605802, + "exit_reason": "signal", + "exit_time": "2021-02-09T00:00:00", + "pnl": 16.401415278489367, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94825682250637, + "entry_time": "2021-02-11T00:00:00", + "exit_price": 95.05109746301979, + "exit_reason": "signal", + "exit_time": "2021-02-12T00:00:00", + "pnl": 10.284064051340465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.1969266603545, + "entry_time": "2021-02-14T00:00:00", + "exit_price": 96.27193710609464, + "exit_reason": "signal", + "exit_time": "2021-02-15T00:00:00", + "pnl": 7.5010445740135765, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97039812035842, + "entry_time": "2021-02-17T00:00:00", + "exit_price": 96.34802647272141, + "exit_reason": "signal", + "exit_time": "2021-02-18T00:00:00", + "pnl": -62.237164763701, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.07904244701469, + "entry_time": "2021-02-20T00:00:00", + "exit_price": 96.79316819026657, + "exit_reason": "signal", + "exit_time": "2021-02-21T00:00:00", + "pnl": -28.58742567481204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.5721771606179, + "entry_time": "2021-02-23T00:00:00", + "exit_price": 95.6253449835299, + "exit_reason": "signal", + "exit_time": "2021-02-24T00:00:00", + "pnl": 5.31678229120007, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88599336671724, + "entry_time": "2021-02-26T00:00:00", + "exit_price": 93.9167314813735, + "exit_reason": "signal", + "exit_time": "2021-02-27T00:00:00", + "pnl": -96.92618853437489, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23555143341264, + "entry_time": "2021-03-01T00:00:00", + "exit_price": 94.69172330670986, + "exit_reason": "signal", + "exit_time": "2021-03-02T00:00:00", + "pnl": -54.38281267027742, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.40326355089037, + "entry_time": "2021-03-04T00:00:00", + "exit_price": 94.32320287324674, + "exit_reason": "signal", + "exit_time": "2021-03-05T00:00:00", + "pnl": -8.006067764363252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32022315669315, + "entry_time": "2021-03-07T00:00:00", + "exit_price": 94.22613575397045, + "exit_reason": "signal", + "exit_time": "2021-03-08T00:00:00", + "pnl": -9.408740272268915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.08195298394907, + "entry_time": "2021-03-10T00:00:00", + "exit_price": 94.5883765126535, + "exit_reason": "signal", + "exit_time": "2021-03-11T00:00:00", + "pnl": -49.357647129556426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6323490375275, + "entry_time": "2021-03-13T00:00:00", + "exit_price": 95.0747399163529, + "exit_reason": "signal", + "exit_time": "2021-03-14T00:00:00", + "pnl": 44.239087882539025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.55723413541229, + "entry_time": "2021-03-16T00:00:00", + "exit_price": 94.78282068603487, + "exit_reason": "signal", + "exit_time": "2021-03-17T00:00:00", + "pnl": 22.558655062257458, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66145085922012, + "entry_time": "2021-03-19T00:00:00", + "exit_price": 95.46346097050873, + "exit_reason": "signal", + "exit_time": "2021-03-20T00:00:00", + "pnl": 180.20101112886005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.00404625454874, + "entry_time": "2021-03-22T00:00:00", + "exit_price": 94.66092881844988, + "exit_reason": "signal", + "exit_time": "2021-03-23T00:00:00", + "pnl": -34.311743609885525, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.49919123199935, + "entry_time": "2021-03-25T00:00:00", + "exit_price": 93.97621398907071, + "exit_reason": "signal", + "exit_time": "2021-03-26T00:00:00", + "pnl": -152.29772429286277, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41257974165285, + "entry_time": "2021-03-28T00:00:00", + "exit_price": 95.05124864668421, + "exit_reason": "signal", + "exit_time": "2021-03-29T00:00:00", + "pnl": 63.866890503137256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01899188310071, + "entry_time": "2021-03-31T00:00:00", + "exit_price": 94.2559389154428, + "exit_reason": "signal", + "exit_time": "2021-04-01T00:00:00", + "pnl": 23.694703234208646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12609495739093, + "entry_time": "2021-04-03T00:00:00", + "exit_price": 94.25576346468043, + "exit_reason": "signal", + "exit_time": "2021-04-04T00:00:00", + "pnl": 12.966850728949794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.47050530514431, + "entry_time": "2021-04-06T00:00:00", + "exit_price": 93.72410136704386, + "exit_reason": "signal", + "exit_time": "2021-04-07T00:00:00", + "pnl": 25.35960618995523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19884636287922, + "entry_time": "2021-04-09T00:00:00", + "exit_price": 93.86432033375576, + "exit_reason": "signal", + "exit_time": "2021-04-10T00:00:00", + "pnl": 66.54739708765192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.34050558738045, + "entry_time": "2021-04-12T00:00:00", + "exit_price": 94.10587138419956, + "exit_reason": "signal", + "exit_time": "2021-04-13T00:00:00", + "pnl": 76.53657968191146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72930751574246, + "entry_time": "2021-04-15T00:00:00", + "exit_price": 93.2563942182136, + "exit_reason": "signal", + "exit_time": "2021-04-16T00:00:00", + "pnl": -47.29132975288485, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.59980860135867, + "entry_time": "2021-04-18T00:00:00", + "exit_price": 94.54277270362402, + "exit_reason": "signal", + "exit_time": "2021-04-19T00:00:00", + "pnl": 94.29641022653595, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.92591784638046, + "entry_time": "2021-04-21T00:00:00", + "exit_price": 94.14258894906092, + "exit_reason": "signal", + "exit_time": "2021-04-22T00:00:00", + "pnl": 121.6671102680466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11423308566697, + "entry_time": "2021-04-24T00:00:00", + "exit_price": 93.03147452036931, + "exit_reason": "signal", + "exit_time": "2021-04-25T00:00:00", + "pnl": -108.2758565297645, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.97245173381131, + "entry_time": "2021-04-27T00:00:00", + "exit_price": 93.49318704896336, + "exit_reason": "signal", + "exit_time": "2021-04-28T00:00:00", + "pnl": -147.92646848479308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.68468709145579, + "entry_time": "2021-04-30T00:00:00", + "exit_price": 93.32003795658395, + "exit_reason": "signal", + "exit_time": "2021-05-01T00:00:00", + "pnl": -36.46491348718337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26674166444458, + "entry_time": "2021-05-03T00:00:00", + "exit_price": 94.26630934814936, + "exit_reason": "signal", + "exit_time": "2021-05-04T00:00:00", + "pnl": -0.04323162952096027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.4153331981033, + "entry_time": "2021-05-06T00:00:00", + "exit_price": 93.36350758058099, + "exit_reason": "signal", + "exit_time": "2021-05-07T00:00:00", + "pnl": -5.182561752229958, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.16332285120929, + "entry_time": "2021-05-09T00:00:00", + "exit_price": 94.34043899579565, + "exit_reason": "signal", + "exit_time": "2021-05-10T00:00:00", + "pnl": 17.711614458636177, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74219820454567, + "entry_time": "2021-05-12T00:00:00", + "exit_price": 94.55413171456674, + "exit_reason": "signal", + "exit_time": "2021-05-13T00:00:00", + "pnl": 81.19335100210628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58180279933771, + "entry_time": "2021-05-15T00:00:00", + "exit_price": 94.02408626223293, + "exit_reason": "signal", + "exit_time": "2021-05-16T00:00:00", + "pnl": 44.22834628952114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87657341045227, + "entry_time": "2021-05-18T00:00:00", + "exit_price": 94.55590567361484, + "exit_reason": "signal", + "exit_time": "2021-05-19T00:00:00", + "pnl": 67.93322631625779, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.08074161986468, + "entry_time": "2021-05-21T00:00:00", + "exit_price": 93.80457382221171, + "exit_reason": "signal", + "exit_time": "2021-05-22T00:00:00", + "pnl": 72.38322023470391, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8131686939551, + "entry_time": "2021-05-24T00:00:00", + "exit_price": 93.25793142134573, + "exit_reason": "signal", + "exit_time": "2021-05-25T00:00:00", + "pnl": 44.47627273906255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95253144170447, + "entry_time": "2021-05-27T00:00:00", + "exit_price": 93.14743781912107, + "exit_reason": "signal", + "exit_time": "2021-05-28T00:00:00", + "pnl": 19.490637741659157, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8783564574023, + "entry_time": "2021-05-30T00:00:00", + "exit_price": 92.9764387193147, + "exit_reason": "signal", + "exit_time": "2021-05-31T00:00:00", + "pnl": 9.808226191240465, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94516537050167, + "entry_time": "2021-06-02T00:00:00", + "exit_price": 92.89603764932446, + "exit_reason": "signal", + "exit_time": "2021-06-03T00:00:00", + "pnl": -4.912772117721033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.63800292429943, + "entry_time": "2021-06-05T00:00:00", + "exit_price": 93.24337208101042, + "exit_reason": "signal", + "exit_time": "2021-06-06T00:00:00", + "pnl": 160.53691567109854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.59556244009269, + "entry_time": "2021-06-08T00:00:00", + "exit_price": 91.28446378378608, + "exit_reason": "signal", + "exit_time": "2021-06-09T00:00:00", + "pnl": -31.10986563066035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13025499622808, + "entry_time": "2021-06-11T00:00:00", + "exit_price": 92.23383791902404, + "exit_reason": "signal", + "exit_time": "2021-06-12T00:00:00", + "pnl": -89.64170772040234, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3328854638381, + "entry_time": "2021-06-14T00:00:00", + "exit_price": 92.96067846320523, + "exit_reason": "signal", + "exit_time": "2021-06-15T00:00:00", + "pnl": 62.77929993671205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94965457520627, + "entry_time": "2021-06-17T00:00:00", + "exit_price": 92.16625059748041, + "exit_reason": "signal", + "exit_time": "2021-06-18T00:00:00", + "pnl": 21.659602227415235, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8269642033066, + "entry_time": "2021-06-20T00:00:00", + "exit_price": 91.81310669049036, + "exit_reason": "signal", + "exit_time": "2021-06-21T00:00:00", + "pnl": -1.3857512816248345, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2555442210953, + "entry_time": "2021-06-23T00:00:00", + "exit_price": 92.45622372930102, + "exit_reason": "signal", + "exit_time": "2021-06-24T00:00:00", + "pnl": 20.06795082057215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.83947343135847, + "entry_time": "2021-06-26T00:00:00", + "exit_price": 92.43135259957857, + "exit_reason": "signal", + "exit_time": "2021-06-27T00:00:00", + "pnl": 59.187916822009356, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.53295655650527, + "entry_time": "2021-06-29T00:00:00", + "exit_price": 91.78816229160894, + "exit_reason": "signal", + "exit_time": "2021-06-30T00:00:00", + "pnl": 25.520573510366376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9413213129086, + "entry_time": "2021-07-02T00:00:00", + "exit_price": 92.40648296911729, + "exit_reason": "signal", + "exit_time": "2021-07-03T00:00:00", + "pnl": 146.5161656208693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30279435197399, + "entry_time": "2021-07-05T00:00:00", + "exit_price": 90.65263067129818, + "exit_reason": "signal", + "exit_time": "2021-07-06T00:00:00", + "pnl": -65.01636806758142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8239628759463, + "entry_time": "2021-07-08T00:00:00", + "exit_price": 91.7795218814571, + "exit_reason": "signal", + "exit_time": "2021-07-09T00:00:00", + "pnl": -4.444099448919587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36068460994301, + "entry_time": "2021-07-11T00:00:00", + "exit_price": 91.47451059527033, + "exit_reason": "signal", + "exit_time": "2021-07-12T00:00:00", + "pnl": 11.382598532733027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.09791235411565, + "entry_time": "2021-07-14T00:00:00", + "exit_price": 91.64232209133355, + "exit_reason": "signal", + "exit_time": "2021-07-15T00:00:00", + "pnl": 54.440973721790215, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.9960341944844, + "entry_time": "2021-07-17T00:00:00", + "exit_price": 90.86057544771678, + "exit_reason": "signal", + "exit_time": "2021-07-18T00:00:00", + "pnl": -13.545874676761741, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.03722443992689, + "entry_time": "2021-07-20T00:00:00", + "exit_price": 91.02540027670304, + "exit_reason": "signal", + "exit_time": "2021-07-21T00:00:00", + "pnl": -101.1824163223846, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23831571579666, + "entry_time": "2021-07-23T00:00:00", + "exit_price": 91.61642884685872, + "exit_reason": "signal", + "exit_time": "2021-07-24T00:00:00", + "pnl": 37.81131310620731, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9587336040414, + "entry_time": "2021-07-26T00:00:00", + "exit_price": 91.78520963834742, + "exit_reason": "signal", + "exit_time": "2021-07-27T00:00:00", + "pnl": -17.35239656939666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.12207131713245, + "entry_time": "2021-07-29T00:00:00", + "exit_price": 93.030634236321, + "exit_reason": "signal", + "exit_time": "2021-07-30T00:00:00", + "pnl": 90.85629191885528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2580641252632, + "entry_time": "2021-08-01T00:00:00", + "exit_price": 92.57471719502651, + "exit_reason": "signal", + "exit_time": "2021-08-02T00:00:00", + "pnl": 31.665306976330612, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16033087447512, + "entry_time": "2021-08-04T00:00:00", + "exit_price": 91.64298714231596, + "exit_reason": "signal", + "exit_time": "2021-08-05T00:00:00", + "pnl": -51.734373215917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75555986268627, + "entry_time": "2021-08-07T00:00:00", + "exit_price": 93.29534460790408, + "exit_reason": "signal", + "exit_time": "2021-08-08T00:00:00", + "pnl": 53.9784745217803, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8204301569652, + "entry_time": "2021-08-10T00:00:00", + "exit_price": 93.34161824742394, + "exit_reason": "signal", + "exit_time": "2021-08-11T00:00:00", + "pnl": 52.118809045874514, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.61753779742976, + "entry_time": "2021-08-13T00:00:00", + "exit_price": 94.15624068230731, + "exit_reason": "signal", + "exit_time": "2021-08-14T00:00:00", + "pnl": 53.870288487754806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25917455813928, + "entry_time": "2021-08-16T00:00:00", + "exit_price": 93.5936848786624, + "exit_reason": "signal", + "exit_time": "2021-08-17T00:00:00", + "pnl": -66.54896794768683, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98045633035186, + "entry_time": "2021-08-19T00:00:00", + "exit_price": 93.98797939638727, + "exit_reason": "signal", + "exit_time": "2021-08-20T00:00:00", + "pnl": 100.752306603541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35827005631805, + "entry_time": "2021-08-22T00:00:00", + "exit_price": 93.69155799194061, + "exit_reason": "signal", + "exit_time": "2021-08-23T00:00:00", + "pnl": 33.32879356225567, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68091309416992, + "entry_time": "2021-08-25T00:00:00", + "exit_price": 92.70456318827733, + "exit_reason": "signal", + "exit_time": "2021-08-26T00:00:00", + "pnl": 2.36500941074155, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16469231313611, + "entry_time": "2021-08-28T00:00:00", + "exit_price": 92.8799099382491, + "exit_reason": "signal", + "exit_time": "2021-08-29T00:00:00", + "pnl": -28.47823748870178, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11566093967609, + "entry_time": "2021-08-31T00:00:00", + "exit_price": 93.80161139315015, + "exit_reason": "signal", + "exit_time": "2021-09-01T00:00:00", + "pnl": -31.404954652593005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.15377445359951, + "entry_time": "2021-09-03T00:00:00", + "exit_price": 94.15715297991916, + "exit_reason": "signal", + "exit_time": "2021-09-04T00:00:00", + "pnl": 100.33785263196478, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86962603101973, + "entry_time": "2021-09-06T00:00:00", + "exit_price": 93.72926386277882, + "exit_reason": "signal", + "exit_time": "2021-09-07T00:00:00", + "pnl": -14.036216824091753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1579385275225, + "entry_time": "2021-09-09T00:00:00", + "exit_price": 93.74116822603294, + "exit_reason": "signal", + "exit_time": "2021-09-10T00:00:00", + "pnl": -41.67703014895778, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31971390482752, + "entry_time": "2021-09-12T00:00:00", + "exit_price": 93.20782644697857, + "exit_reason": "signal", + "exit_time": "2021-09-13T00:00:00", + "pnl": -11.188745784895218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01885490875779, + "entry_time": "2021-09-15T00:00:00", + "exit_price": 94.42230012835577, + "exit_reason": "signal", + "exit_time": "2021-09-16T00:00:00", + "pnl": -59.65547804020207, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.99288411883724, + "entry_time": "2021-09-18T00:00:00", + "exit_price": 94.082184046767, + "exit_reason": "signal", + "exit_time": "2021-09-19T00:00:00", + "pnl": 8.9299927929751, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.85101362331126, + "entry_time": "2021-09-21T00:00:00", + "exit_price": 94.98564664788431, + "exit_reason": "signal", + "exit_time": "2021-09-22T00:00:00", + "pnl": 113.46330245730496, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86959357102904, + "entry_time": "2021-09-24T00:00:00", + "exit_price": 94.20013868958425, + "exit_reason": "signal", + "exit_time": "2021-09-25T00:00:00", + "pnl": 33.05451185552192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84924924581607, + "entry_time": "2021-09-27T00:00:00", + "exit_price": 93.31289310035527, + "exit_reason": "signal", + "exit_time": "2021-09-28T00:00:00", + "pnl": -153.63561454607952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30858201402589, + "entry_time": "2021-09-30T00:00:00", + "exit_price": 93.99373607498532, + "exit_reason": "signal", + "exit_time": "2021-10-01T00:00:00", + "pnl": -31.484593904056965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.18572768435918, + "entry_time": "2021-10-03T00:00:00", + "exit_price": 94.33439114940059, + "exit_reason": "signal", + "exit_time": "2021-10-04T00:00:00", + "pnl": -85.13365349585911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07429869254726, + "entry_time": "2021-10-06T00:00:00", + "exit_price": 94.04790943044297, + "exit_reason": "signal", + "exit_time": "2021-10-07T00:00:00", + "pnl": -2.6389262104275986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64069907229371, + "entry_time": "2021-10-09T00:00:00", + "exit_price": 94.26235855896988, + "exit_reason": "signal", + "exit_time": "2021-10-10T00:00:00", + "pnl": 62.16594866761625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.50379403067527, + "entry_time": "2021-10-12T00:00:00", + "exit_price": 94.43691170957882, + "exit_reason": "signal", + "exit_time": "2021-10-13T00:00:00", + "pnl": -6.688232109645469, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37005197510278, + "entry_time": "2021-10-15T00:00:00", + "exit_price": 94.27057437223934, + "exit_reason": "signal", + "exit_time": "2021-10-16T00:00:00", + "pnl": -9.947760286344419, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09337235241868, + "entry_time": "2021-10-18T00:00:00", + "exit_price": 94.71128565229746, + "exit_reason": "signal", + "exit_time": "2021-10-19T00:00:00", + "pnl": -38.20867001212173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.02883456195461, + "entry_time": "2021-10-21T00:00:00", + "exit_price": 94.80490335979458, + "exit_reason": "signal", + "exit_time": "2021-10-22T00:00:00", + "pnl": 77.60687978399619, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.9287597961482, + "entry_time": "2021-10-24T00:00:00", + "exit_price": 95.17470692964342, + "exit_reason": "signal", + "exit_time": "2021-10-25T00:00:00", + "pnl": 124.59471334952104, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2493152678643, + "entry_time": "2021-10-27T00:00:00", + "exit_price": 93.60050033989026, + "exit_reason": "signal", + "exit_time": "2021-10-28T00:00:00", + "pnl": -64.88149279740537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09469925407369, + "entry_time": "2021-10-30T00:00:00", + "exit_price": 94.3111349289259, + "exit_reason": "signal", + "exit_time": "2021-10-31T00:00:00", + "pnl": 21.643567485220046, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18816369089684, + "entry_time": "2021-11-02T00:00:00", + "exit_price": 94.42938460793316, + "exit_reason": "signal", + "exit_time": "2021-11-03T00:00:00", + "pnl": 24.122091703631668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.41602741852829, + "entry_time": "2021-11-05T00:00:00", + "exit_price": 93.42310978968692, + "exit_reason": "signal", + "exit_time": "2021-11-06T00:00:00", + "pnl": 0.7082371158630849, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.50953693273829, + "entry_time": "2021-11-08T00:00:00", + "exit_price": 93.33123427861662, + "exit_reason": "signal", + "exit_time": "2021-11-09T00:00:00", + "pnl": 82.16973458783286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96020937715257, + "entry_time": "2021-11-11T00:00:00", + "exit_price": 93.53068640749544, + "exit_reason": "signal", + "exit_time": "2021-11-12T00:00:00", + "pnl": 57.047703034286315, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5609164087555, + "entry_time": "2021-11-14T00:00:00", + "exit_price": 92.89910933295498, + "exit_reason": "signal", + "exit_time": "2021-11-15T00:00:00", + "pnl": 33.81929241994658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.4272707886787, + "entry_time": "2021-11-17T00:00:00", + "exit_price": 92.19572149206287, + "exit_reason": "signal", + "exit_time": "2021-11-18T00:00:00", + "pnl": -23.154929661581264, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68137345397398, + "entry_time": "2021-11-20T00:00:00", + "exit_price": 92.48011498833463, + "exit_reason": "signal", + "exit_time": "2021-11-21T00:00:00", + "pnl": -20.12584656393483, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73481537380023, + "entry_time": "2021-11-23T00:00:00", + "exit_price": 93.9817766831428, + "exit_reason": "signal", + "exit_time": "2021-11-24T00:00:00", + "pnl": 124.69613093425687, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.62422399002075, + "entry_time": "2021-11-26T00:00:00", + "exit_price": 92.25402747101043, + "exit_reason": "signal", + "exit_time": "2021-11-27T00:00:00", + "pnl": -37.019651901031466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.78794113614683, + "entry_time": "2021-11-29T00:00:00", + "exit_price": 92.51565520344022, + "exit_reason": "signal", + "exit_time": "2021-11-30T00:00:00", + "pnl": -27.228593270659985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81994141877884, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 91.73569183010366, + "exit_reason": "signal", + "exit_time": "2021-12-03T00:00:00", + "pnl": -8.42495886751749, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89304084668578, + "entry_time": "2021-12-05T00:00:00", + "exit_price": 91.94563028017612, + "exit_reason": "signal", + "exit_time": "2021-12-06T00:00:00", + "pnl": 5.258943349033871, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.70380536433252, + "entry_time": "2021-12-08T00:00:00", + "exit_price": 92.18321579529317, + "exit_reason": "signal", + "exit_time": "2021-12-09T00:00:00", + "pnl": 47.94104309606337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75634960957339, + "entry_time": "2021-12-11T00:00:00", + "exit_price": 92.99346542277752, + "exit_reason": "signal", + "exit_time": "2021-12-12T00:00:00", + "pnl": 23.711581320412733, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07784715364147, + "entry_time": "2021-12-14T00:00:00", + "exit_price": 92.82473368702337, + "exit_reason": "signal", + "exit_time": "2021-12-15T00:00:00", + "pnl": -25.311346661810603, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.80939097372557, + "entry_time": "2021-12-17T00:00:00", + "exit_price": 93.56855092683492, + "exit_reason": "signal", + "exit_time": "2021-12-18T00:00:00", + "pnl": -24.084004689064386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.22637736311736, + "entry_time": "2021-12-20T00:00:00", + "exit_price": 93.04989016451177, + "exit_reason": "signal", + "exit_time": "2021-12-21T00:00:00", + "pnl": -17.64871986056096, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06688407845617, + "entry_time": "2021-12-23T00:00:00", + "exit_price": 93.11481000895263, + "exit_reason": "signal", + "exit_time": "2021-12-24T00:00:00", + "pnl": 4.792593049645802, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27282277875311, + "entry_time": "2021-12-26T00:00:00", + "exit_price": 92.10549027383173, + "exit_reason": "signal", + "exit_time": "2021-12-27T00:00:00", + "pnl": -116.73325049213781, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02590143870165, + "entry_time": "2021-12-29T00:00:00", + "exit_price": 93.0111357952797, + "exit_reason": "signal", + "exit_time": "2021-12-30T00:00:00", + "pnl": 98.52343565780393, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.36789726372409, + "entry_time": "2022-01-01T00:00:00", + "exit_price": 91.16759918928896, + "exit_reason": "signal", + "exit_time": "2022-01-02T00:00:00", + "pnl": -20.029807443512254, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02364437811006, + "entry_time": "2022-01-04T00:00:00", + "exit_price": 91.64247835816664, + "exit_reason": "signal", + "exit_time": "2022-01-05T00:00:00", + "pnl": -38.11660199434118, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20232839714718, + "entry_time": "2022-01-07T00:00:00", + "exit_price": 92.51418676739564, + "exit_reason": "signal", + "exit_time": "2022-01-08T00:00:00", + "pnl": 31.185837024846478, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.81320041849361, + "entry_time": "2022-01-10T00:00:00", + "exit_price": 92.27166607324205, + "exit_reason": "signal", + "exit_time": "2022-01-11T00:00:00", + "pnl": 45.84656547484337, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.2545983932022, + "entry_time": "2022-01-13T00:00:00", + "exit_price": 91.97497228207648, + "exit_reason": "signal", + "exit_time": "2022-01-14T00:00:00", + "pnl": -27.962611112570812, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67780842750179, + "entry_time": "2022-01-16T00:00:00", + "exit_price": 91.45906966920411, + "exit_reason": "signal", + "exit_time": "2022-01-17T00:00:00", + "pnl": -21.873875829767712, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.76345480442126, + "entry_time": "2022-01-19T00:00:00", + "exit_price": 91.43197465037622, + "exit_reason": "signal", + "exit_time": "2022-01-20T00:00:00", + "pnl": -33.148015404503894, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3600604543369, + "entry_time": "2022-01-22T00:00:00", + "exit_price": 92.44350843545416, + "exit_reason": "signal", + "exit_time": "2022-01-23T00:00:00", + "pnl": 8.34479811172605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.39757672508603, + "entry_time": "2022-01-25T00:00:00", + "exit_price": 91.85230151275863, + "exit_reason": "signal", + "exit_time": "2022-01-26T00:00:00", + "pnl": 45.47247876726033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.81407145534195, + "entry_time": "2022-01-28T00:00:00", + "exit_price": 91.01128875382821, + "exit_reason": "signal", + "exit_time": "2022-01-29T00:00:00", + "pnl": 19.721729848626637, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.67591197573066, + "entry_time": "2022-01-31T00:00:00", + "exit_price": 90.51279666702179, + "exit_reason": "signal", + "exit_time": "2022-02-01T00:00:00", + "pnl": -116.31153087088569, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98461279621962, + "entry_time": "2022-02-03T00:00:00", + "exit_price": 91.18776220832692, + "exit_reason": "signal", + "exit_time": "2022-02-04T00:00:00", + "pnl": -79.68505878927135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.68365711276127, + "entry_time": "2022-02-06T00:00:00", + "exit_price": 92.52965334263803, + "exit_reason": "signal", + "exit_time": "2022-02-07T00:00:00", + "pnl": -15.400377012323588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97018528191016, + "entry_time": "2022-02-09T00:00:00", + "exit_price": 92.1704075246973, + "exit_reason": "signal", + "exit_time": "2022-02-10T00:00:00", + "pnl": 20.02222427871311, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.4092834971355, + "entry_time": "2022-02-12T00:00:00", + "exit_price": 91.80397108470675, + "exit_reason": "signal", + "exit_time": "2022-02-13T00:00:00", + "pnl": 39.468758757124306, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.7224658447326, + "entry_time": "2022-02-15T00:00:00", + "exit_price": 91.15638220769824, + "exit_reason": "signal", + "exit_time": "2022-02-16T00:00:00", + "pnl": -56.608363703435316, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.66063113797075, + "entry_time": "2022-02-18T00:00:00", + "exit_price": 91.93674170823937, + "exit_reason": "signal", + "exit_time": "2022-02-19T00:00:00", + "pnl": 27.61105702686109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.02426166276656, + "entry_time": "2022-02-21T00:00:00", + "exit_price": 92.2868521233569, + "exit_reason": "signal", + "exit_time": "2022-02-22T00:00:00", + "pnl": 126.2590460590327, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.06798590582005, + "entry_time": "2022-02-24T00:00:00", + "exit_price": 91.35136606041436, + "exit_reason": "signal", + "exit_time": "2022-02-25T00:00:00", + "pnl": 28.338015459430608, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.99746534424483, + "entry_time": "2022-02-27T00:00:00", + "exit_price": 91.56303029535638, + "exit_reason": "signal", + "exit_time": "2022-02-28T00:00:00", + "pnl": 56.55649511115553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.0942536160811, + "entry_time": "2022-03-02T00:00:00", + "exit_price": 91.42070005109457, + "exit_reason": "signal", + "exit_time": "2022-03-03T00:00:00", + "pnl": -67.35535649865233, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41089068186189, + "entry_time": "2022-03-05T00:00:00", + "exit_price": 90.18677881527823, + "exit_reason": "signal", + "exit_time": "2022-03-06T00:00:00", + "pnl": -122.4111866583662, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43901544778934, + "entry_time": "2022-03-08T00:00:00", + "exit_price": 91.5260369404649, + "exit_reason": "signal", + "exit_time": "2022-03-09T00:00:00", + "pnl": 8.702149267555797, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.01177208564718, + "entry_time": "2022-03-11T00:00:00", + "exit_price": 91.36159823018748, + "exit_reason": "signal", + "exit_time": "2022-03-12T00:00:00", + "pnl": 34.982614454031136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8208251198108, + "entry_time": "2022-03-14T00:00:00", + "exit_price": 91.28071492977152, + "exit_reason": "signal", + "exit_time": "2022-03-15T00:00:00", + "pnl": 45.988980996071405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.9250036260453, + "entry_time": "2022-03-17T00:00:00", + "exit_price": 90.6150063093046, + "exit_reason": "signal", + "exit_time": "2022-03-18T00:00:00", + "pnl": -130.99973167406824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.61363931969464, + "entry_time": "2022-03-20T00:00:00", + "exit_price": 90.38004154259693, + "exit_reason": "signal", + "exit_time": "2022-03-21T00:00:00", + "pnl": -23.35977770977297, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.96467806287603, + "entry_time": "2022-03-23T00:00:00", + "exit_price": 90.70041523761671, + "exit_reason": "signal", + "exit_time": "2022-03-24T00:00:00", + "pnl": -26.426282525932038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.62074541364396, + "entry_time": "2022-03-26T00:00:00", + "exit_price": 90.95651159207543, + "exit_reason": "signal", + "exit_time": "2022-03-27T00:00:00", + "pnl": 33.57661784314587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05267669381955, + "entry_time": "2022-03-29T00:00:00", + "exit_price": 91.69416855510607, + "exit_reason": "signal", + "exit_time": "2022-03-30T00:00:00", + "pnl": 64.14918612865222, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.8695133244266, + "entry_time": "2022-04-01T00:00:00", + "exit_price": 90.61012799594212, + "exit_reason": "signal", + "exit_time": "2022-04-02T00:00:00", + "pnl": -25.93853284844772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05464751490084, + "entry_time": "2022-04-04T00:00:00", + "exit_price": 90.46681240023963, + "exit_reason": "signal", + "exit_time": "2022-04-05T00:00:00", + "pnl": 41.216488533878874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.63067407291008, + "entry_time": "2022-04-07T00:00:00", + "exit_price": 89.96046847840074, + "exit_reason": "signal", + "exit_time": "2022-04-08T00:00:00", + "pnl": -67.02055945093343, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.56273021751427, + "entry_time": "2022-04-10T00:00:00", + "exit_price": 90.14638715063298, + "exit_reason": "signal", + "exit_time": "2022-04-11T00:00:00", + "pnl": -41.63430668812907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75859326793318, + "entry_time": "2022-04-13T00:00:00", + "exit_price": 90.97823499949781, + "exit_reason": "signal", + "exit_time": "2022-04-14T00:00:00", + "pnl": 121.96417315646431, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.15637756363428, + "entry_time": "2022-04-16T00:00:00", + "exit_price": 89.71453147899727, + "exit_reason": "signal", + "exit_time": "2022-04-17T00:00:00", + "pnl": -44.18460846370181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.00941330347686, + "entry_time": "2022-04-19T00:00:00", + "exit_price": 90.97249110306038, + "exit_reason": "signal", + "exit_time": "2022-04-20T00:00:00", + "pnl": 96.3077799583516, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.44900384555615, + "entry_time": "2022-04-22T00:00:00", + "exit_price": 90.26380626108603, + "exit_reason": "signal", + "exit_time": "2022-04-23T00:00:00", + "pnl": -18.519758447011554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9389490074607, + "entry_time": "2022-04-25T00:00:00", + "exit_price": 90.91676356991597, + "exit_reason": "signal", + "exit_time": "2022-04-26T00:00:00", + "pnl": 97.78145624552599, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.13685393625028, + "entry_time": "2022-04-28T00:00:00", + "exit_price": 90.92025914672816, + "exit_reason": "signal", + "exit_time": "2022-04-29T00:00:00", + "pnl": 78.34052104778675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.9636459548143, + "entry_time": "2022-05-01T00:00:00", + "exit_price": 90.9470309766908, + "exit_reason": "signal", + "exit_time": "2022-05-02T00:00:00", + "pnl": 98.3385021876511, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.23464868145118, + "entry_time": "2022-05-04T00:00:00", + "exit_price": 92.16095300836626, + "exit_reason": "signal", + "exit_time": "2022-05-05T00:00:00", + "pnl": 92.63043269150876, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.86371979002092, + "entry_time": "2022-05-07T00:00:00", + "exit_price": 90.1658806519524, + "exit_reason": "signal", + "exit_time": "2022-05-08T00:00:00", + "pnl": -69.78391380685025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80999909964301, + "entry_time": "2022-05-10T00:00:00", + "exit_price": 91.3916052906719, + "exit_reason": "signal", + "exit_time": "2022-05-11T00:00:00", + "pnl": 58.16061910288954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.79830122498419, + "entry_time": "2022-05-13T00:00:00", + "exit_price": 91.92464426243117, + "exit_reason": "signal", + "exit_time": "2022-05-14T00:00:00", + "pnl": 12.634303744698627, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.74084404129732, + "entry_time": "2022-05-16T00:00:00", + "exit_price": 91.77591195761288, + "exit_reason": "signal", + "exit_time": "2022-05-17T00:00:00", + "pnl": 3.5067916315565526, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129082151163, + "entry_time": "2022-05-19T00:00:00", + "exit_price": 91.29443539538282, + "exit_reason": "signal", + "exit_time": "2022-05-20T00:00:00", + "pnl": 16.535324421982295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.49821093674116, + "entry_time": "2022-05-22T00:00:00", + "exit_price": 90.52895961614624, + "exit_reason": "signal", + "exit_time": "2022-05-23T00:00:00", + "pnl": 103.07486794050783, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.50773769923417, + "entry_time": "2022-05-25T00:00:00", + "exit_price": 90.20586243304412, + "exit_reason": "signal", + "exit_time": "2022-05-26T00:00:00", + "pnl": -30.18752661900544, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.1593251595947, + "entry_time": "2022-05-28T00:00:00", + "exit_price": 90.8652392547076, + "exit_reason": "signal", + "exit_time": "2022-05-29T00:00:00", + "pnl": -29.408590488710615, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.88148378297518, + "entry_time": "2022-05-31T00:00:00", + "exit_price": 90.54298539634833, + "exit_reason": "signal", + "exit_time": "2022-06-01T00:00:00", + "pnl": 66.15016133731478, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.97268456538903, + "entry_time": "2022-06-03T00:00:00", + "exit_price": 91.62712854780935, + "exit_reason": "signal", + "exit_time": "2022-06-04T00:00:00", + "pnl": 65.44439824203255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.74146887774299, + "entry_time": "2022-06-06T00:00:00", + "exit_price": 90.42853595632805, + "exit_reason": "signal", + "exit_time": "2022-06-07T00:00:00", + "pnl": -31.29329214149402, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.84848168731004, + "entry_time": "2022-06-09T00:00:00", + "exit_price": 90.83668379255865, + "exit_reason": "signal", + "exit_time": "2022-06-10T00:00:00", + "pnl": -1.1797894751398417, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.47241973433749, + "entry_time": "2022-06-12T00:00:00", + "exit_price": 89.89842730786603, + "exit_reason": "signal", + "exit_time": "2022-06-13T00:00:00", + "pnl": -57.39924264714682, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.82455441317694, + "entry_time": "2022-06-15T00:00:00", + "exit_price": 90.16986826544031, + "exit_reason": "signal", + "exit_time": "2022-06-16T00:00:00", + "pnl": -65.46861477366292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.1811588929617, + "entry_time": "2022-06-18T00:00:00", + "exit_price": 90.09911654611165, + "exit_reason": "signal", + "exit_time": "2022-06-19T00:00:00", + "pnl": 91.79576531499515, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.55257557802233, + "entry_time": "2022-06-21T00:00:00", + "exit_price": 90.6008717295654, + "exit_reason": "signal", + "exit_time": "2022-06-22T00:00:00", + "pnl": 4.829615154307248, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.68671023186488, + "entry_time": "2022-06-24T00:00:00", + "exit_price": 89.96517472835333, + "exit_reason": "signal", + "exit_time": "2022-06-25T00:00:00", + "pnl": -72.15355035115317, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.05260562521785, + "entry_time": "2022-06-27T00:00:00", + "exit_price": 90.08006582461334, + "exit_reason": "signal", + "exit_time": "2022-06-28T00:00:00", + "pnl": 2.746019939548205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.79432064186736, + "entry_time": "2022-06-30T00:00:00", + "exit_price": 92.41108821991375, + "exit_reason": "signal", + "exit_time": "2022-07-01T00:00:00", + "pnl": 161.67675780463833, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87347025830266, + "entry_time": "2022-07-03T00:00:00", + "exit_price": 91.20564533828777, + "exit_reason": "signal", + "exit_time": "2022-07-04T00:00:00", + "pnl": 33.21750799850997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.30309517181773, + "entry_time": "2022-07-06T00:00:00", + "exit_price": 90.1406611037728, + "exit_reason": "signal", + "exit_time": "2022-07-07T00:00:00", + "pnl": -116.24340680449313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.24392591685461, + "entry_time": "2022-07-09T00:00:00", + "exit_price": 91.10896639776044, + "exit_reason": "signal", + "exit_time": "2022-07-10T00:00:00", + "pnl": 86.50404809058273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43429707485602, + "entry_time": "2022-07-12T00:00:00", + "exit_price": 90.99823744300166, + "exit_reason": "signal", + "exit_time": "2022-07-13T00:00:00", + "pnl": -43.60596318543685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51160983247296, + "entry_time": "2022-07-15T00:00:00", + "exit_price": 91.15695774047701, + "exit_reason": "signal", + "exit_time": "2022-07-16T00:00:00", + "pnl": 64.53479080040597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.25313076740179, + "entry_time": "2022-07-18T00:00:00", + "exit_price": 90.3503914171167, + "exit_reason": "signal", + "exit_time": "2022-07-19T00:00:00", + "pnl": -90.27393502850828, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47393608345517, + "entry_time": "2022-07-21T00:00:00", + "exit_price": 89.98751697992218, + "exit_reason": "signal", + "exit_time": "2022-07-22T00:00:00", + "pnl": -148.64191035329895, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.0545116492653, + "entry_time": "2022-07-24T00:00:00", + "exit_price": 91.01799823084976, + "exit_reason": "signal", + "exit_time": "2022-07-25T00:00:00", + "pnl": -103.65134184155431, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05081241841744, + "entry_time": "2022-07-27T00:00:00", + "exit_price": 91.31407916672543, + "exit_reason": "signal", + "exit_time": "2022-07-28T00:00:00", + "pnl": 26.326674830799675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.80885265421585, + "entry_time": "2022-07-30T00:00:00", + "exit_price": 91.15205975168703, + "exit_reason": "signal", + "exit_time": "2022-07-31T00:00:00", + "pnl": 34.32070974711678, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.47241880815605, + "entry_time": "2022-08-02T00:00:00", + "exit_price": 91.54172600484964, + "exit_reason": "signal", + "exit_time": "2022-08-03T00:00:00", + "pnl": 6.93071966935895, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.8976774720573, + "entry_time": "2022-08-05T00:00:00", + "exit_price": 91.58791087448299, + "exit_reason": "signal", + "exit_time": "2022-08-06T00:00:00", + "pnl": -30.976659757430753, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.02271267015783, + "entry_time": "2022-08-08T00:00:00", + "exit_price": 91.10459083951521, + "exit_reason": "signal", + "exit_time": "2022-08-09T00:00:00", + "pnl": -91.81218306426308, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24414870008319, + "entry_time": "2022-08-11T00:00:00", + "exit_price": 92.69109127617371, + "exit_reason": "signal", + "exit_time": "2022-08-12T00:00:00", + "pnl": 44.69425760905142, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.65306278042236, + "entry_time": "2022-08-14T00:00:00", + "exit_price": 92.39816620647916, + "exit_reason": "signal", + "exit_time": "2022-08-15T00:00:00", + "pnl": 74.51034260568122, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1810606061523, + "entry_time": "2022-08-17T00:00:00", + "exit_price": 92.49470462633181, + "exit_reason": "signal", + "exit_time": "2022-08-18T00:00:00", + "pnl": -68.63559798204915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01504374556126, + "entry_time": "2022-08-20T00:00:00", + "exit_price": 92.67904663244455, + "exit_reason": "signal", + "exit_time": "2022-08-21T00:00:00", + "pnl": 66.40028868832997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74908045175502, + "entry_time": "2022-08-23T00:00:00", + "exit_price": 93.28081352108578, + "exit_reason": "signal", + "exit_time": "2022-08-24T00:00:00", + "pnl": -46.826693066923326, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.72430502818085, + "entry_time": "2022-08-26T00:00:00", + "exit_price": 92.91000509633356, + "exit_reason": "signal", + "exit_time": "2022-08-27T00:00:00", + "pnl": -81.42999318472721, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0266388958905, + "entry_time": "2022-08-29T00:00:00", + "exit_price": 93.06932306108122, + "exit_reason": "signal", + "exit_time": "2022-08-30T00:00:00", + "pnl": 4.268416519071252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2669116718157, + "entry_time": "2022-09-01T00:00:00", + "exit_price": 93.31911690207038, + "exit_reason": "signal", + "exit_time": "2022-09-02T00:00:00", + "pnl": 5.220523025467628, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01378736632232, + "entry_time": "2022-09-04T00:00:00", + "exit_price": 92.69057272581715, + "exit_reason": "signal", + "exit_time": "2022-09-05T00:00:00", + "pnl": -32.321464050517534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86605080021333, + "entry_time": "2022-09-07T00:00:00", + "exit_price": 93.54829275642138, + "exit_reason": "signal", + "exit_time": "2022-09-08T00:00:00", + "pnl": 68.2241956208054, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.92761316198515, + "entry_time": "2022-09-10T00:00:00", + "exit_price": 92.07281692163534, + "exit_reason": "signal", + "exit_time": "2022-09-11T00:00:00", + "pnl": -185.4796240349824, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.2809228591007, + "entry_time": "2022-09-13T00:00:00", + "exit_price": 94.11130793179962, + "exit_reason": "signal", + "exit_time": "2022-09-14T00:00:00", + "pnl": -16.961492730108148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78210365621943, + "entry_time": "2022-09-16T00:00:00", + "exit_price": 94.99114272050637, + "exit_reason": "signal", + "exit_time": "2022-09-17T00:00:00", + "pnl": 20.903906428693517, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26603620619441, + "entry_time": "2022-09-19T00:00:00", + "exit_price": 95.26895473010688, + "exit_reason": "signal", + "exit_time": "2022-09-20T00:00:00", + "pnl": 100.29185239124672, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.88756691851471, + "entry_time": "2022-09-22T00:00:00", + "exit_price": 94.90535085923925, + "exit_reason": "signal", + "exit_time": "2022-09-23T00:00:00", + "pnl": 1.7783940724530112, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.86627784439669, + "entry_time": "2022-09-25T00:00:00", + "exit_price": 94.27678234231546, + "exit_reason": "signal", + "exit_time": "2022-09-26T00:00:00", + "pnl": -58.94955020812449, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21120724189035, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 93.62182381785365, + "exit_reason": "signal", + "exit_time": "2022-09-29T00:00:00", + "pnl": -58.938342403669594, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.70089986040492, + "entry_time": "2022-10-01T00:00:00", + "exit_price": 94.98061841891752, + "exit_reason": "signal", + "exit_time": "2022-10-02T00:00:00", + "pnl": 27.971855851259534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.63730668221625, + "entry_time": "2022-10-04T00:00:00", + "exit_price": 95.21809213108293, + "exit_reason": "signal", + "exit_time": "2022-10-05T00:00:00", + "pnl": 58.07854488666817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.62513446883317, + "entry_time": "2022-10-07T00:00:00", + "exit_price": 95.0550792423482, + "exit_reason": "signal", + "exit_time": "2022-10-08T00:00:00", + "pnl": 42.99447735150352, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71116560219859, + "entry_time": "2022-10-10T00:00:00", + "exit_price": 94.70112878957045, + "exit_reason": "signal", + "exit_time": "2022-10-11T00:00:00", + "pnl": 98.99631873718499, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22008595203475, + "entry_time": "2022-10-13T00:00:00", + "exit_price": 95.26583380518775, + "exit_reason": "signal", + "exit_time": "2022-10-14T00:00:00", + "pnl": 104.57478531530069, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84031644841893, + "entry_time": "2022-10-16T00:00:00", + "exit_price": 94.76253265375746, + "exit_reason": "signal", + "exit_time": "2022-10-17T00:00:00", + "pnl": -7.778379466146362, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.36921450181964, + "entry_time": "2022-10-19T00:00:00", + "exit_price": 94.38751561741323, + "exit_reason": "signal", + "exit_time": "2022-10-20T00:00:00", + "pnl": 101.83011155935856, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.7594276079707, + "entry_time": "2022-10-22T00:00:00", + "exit_price": 94.20505090808615, + "exit_reason": "signal", + "exit_time": "2022-10-23T00:00:00", + "pnl": -55.43766998845422, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01993010545006, + "entry_time": "2022-10-25T00:00:00", + "exit_price": 94.25253006691226, + "exit_reason": "signal", + "exit_time": "2022-10-26T00:00:00", + "pnl": -76.74000385377985, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.9292129294191, + "entry_time": "2022-10-28T00:00:00", + "exit_price": 95.45831791808807, + "exit_reason": "signal", + "exit_time": "2022-10-29T00:00:00", + "pnl": 52.91049886689689, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.01874761761506, + "entry_time": "2022-10-31T00:00:00", + "exit_price": 95.70179579177142, + "exit_reason": "signal", + "exit_time": "2022-11-01T00:00:00", + "pnl": 68.30481741563563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.45782648578765, + "entry_time": "2022-11-03T00:00:00", + "exit_price": 95.9654506293958, + "exit_reason": "signal", + "exit_time": "2022-11-04T00:00:00", + "pnl": -49.237585639184545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.69543160906309, + "entry_time": "2022-11-06T00:00:00", + "exit_price": 96.23626703373414, + "exit_reason": "signal", + "exit_time": "2022-11-07T00:00:00", + "pnl": 54.08354246710405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23730582460071, + "entry_time": "2022-11-09T00:00:00", + "exit_price": 94.58630669240723, + "exit_reason": "signal", + "exit_time": "2022-11-10T00:00:00", + "pnl": -65.09991321934831, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.24411442253736, + "entry_time": "2022-11-12T00:00:00", + "exit_price": 94.80412345904836, + "exit_reason": "signal", + "exit_time": "2022-11-13T00:00:00", + "pnl": -43.99909634890173, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.33266826608637, + "entry_time": "2022-11-15T00:00:00", + "exit_price": 94.08584208568091, + "exit_reason": "signal", + "exit_time": "2022-11-16T00:00:00", + "pnl": -24.682618040546004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20511704388718, + "entry_time": "2022-11-18T00:00:00", + "exit_price": 93.73586252939168, + "exit_reason": "signal", + "exit_time": "2022-11-19T00:00:00", + "pnl": -46.925451449549655, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6229802242446, + "entry_time": "2022-11-21T00:00:00", + "exit_price": 93.66558700926207, + "exit_reason": "signal", + "exit_time": "2022-11-22T00:00:00", + "pnl": -95.73932149825305, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74677062129318, + "entry_time": "2022-11-24T00:00:00", + "exit_price": 93.54017463980657, + "exit_reason": "signal", + "exit_time": "2022-11-25T00:00:00", + "pnl": -20.659598148660734, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.730138438308, + "entry_time": "2022-11-27T00:00:00", + "exit_price": 93.49572076787184, + "exit_reason": "signal", + "exit_time": "2022-11-28T00:00:00", + "pnl": -23.441767043615982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77203615539878, + "entry_time": "2022-11-30T00:00:00", + "exit_price": 92.91635203682458, + "exit_reason": "signal", + "exit_time": "2022-12-01T00:00:00", + "pnl": -85.56841185742087, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91294155802173, + "entry_time": "2022-12-03T00:00:00", + "exit_price": 92.85493736088272, + "exit_reason": "signal", + "exit_time": "2022-12-04T00:00:00", + "pnl": -105.80041971389983, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.07037492573126, + "entry_time": "2022-12-06T00:00:00", + "exit_price": 93.35918129576551, + "exit_reason": "signal", + "exit_time": "2022-12-07T00:00:00", + "pnl": -71.11936299657646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.21752684184962, + "entry_time": "2022-12-09T00:00:00", + "exit_price": 93.82182795562746, + "exit_reason": "signal", + "exit_time": "2022-12-10T00:00:00", + "pnl": 60.43011137778376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91554181329224, + "entry_time": "2022-12-12T00:00:00", + "exit_price": 93.2637454877203, + "exit_reason": "signal", + "exit_time": "2022-12-13T00:00:00", + "pnl": -65.17963255719405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.42377971468683, + "entry_time": "2022-12-15T00:00:00", + "exit_price": 92.9956096009709, + "exit_reason": "signal", + "exit_time": "2022-12-16T00:00:00", + "pnl": -42.81701137159325, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.95024629295155, + "entry_time": "2022-12-18T00:00:00", + "exit_price": 92.02384747382928, + "exit_reason": "signal", + "exit_time": "2022-12-19T00:00:00", + "pnl": -92.63988191222597, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.73848563922941, + "entry_time": "2022-12-21T00:00:00", + "exit_price": 91.78634727970504, + "exit_reason": "signal", + "exit_time": "2022-12-22T00:00:00", + "pnl": 104.78616404756394, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.46503843997183, + "entry_time": "2022-12-24T00:00:00", + "exit_price": 91.75198886376967, + "exit_reason": "signal", + "exit_time": "2022-12-25T00:00:00", + "pnl": 28.695042379784354, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.39876122857235, + "entry_time": "2022-12-27T00:00:00", + "exit_price": 92.11567284541557, + "exit_reason": "signal", + "exit_time": "2022-12-28T00:00:00", + "pnl": -28.30883831567735, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77091533493147, + "entry_time": "2022-12-30T00:00:00", + "exit_price": 93.3485194106044, + "exit_reason": "signal", + "exit_time": "2022-12-31T00:00:00", + "pnl": 57.76040756729344, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.04122370969267, + "entry_time": "2023-01-02T00:00:00", + "exit_price": 92.97807111210727, + "exit_reason": "signal", + "exit_time": "2023-01-03T00:00:00", + "pnl": 93.68474024146053, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82297627909733, + "entry_time": "2023-01-05T00:00:00", + "exit_price": 92.88908258807695, + "exit_reason": "signal", + "exit_time": "2023-01-06T00:00:00", + "pnl": 6.610630897961528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.02494822567454, + "entry_time": "2023-01-08T00:00:00", + "exit_price": 92.52813633390632, + "exit_reason": "signal", + "exit_time": "2023-01-09T00:00:00", + "pnl": -49.681189176822954, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77607586946252, + "entry_time": "2023-01-11T00:00:00", + "exit_price": 92.84906975105618, + "exit_reason": "signal", + "exit_time": "2023-01-12T00:00:00", + "pnl": 7.299388159366572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.10682536410768, + "entry_time": "2023-01-14T00:00:00", + "exit_price": 92.60098332710814, + "exit_reason": "signal", + "exit_time": "2023-01-15T00:00:00", + "pnl": -50.58420369995474, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.16477240647922, + "entry_time": "2023-01-17T00:00:00", + "exit_price": 93.64464350405021, + "exit_reason": "signal", + "exit_time": "2023-01-18T00:00:00", + "pnl": 47.98710975709764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34853961981467, + "entry_time": "2023-01-20T00:00:00", + "exit_price": 92.90164291858915, + "exit_reason": "signal", + "exit_time": "2023-01-21T00:00:00", + "pnl": 55.31032987744766, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52920571661875, + "entry_time": "2023-01-23T00:00:00", + "exit_price": 92.96718442791747, + "exit_reason": "signal", + "exit_time": "2023-01-24T00:00:00", + "pnl": -56.202128870127126, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1449985691514, + "entry_time": "2023-01-26T00:00:00", + "exit_price": 93.09214526901171, + "exit_reason": "signal", + "exit_time": "2023-01-27T00:00:00", + "pnl": -105.28533001396863, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08808617199072, + "entry_time": "2023-01-29T00:00:00", + "exit_price": 93.57735843418071, + "exit_reason": "signal", + "exit_time": "2023-01-30T00:00:00", + "pnl": -51.07277378100116, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.03374091329063, + "entry_time": "2023-02-01T00:00:00", + "exit_price": 92.67153521214688, + "exit_reason": "signal", + "exit_time": "2023-02-02T00:00:00", + "pnl": -136.2205701143739, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.90721494360177, + "entry_time": "2023-02-04T00:00:00", + "exit_price": 92.94800270723887, + "exit_reason": "signal", + "exit_time": "2023-02-05T00:00:00", + "pnl": 4.078776363709039, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.77341143396697, + "entry_time": "2023-02-07T00:00:00", + "exit_price": 93.16810608211969, + "exit_reason": "signal", + "exit_time": "2023-02-08T00:00:00", + "pnl": -60.53053518472916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.1295561924666, + "entry_time": "2023-02-10T00:00:00", + "exit_price": 93.6109897663897, + "exit_reason": "signal", + "exit_time": "2023-02-11T00:00:00", + "pnl": 48.143357392309554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09160273927316, + "entry_time": "2023-02-13T00:00:00", + "exit_price": 93.33166346007059, + "exit_reason": "signal", + "exit_time": "2023-02-14T00:00:00", + "pnl": -75.99392792025537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.53620789150742, + "entry_time": "2023-02-16T00:00:00", + "exit_price": 94.21568894504843, + "exit_reason": "signal", + "exit_time": "2023-02-17T00:00:00", + "pnl": -32.051894645899665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93343913761625, + "entry_time": "2023-02-19T00:00:00", + "exit_price": 94.02299067534886, + "exit_reason": "signal", + "exit_time": "2023-02-20T00:00:00", + "pnl": 8.955153773262282, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.18544500815403, + "entry_time": "2023-02-22T00:00:00", + "exit_price": 93.98907937476646, + "exit_reason": "signal", + "exit_time": "2023-02-23T00:00:00", + "pnl": -19.636563338757696, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45348785433026, + "entry_time": "2023-02-25T00:00:00", + "exit_price": 95.02085687929099, + "exit_reason": "signal", + "exit_time": "2023-02-26T00:00:00", + "pnl": 56.73690249607171, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.84830391916218, + "entry_time": "2023-02-28T00:00:00", + "exit_price": 94.43699045607909, + "exit_reason": "signal", + "exit_time": "2023-03-01T00:00:00", + "pnl": -41.13134630830791, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.95759166912262, + "entry_time": "2023-03-03T00:00:00", + "exit_price": 93.47551491598016, + "exit_reason": "signal", + "exit_time": "2023-03-04T00:00:00", + "pnl": -48.20767531424826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66498305754212, + "entry_time": "2023-03-06T00:00:00", + "exit_price": 93.36643618283398, + "exit_reason": "signal", + "exit_time": "2023-03-07T00:00:00", + "pnl": -29.854687470813587, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3496449568648, + "entry_time": "2023-03-09T00:00:00", + "exit_price": 93.06229907806569, + "exit_reason": "signal", + "exit_time": "2023-03-10T00:00:00", + "pnl": -28.734587879909668, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.93784310790696, + "entry_time": "2023-03-12T00:00:00", + "exit_price": 92.96780942003683, + "exit_reason": "signal", + "exit_time": "2023-03-13T00:00:00", + "pnl": -97.00336878701273, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88445131540618, + "entry_time": "2023-03-15T00:00:00", + "exit_price": 94.08186481058257, + "exit_reason": "signal", + "exit_time": "2023-03-16T00:00:00", + "pnl": 19.74134951763881, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20796655389181, + "entry_time": "2023-03-18T00:00:00", + "exit_price": 91.9654081254928, + "exit_reason": "signal", + "exit_time": "2023-03-19T00:00:00", + "pnl": -24.25584283990065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.49393791749024, + "entry_time": "2023-03-21T00:00:00", + "exit_price": 92.05007592523164, + "exit_reason": "signal", + "exit_time": "2023-03-22T00:00:00", + "pnl": -44.386199225860764, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.84518996211608, + "entry_time": "2023-03-24T00:00:00", + "exit_price": 92.32190345568543, + "exit_reason": "signal", + "exit_time": "2023-03-25T00:00:00", + "pnl": 47.671349356935025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32827178627502, + "entry_time": "2023-03-27T00:00:00", + "exit_price": 93.26562867244172, + "exit_reason": "signal", + "exit_time": "2023-03-28T00:00:00", + "pnl": -6.264311383329186, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9489490131078, + "entry_time": "2023-03-30T00:00:00", + "exit_price": 93.54756230484855, + "exit_reason": "signal", + "exit_time": "2023-03-31T00:00:00", + "pnl": 59.861329174074854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.52695826109523, + "entry_time": "2023-04-02T00:00:00", + "exit_price": 93.16120912048845, + "exit_reason": "signal", + "exit_time": "2023-04-03T00:00:00", + "pnl": -36.57491406067675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73109278013733, + "entry_time": "2023-04-05T00:00:00", + "exit_price": 92.12967158946792, + "exit_reason": "signal", + "exit_time": "2023-04-06T00:00:00", + "pnl": -60.14211906694072, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66144197243285, + "entry_time": "2023-04-08T00:00:00", + "exit_price": 92.35105870140517, + "exit_reason": "signal", + "exit_time": "2023-04-09T00:00:00", + "pnl": -31.038327102769472, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32497954050243, + "entry_time": "2023-04-11T00:00:00", + "exit_price": 92.404028525945, + "exit_reason": "signal", + "exit_time": "2023-04-12T00:00:00", + "pnl": -92.09510145574313, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5596224194739, + "entry_time": "2023-04-14T00:00:00", + "exit_price": 93.06373732644884, + "exit_reason": "signal", + "exit_time": "2023-04-15T00:00:00", + "pnl": 50.41149069749554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82924854494932, + "entry_time": "2023-04-17T00:00:00", + "exit_price": 92.63616550173667, + "exit_reason": "signal", + "exit_time": "2023-04-18T00:00:00", + "pnl": -19.308304321264586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79933273190036, + "entry_time": "2023-04-20T00:00:00", + "exit_price": 92.95120755426662, + "exit_reason": "signal", + "exit_time": "2023-04-21T00:00:00", + "pnl": 15.187482236626238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56403816854014, + "entry_time": "2023-04-23T00:00:00", + "exit_price": 92.35426808914588, + "exit_reason": "signal", + "exit_time": "2023-04-24T00:00:00", + "pnl": -20.977007939425675, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35865607168631, + "entry_time": "2023-04-26T00:00:00", + "exit_price": 92.90482034285156, + "exit_reason": "signal", + "exit_time": "2023-04-27T00:00:00", + "pnl": -45.3835728834747, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.9985787957225, + "entry_time": "2023-04-29T00:00:00", + "exit_price": 92.8768940380532, + "exit_reason": "signal", + "exit_time": "2023-04-30T00:00:00", + "pnl": -12.168475766929987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86502942650776, + "entry_time": "2023-05-02T00:00:00", + "exit_price": 92.82867955654159, + "exit_reason": "signal", + "exit_time": "2023-05-03T00:00:00", + "pnl": -3.634986996616135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06669061925808, + "entry_time": "2023-05-05T00:00:00", + "exit_price": 93.05805100493505, + "exit_reason": "signal", + "exit_time": "2023-05-06T00:00:00", + "pnl": -0.8639614323019487, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.19478081630376, + "entry_time": "2023-05-08T00:00:00", + "exit_price": 92.4726753044577, + "exit_reason": "signal", + "exit_time": "2023-05-09T00:00:00", + "pnl": -72.21055118460572, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.87741920594638, + "entry_time": "2023-05-11T00:00:00", + "exit_price": 93.47630925649874, + "exit_reason": "signal", + "exit_time": "2023-05-12T00:00:00", + "pnl": 159.88900505523452, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.67940992744533, + "entry_time": "2023-05-14T00:00:00", + "exit_price": 93.83387030747774, + "exit_reason": "signal", + "exit_time": "2023-05-15T00:00:00", + "pnl": 115.44603800323966, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.77541066961662, + "entry_time": "2023-05-17T00:00:00", + "exit_price": 93.21806909335821, + "exit_reason": "signal", + "exit_time": "2023-05-18T00:00:00", + "pnl": 44.26584237415955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2116719393634, + "entry_time": "2023-05-20T00:00:00", + "exit_price": 93.63189068076446, + "exit_reason": "signal", + "exit_time": "2023-05-21T00:00:00", + "pnl": 42.021874140105865, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.31676028980675, + "entry_time": "2023-05-23T00:00:00", + "exit_price": 93.96917376263126, + "exit_reason": "signal", + "exit_time": "2023-05-24T00:00:00", + "pnl": 65.24134728245008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.3332407570871, + "entry_time": "2023-05-26T00:00:00", + "exit_price": 94.63597205774145, + "exit_reason": "signal", + "exit_time": "2023-05-27T00:00:00", + "pnl": 30.273130065435907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.00130198273087, + "entry_time": "2023-05-29T00:00:00", + "exit_price": 94.05926832590498, + "exit_reason": "signal", + "exit_time": "2023-05-30T00:00:00", + "pnl": 5.79663431741028, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76190103073331, + "entry_time": "2023-06-01T00:00:00", + "exit_price": 94.24963627943364, + "exit_reason": "signal", + "exit_time": "2023-06-02T00:00:00", + "pnl": 148.77352487003373, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.73904226779082, + "entry_time": "2023-06-04T00:00:00", + "exit_price": 94.53198582108524, + "exit_reason": "signal", + "exit_time": "2023-06-05T00:00:00", + "pnl": -20.705644670559195, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.29391446442062, + "entry_time": "2023-06-07T00:00:00", + "exit_price": 94.60323551607766, + "exit_reason": "signal", + "exit_time": "2023-06-08T00:00:00", + "pnl": 30.932105165702524, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.17535379161295, + "entry_time": "2023-06-10T00:00:00", + "exit_price": 94.95745054254392, + "exit_reason": "signal", + "exit_time": "2023-06-11T00:00:00", + "pnl": 78.20967509309776, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.65432843266518, + "entry_time": "2023-06-13T00:00:00", + "exit_price": 94.33856790601594, + "exit_reason": "signal", + "exit_time": "2023-06-14T00:00:00", + "pnl": -31.576052664924646, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.36956060356385, + "entry_time": "2023-06-16T00:00:00", + "exit_price": 95.2507487739047, + "exit_reason": "signal", + "exit_time": "2023-06-17T00:00:00", + "pnl": 88.11881703408471, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.98092766917739, + "entry_time": "2023-06-19T00:00:00", + "exit_price": 94.16338627425559, + "exit_reason": "signal", + "exit_time": "2023-06-20T00:00:00", + "pnl": -81.75413949218091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.95283790294347, + "entry_time": "2023-06-22T00:00:00", + "exit_price": 94.37363985497257, + "exit_reason": "signal", + "exit_time": "2023-06-23T00:00:00", + "pnl": -57.919804797089455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.41734797456819, + "entry_time": "2023-06-25T00:00:00", + "exit_price": 94.46879833485087, + "exit_reason": "signal", + "exit_time": "2023-06-26T00:00:00", + "pnl": 5.145036028268805, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.89779171625212, + "entry_time": "2023-06-28T00:00:00", + "exit_price": 94.56566914846213, + "exit_reason": "signal", + "exit_time": "2023-06-29T00:00:00", + "pnl": 66.78774322100071, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.12295330761387, + "entry_time": "2023-07-01T00:00:00", + "exit_price": 94.47229523041987, + "exit_reason": "signal", + "exit_time": "2023-07-02T00:00:00", + "pnl": 34.934192280601565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.01642931045993, + "entry_time": "2023-07-04T00:00:00", + "exit_price": 94.97899403484826, + "exit_reason": "signal", + "exit_time": "2023-07-05T00:00:00", + "pnl": 96.25647243883213, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29040521639678, + "entry_time": "2023-07-07T00:00:00", + "exit_price": 94.62958711128005, + "exit_reason": "signal", + "exit_time": "2023-07-08T00:00:00", + "pnl": -66.0818105116723, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94114223449, + "entry_time": "2023-07-10T00:00:00", + "exit_price": 94.38592136937638, + "exit_reason": "signal", + "exit_time": "2023-07-11T00:00:00", + "pnl": -55.52208651136243, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493222435549, + "entry_time": "2023-07-13T00:00:00", + "exit_price": 94.3474523152517, + "exit_reason": "signal", + "exit_time": "2023-07-14T00:00:00", + "pnl": -14.577012029729303, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.84805377401344, + "entry_time": "2023-07-16T00:00:00", + "exit_price": 93.24313248176318, + "exit_reason": "signal", + "exit_time": "2023-07-17T00:00:00", + "pnl": -60.492129225025565, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23716867785055, + "entry_time": "2023-07-19T00:00:00", + "exit_price": 94.3344550507391, + "exit_reason": "signal", + "exit_time": "2023-07-20T00:00:00", + "pnl": 109.72863728885386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.25058017257405, + "entry_time": "2023-07-22T00:00:00", + "exit_price": 94.26148603669161, + "exit_reason": "signal", + "exit_time": "2023-07-23T00:00:00", + "pnl": 1.090586411755794, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.78124566715694, + "entry_time": "2023-07-25T00:00:00", + "exit_price": 93.30392352510412, + "exit_reason": "signal", + "exit_time": "2023-07-26T00:00:00", + "pnl": -147.7322142052817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05471403229689, + "entry_time": "2023-07-28T00:00:00", + "exit_price": 93.26889976544973, + "exit_reason": "signal", + "exit_time": "2023-07-29T00:00:00", + "pnl": -78.58142668471555, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.97149252732743, + "entry_time": "2023-07-31T00:00:00", + "exit_price": 92.49652862514738, + "exit_reason": "signal", + "exit_time": "2023-08-01T00:00:00", + "pnl": -147.4963902180043, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49761686858754, + "entry_time": "2023-08-03T00:00:00", + "exit_price": 93.96133483843103, + "exit_reason": "signal", + "exit_time": "2023-08-04T00:00:00", + "pnl": 46.3717969843492, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.60373115569557, + "entry_time": "2023-08-06T00:00:00", + "exit_price": 94.43278823558683, + "exit_reason": "signal", + "exit_time": "2023-08-07T00:00:00", + "pnl": 82.90570798912631, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.216186422251, + "entry_time": "2023-08-09T00:00:00", + "exit_price": 93.22790913521419, + "exit_reason": "signal", + "exit_time": "2023-08-10T00:00:00", + "pnl": -98.8277287036799, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.5392105794396, + "entry_time": "2023-08-12T00:00:00", + "exit_price": 93.3857390941578, + "exit_reason": "signal", + "exit_time": "2023-08-13T00:00:00", + "pnl": -115.3471485281807, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.0337408175209, + "entry_time": "2023-08-15T00:00:00", + "exit_price": 94.39823678210567, + "exit_reason": "signal", + "exit_time": "2023-08-16T00:00:00", + "pnl": 136.44959645847666, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.08940418013472, + "entry_time": "2023-08-18T00:00:00", + "exit_price": 92.65920217896303, + "exit_reason": "signal", + "exit_time": "2023-08-19T00:00:00", + "pnl": -143.02020011716922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.39853539402684, + "entry_time": "2023-08-21T00:00:00", + "exit_price": 93.65048655775455, + "exit_reason": "signal", + "exit_time": "2023-08-22T00:00:00", + "pnl": 25.195116372769917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.79873760769597, + "entry_time": "2023-08-24T00:00:00", + "exit_price": 93.68828575617101, + "exit_reason": "signal", + "exit_time": "2023-08-25T00:00:00", + "pnl": 88.95481484750417, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87251964203307, + "entry_time": "2023-08-27T00:00:00", + "exit_price": 93.5300255114375, + "exit_reason": "signal", + "exit_time": "2023-08-28T00:00:00", + "pnl": -34.2494130595569, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.79086592344467, + "entry_time": "2023-08-30T00:00:00", + "exit_price": 92.57270931229704, + "exit_reason": "signal", + "exit_time": "2023-08-31T00:00:00", + "pnl": -121.81566111476423, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88859692291733, + "entry_time": "2023-09-02T00:00:00", + "exit_price": 93.80271734344691, + "exit_reason": "signal", + "exit_time": "2023-09-03T00:00:00", + "pnl": -8.587957947042014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.04073002158317, + "entry_time": "2023-09-05T00:00:00", + "exit_price": 94.46828834544144, + "exit_reason": "signal", + "exit_time": "2023-09-06T00:00:00", + "pnl": 142.75583238582658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23692924750448, + "entry_time": "2023-09-08T00:00:00", + "exit_price": 94.43771978777833, + "exit_reason": "signal", + "exit_time": "2023-09-09T00:00:00", + "pnl": 20.0790540273847, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.09517649815284, + "entry_time": "2023-09-11T00:00:00", + "exit_price": 94.97835234626153, + "exit_reason": "signal", + "exit_time": "2023-09-12T00:00:00", + "pnl": 88.31758481086945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.79133291522645, + "entry_time": "2023-09-14T00:00:00", + "exit_price": 94.02945945000636, + "exit_reason": "signal", + "exit_time": "2023-09-15T00:00:00", + "pnl": -76.18734652200874, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45235296621496, + "entry_time": "2023-09-17T00:00:00", + "exit_price": 94.63061442838703, + "exit_reason": "signal", + "exit_time": "2023-09-18T00:00:00", + "pnl": 17.82614621720677, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.1729530420449, + "entry_time": "2023-09-20T00:00:00", + "exit_price": 93.58327824763774, + "exit_reason": "signal", + "exit_time": "2023-09-21T00:00:00", + "pnl": -58.96747944071649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53629152727201, + "entry_time": "2023-09-23T00:00:00", + "exit_price": 93.30651397849368, + "exit_reason": "signal", + "exit_time": "2023-09-24T00:00:00", + "pnl": -22.977754877832922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.69842586893596, + "entry_time": "2023-09-26T00:00:00", + "exit_price": 93.16248763742118, + "exit_reason": "signal", + "exit_time": "2023-09-27T00:00:00", + "pnl": -53.59382315147741, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.49605102540508, + "entry_time": "2023-09-29T00:00:00", + "exit_price": 94.25313944944546, + "exit_reason": "signal", + "exit_time": "2023-09-30T00:00:00", + "pnl": 75.70884240403757, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.8421663218519, + "entry_time": "2023-10-02T00:00:00", + "exit_price": 92.97561455613513, + "exit_reason": "signal", + "exit_time": "2023-10-03T00:00:00", + "pnl": 13.344823428322343, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.01878568439928, + "entry_time": "2023-10-05T00:00:00", + "exit_price": 92.7731623418128, + "exit_reason": "signal", + "exit_time": "2023-10-06T00:00:00", + "pnl": -24.562334258647752, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.3031103300392, + "entry_time": "2023-10-08T00:00:00", + "exit_price": 92.82895908639827, + "exit_reason": "signal", + "exit_time": "2023-10-09T00:00:00", + "pnl": -47.41512436409357, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.34460637435383, + "entry_time": "2023-10-11T00:00:00", + "exit_price": 92.32181327562058, + "exit_reason": "signal", + "exit_time": "2023-10-12T00:00:00", + "pnl": -2.2793098733236548, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.52607935640549, + "entry_time": "2023-10-14T00:00:00", + "exit_price": 92.2357948297768, + "exit_reason": "signal", + "exit_time": "2023-10-15T00:00:00", + "pnl": 70.97154733712887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.68746434551585, + "entry_time": "2023-10-17T00:00:00", + "exit_price": 91.58592175261929, + "exit_reason": "signal", + "exit_time": "2023-10-18T00:00:00", + "pnl": -10.154259289656693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.4669708006904, + "entry_time": "2023-10-20T00:00:00", + "exit_price": 91.654447961068, + "exit_reason": "signal", + "exit_time": "2023-10-21T00:00:00", + "pnl": 18.747716037760256, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.3612670935331, + "entry_time": "2023-10-23T00:00:00", + "exit_price": 91.01031054901587, + "exit_reason": "signal", + "exit_time": "2023-10-24T00:00:00", + "pnl": -135.09565445172302, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.37919304454006, + "entry_time": "2023-10-26T00:00:00", + "exit_price": 91.41169786096938, + "exit_reason": "signal", + "exit_time": "2023-10-27T00:00:00", + "pnl": -96.74951835706815, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.29381617044329, + "entry_time": "2023-10-29T00:00:00", + "exit_price": 90.70386499802939, + "exit_reason": "signal", + "exit_time": "2023-10-30T00:00:00", + "pnl": -58.9951172413912, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.42981226133158, + "entry_time": "2023-11-01T00:00:00", + "exit_price": 91.13311787546733, + "exit_reason": "signal", + "exit_time": "2023-11-02T00:00:00", + "pnl": -29.669438586422984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.41698336938475, + "entry_time": "2023-11-04T00:00:00", + "exit_price": 91.39366908316057, + "exit_reason": "signal", + "exit_time": "2023-11-05T00:00:00", + "pnl": -2.3314286224194802, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.89356698837386, + "entry_time": "2023-11-07T00:00:00", + "exit_price": 91.60226357609555, + "exit_reason": "signal", + "exit_time": "2023-11-08T00:00:00", + "pnl": -29.130341227830286, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.41574363121151, + "entry_time": "2023-11-10T00:00:00", + "exit_price": 91.77307124686526, + "exit_reason": "signal", + "exit_time": "2023-11-11T00:00:00", + "pnl": -64.26723843462605, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.32527272706531, + "entry_time": "2023-11-13T00:00:00", + "exit_price": 94.02617500869306, + "exit_reason": "signal", + "exit_time": "2023-11-14T00:00:00", + "pnl": 170.09022816277502, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94533987249052, + "entry_time": "2023-11-16T00:00:00", + "exit_price": 92.0185892574846, + "exit_reason": "signal", + "exit_time": "2023-11-17T00:00:00", + "pnl": -92.67506150059126, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.30963127571127, + "entry_time": "2023-11-19T00:00:00", + "exit_price": 92.25489319248068, + "exit_reason": "signal", + "exit_time": "2023-11-20T00:00:00", + "pnl": -5.47380832305862, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74391567498765, + "entry_time": "2023-11-22T00:00:00", + "exit_price": 93.20889480054281, + "exit_reason": "signal", + "exit_time": "2023-11-23T00:00:00", + "pnl": 46.49791255551463, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.11263111652507, + "entry_time": "2023-11-25T00:00:00", + "exit_price": 93.10139698703692, + "exit_reason": "signal", + "exit_time": "2023-11-26T00:00:00", + "pnl": -101.1234129488148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.71015543952899, + "entry_time": "2023-11-28T00:00:00", + "exit_price": 92.47583632063913, + "exit_reason": "signal", + "exit_time": "2023-11-29T00:00:00", + "pnl": -123.43191188898527, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.75986386635343, + "entry_time": "2023-12-01T00:00:00", + "exit_price": 94.27037620813209, + "exit_reason": "signal", + "exit_time": "2023-12-02T00:00:00", + "pnl": 151.05123417786672, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.44774661355898, + "entry_time": "2023-12-04T00:00:00", + "exit_price": 93.99875783176927, + "exit_reason": "signal", + "exit_time": "2023-12-05T00:00:00", + "pnl": 55.101121821029665, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.58344310898, + "entry_time": "2023-12-07T00:00:00", + "exit_price": 94.14439051922356, + "exit_reason": "signal", + "exit_time": "2023-12-08T00:00:00", + "pnl": 56.094741024355244, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.54039819515216, + "entry_time": "2023-12-10T00:00:00", + "exit_price": 92.9236778577475, + "exit_reason": "signal", + "exit_time": "2023-12-11T00:00:00", + "pnl": 38.32796625953415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.05584126819757, + "entry_time": "2023-12-13T00:00:00", + "exit_price": 93.35601781114134, + "exit_reason": "signal", + "exit_time": "2023-12-14T00:00:00", + "pnl": 130.01765429437728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.81351651597147, + "entry_time": "2023-12-16T00:00:00", + "exit_price": 92.84701543791368, + "exit_reason": "signal", + "exit_time": "2023-12-17T00:00:00", + "pnl": 3.3498921942209563, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72332949821384, + "entry_time": "2023-12-19T00:00:00", + "exit_price": 92.51107159043487, + "exit_reason": "signal", + "exit_time": "2023-12-20T00:00:00", + "pnl": -21.22579077789851, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.91369044105626, + "entry_time": "2023-12-22T00:00:00", + "exit_price": 93.12129104458734, + "exit_reason": "signal", + "exit_time": "2023-12-23T00:00:00", + "pnl": -79.2399396468918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.14884637460803, + "entry_time": "2023-12-25T00:00:00", + "exit_price": 92.89417488264915, + "exit_reason": "signal", + "exit_time": "2023-12-26T00:00:00", + "pnl": 74.53285080411297, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.12845985022912, + "entry_time": "2023-12-28T00:00:00", + "exit_price": 93.6597993052993, + "exit_reason": "signal", + "exit_time": "2023-12-29T00:00:00", + "pnl": 53.133945507017415, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.96178874818798, + "entry_time": "2023-12-31T00:00:00", + "exit_price": 94.4511703887473, + "exit_reason": "signal", + "exit_time": "2024-01-01T00:00:00", + "pnl": 48.93816405593134, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.89229345893365, + "entry_time": "2024-01-03T00:00:00", + "exit_price": 94.58860576042824, + "exit_reason": "signal", + "exit_time": "2024-01-04T00:00:00", + "pnl": -30.368769850541867, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.04178116383622, + "entry_time": "2024-01-06T00:00:00", + "exit_price": 94.4578576609693, + "exit_reason": "signal", + "exit_time": "2024-01-07T00:00:00", + "pnl": -58.39235028669282, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.86053478009173, + "entry_time": "2024-01-09T00:00:00", + "exit_price": 94.76430023458303, + "exit_reason": "signal", + "exit_time": "2024-01-10T00:00:00", + "pnl": -9.62345455087052, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8053175522895, + "entry_time": "2024-01-12T00:00:00", + "exit_price": 94.40836408730765, + "exit_reason": "signal", + "exit_time": "2024-01-13T00:00:00", + "pnl": -39.695346498183426, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.85612524977265, + "entry_time": "2024-01-15T00:00:00", + "exit_price": 94.40863693697362, + "exit_reason": "signal", + "exit_time": "2024-01-16T00:00:00", + "pnl": -44.74883127990324, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.09196518919534, + "entry_time": "2024-01-18T00:00:00", + "exit_price": 94.91994528712154, + "exit_reason": "signal", + "exit_time": "2024-01-19T00:00:00", + "pnl": -17.20199020738073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.4574772984541, + "entry_time": "2024-01-21T00:00:00", + "exit_price": 95.40486331313025, + "exit_reason": "signal", + "exit_time": "2024-01-22T00:00:00", + "pnl": -5.261398532384192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8856295626394, + "entry_time": "2024-01-24T00:00:00", + "exit_price": 95.41673292493975, + "exit_reason": "signal", + "exit_time": "2024-01-25T00:00:00", + "pnl": 53.11033623003641, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.3011515367656, + "entry_time": "2024-01-27T00:00:00", + "exit_price": 94.50993042362319, + "exit_reason": "signal", + "exit_time": "2024-01-28T00:00:00", + "pnl": -79.12211131424192, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.8443544450889, + "entry_time": "2024-01-30T00:00:00", + "exit_price": 94.58646684173618, + "exit_reason": "signal", + "exit_time": "2024-01-31T00:00:00", + "pnl": -25.788760335271945, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.51863942815191, + "entry_time": "2024-02-02T00:00:00", + "exit_price": 95.02582579018504, + "exit_reason": "signal", + "exit_time": "2024-02-03T00:00:00", + "pnl": -49.28136379668649, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.64624335712315, + "entry_time": "2024-02-05T00:00:00", + "exit_price": 95.62478266594604, + "exit_reason": "signal", + "exit_time": "2024-02-06T00:00:00", + "pnl": -2.1460691177107947, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.97351592845855, + "entry_time": "2024-02-08T00:00:00", + "exit_price": 96.2565162152012, + "exit_reason": "signal", + "exit_time": "2024-02-09T00:00:00", + "pnl": 128.3000286742663, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.32379857764126, + "entry_time": "2024-02-11T00:00:00", + "exit_price": 93.96151236382953, + "exit_reason": "signal", + "exit_time": "2024-02-12T00:00:00", + "pnl": -36.22862138117307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.38409820559012, + "entry_time": "2024-02-14T00:00:00", + "exit_price": 94.76791246698865, + "exit_reason": "signal", + "exit_time": "2024-02-15T00:00:00", + "pnl": 38.38142613985292, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.15204268625024, + "entry_time": "2024-02-17T00:00:00", + "exit_price": 94.14536275879573, + "exit_reason": "signal", + "exit_time": "2024-02-18T00:00:00", + "pnl": -100.66799274545156, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.92555424660308, + "entry_time": "2024-02-20T00:00:00", + "exit_price": 95.28378367357755, + "exit_reason": "signal", + "exit_time": "2024-02-21T00:00:00", + "pnl": 35.822942697446706, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.6447277617356, + "entry_time": "2024-02-23T00:00:00", + "exit_price": 93.94359099606793, + "exit_reason": "signal", + "exit_time": "2024-02-24T00:00:00", + "pnl": -70.11367656676703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.63169426987818, + "entry_time": "2024-02-26T00:00:00", + "exit_price": 93.61709548381037, + "exit_reason": "signal", + "exit_time": "2024-02-27T00:00:00", + "pnl": -101.45987860678179, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.99406223655019, + "entry_time": "2024-02-29T00:00:00", + "exit_price": 93.51586581649707, + "exit_reason": "signal", + "exit_time": "2024-03-01T00:00:00", + "pnl": 52.18035799468635, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88355978598187, + "entry_time": "2024-03-03T00:00:00", + "exit_price": 93.59210068726338, + "exit_reason": "signal", + "exit_time": "2024-03-04T00:00:00", + "pnl": 70.85409012815035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.20766791171343, + "entry_time": "2024-03-06T00:00:00", + "exit_price": 93.03526629028748, + "exit_reason": "signal", + "exit_time": "2024-03-07T00:00:00", + "pnl": -17.24016214259609, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73917319444821, + "entry_time": "2024-03-09T00:00:00", + "exit_price": 93.21019311262798, + "exit_reason": "signal", + "exit_time": "2024-03-10T00:00:00", + "pnl": -52.89800818202275, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87224010683995, + "entry_time": "2024-03-12T00:00:00", + "exit_price": 93.42438731231145, + "exit_reason": "signal", + "exit_time": "2024-03-13T00:00:00", + "pnl": -44.78527945284986, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.32218202085551, + "entry_time": "2024-03-15T00:00:00", + "exit_price": 92.84840341954816, + "exit_reason": "signal", + "exit_time": "2024-03-16T00:00:00", + "pnl": -47.377860130734916, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.74542752078266, + "entry_time": "2024-03-18T00:00:00", + "exit_price": 93.97099698374726, + "exit_reason": "signal", + "exit_time": "2024-03-19T00:00:00", + "pnl": 22.55694629646132, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5673298293271, + "entry_time": "2024-03-21T00:00:00", + "exit_price": 90.9938401219299, + "exit_reason": "signal", + "exit_time": "2024-03-22T00:00:00", + "pnl": -157.34897073972024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89305134977978, + "entry_time": "2024-03-24T00:00:00", + "exit_price": 92.62217998545916, + "exit_reason": "signal", + "exit_time": "2024-03-25T00:00:00", + "pnl": -27.087136432062835, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.36509094658045, + "entry_time": "2024-03-27T00:00:00", + "exit_price": 92.88634389481254, + "exit_reason": "signal", + "exit_time": "2024-03-28T00:00:00", + "pnl": 52.125294823208606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.09706919037085, + "entry_time": "2024-03-30T00:00:00", + "exit_price": 92.26411816919232, + "exit_reason": "signal", + "exit_time": "2024-03-31T00:00:00", + "pnl": -83.29510211785237, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87466770876313, + "entry_time": "2024-04-02T00:00:00", + "exit_price": 92.60479889553623, + "exit_reason": "signal", + "exit_time": "2024-04-03T00:00:00", + "pnl": -26.986881322687623, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.20308651861096, + "entry_time": "2024-04-05T00:00:00", + "exit_price": 92.03254850546956, + "exit_reason": "signal", + "exit_time": "2024-04-06T00:00:00", + "pnl": -17.05380131413949, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.38853458659054, + "entry_time": "2024-04-08T00:00:00", + "exit_price": 92.15112623454131, + "exit_reason": "signal", + "exit_time": "2024-04-09T00:00:00", + "pnl": -23.740835204922405, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96842409215192, + "entry_time": "2024-04-11T00:00:00", + "exit_price": 91.88812859002927, + "exit_reason": "signal", + "exit_time": "2024-04-12T00:00:00", + "pnl": -8.029550212266258, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.24664780939709, + "entry_time": "2024-04-14T00:00:00", + "exit_price": 92.55850895917358, + "exit_reason": "signal", + "exit_time": "2024-04-15T00:00:00", + "pnl": 31.186114977648685, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.87161322114831, + "entry_time": "2024-04-17T00:00:00", + "exit_price": 92.00535793552656, + "exit_reason": "signal", + "exit_time": "2024-04-18T00:00:00", + "pnl": -86.62552856217553, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.4480286140058, + "entry_time": "2024-04-20T00:00:00", + "exit_price": 93.06090359266081, + "exit_reason": "signal", + "exit_time": "2024-04-21T00:00:00", + "pnl": 61.28749786549997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.86729712174954, + "entry_time": "2024-04-23T00:00:00", + "exit_price": 91.52050959132679, + "exit_reason": "signal", + "exit_time": "2024-04-24T00:00:00", + "pnl": -234.67875304227528, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.61545833641877, + "entry_time": "2024-04-26T00:00:00", + "exit_price": 93.11576558511285, + "exit_reason": "signal", + "exit_time": "2024-04-27T00:00:00", + "pnl": 50.03072486940982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.83965947403613, + "entry_time": "2024-04-29T00:00:00", + "exit_price": 92.12256163749144, + "exit_reason": "signal", + "exit_time": "2024-04-30T00:00:00", + "pnl": -71.70978365446899, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01797419460767, + "entry_time": "2024-05-02T00:00:00", + "exit_price": 93.19504665832812, + "exit_reason": "signal", + "exit_time": "2024-05-03T00:00:00", + "pnl": 117.70724637204512, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.52501223027797, + "entry_time": "2024-05-05T00:00:00", + "exit_price": 93.70543373709387, + "exit_reason": "signal", + "exit_time": "2024-05-06T00:00:00", + "pnl": -81.95784931841081, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.76145907090128, + "entry_time": "2024-05-08T00:00:00", + "exit_price": 93.99231970762736, + "exit_reason": "signal", + "exit_time": "2024-05-09T00:00:00", + "pnl": 23.08606367260836, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.72601264375818, + "entry_time": "2024-05-11T00:00:00", + "exit_price": 94.17294252688178, + "exit_reason": "signal", + "exit_time": "2024-05-12T00:00:00", + "pnl": 144.69298831235938, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.66991995260973, + "entry_time": "2024-05-14T00:00:00", + "exit_price": 93.29227941579406, + "exit_reason": "signal", + "exit_time": "2024-05-15T00:00:00", + "pnl": -37.76405368156702, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.05260425345361, + "entry_time": "2024-05-17T00:00:00", + "exit_price": 93.08641894302396, + "exit_reason": "signal", + "exit_time": "2024-05-18T00:00:00", + "pnl": 3.381468957035395, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89786622090341, + "entry_time": "2024-05-20T00:00:00", + "exit_price": 93.19281076082636, + "exit_reason": "signal", + "exit_time": "2024-05-21T00:00:00", + "pnl": 29.49445399229444, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.00268172437694, + "entry_time": "2024-05-23T00:00:00", + "exit_price": 93.8031782169886, + "exit_reason": "signal", + "exit_time": "2024-05-24T00:00:00", + "pnl": 80.04964926116554, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.30303744020942, + "entry_time": "2024-05-26T00:00:00", + "exit_price": 93.96047444085842, + "exit_reason": "signal", + "exit_time": "2024-05-27T00:00:00", + "pnl": -34.2562999351012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.53102238294964, + "entry_time": "2024-05-29T00:00:00", + "exit_price": 93.55135190498416, + "exit_reason": "signal", + "exit_time": "2024-05-30T00:00:00", + "pnl": 2.032952203451714, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73320965755092, + "entry_time": "2024-06-01T00:00:00", + "exit_price": 93.83108861382613, + "exit_reason": "signal", + "exit_time": "2024-06-02T00:00:00", + "pnl": 9.787895627519902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66116571648418, + "entry_time": "2024-06-04T00:00:00", + "exit_price": 93.37760682748707, + "exit_reason": "signal", + "exit_time": "2024-06-05T00:00:00", + "pnl": 71.64411110028959, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.73832896665387, + "entry_time": "2024-06-07T00:00:00", + "exit_price": 93.55125645985115, + "exit_reason": "signal", + "exit_time": "2024-06-08T00:00:00", + "pnl": -18.70725068027241, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.05801072220544, + "entry_time": "2024-06-10T00:00:00", + "exit_price": 93.19615016955767, + "exit_reason": "signal", + "exit_time": "2024-06-11T00:00:00", + "pnl": -86.18605526477586, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71612053106102, + "entry_time": "2024-06-13T00:00:00", + "exit_price": 92.35363412291727, + "exit_reason": "signal", + "exit_time": "2024-06-14T00:00:00", + "pnl": -36.248640814375904, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.89683728827593, + "entry_time": "2024-06-16T00:00:00", + "exit_price": 93.45394449656699, + "exit_reason": "signal", + "exit_time": "2024-06-17T00:00:00", + "pnl": 55.71072082910541, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.64711251538863, + "entry_time": "2024-06-19T00:00:00", + "exit_price": 94.20425342905766, + "exit_reason": "signal", + "exit_time": "2024-06-20T00:00:00", + "pnl": 55.71409136690272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.27286775878677, + "entry_time": "2024-06-22T00:00:00", + "exit_price": 93.11098684044114, + "exit_reason": "signal", + "exit_time": "2024-06-23T00:00:00", + "pnl": -16.188091834563238, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.82344576152076, + "entry_time": "2024-06-25T00:00:00", + "exit_price": 93.85991046136218, + "exit_reason": "signal", + "exit_time": "2024-06-26T00:00:00", + "pnl": 3.6464699841417314, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76944869834962, + "entry_time": "2024-06-28T00:00:00", + "exit_price": 94.49443525385506, + "exit_reason": "signal", + "exit_time": "2024-06-29T00:00:00", + "pnl": 172.49865555054384, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.26714007172914, + "entry_time": "2024-07-01T00:00:00", + "exit_price": 93.55312747617486, + "exit_reason": "signal", + "exit_time": "2024-07-02T00:00:00", + "pnl": -71.4012595554268, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21338289364272, + "entry_time": "2024-07-04T00:00:00", + "exit_price": 93.50082066300278, + "exit_reason": "signal", + "exit_time": "2024-07-05T00:00:00", + "pnl": -71.25622306399418, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.2831851440446, + "entry_time": "2024-07-07T00:00:00", + "exit_price": 92.64838687037759, + "exit_reason": "signal", + "exit_time": "2024-07-08T00:00:00", + "pnl": -63.47982736670019, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.7216517557643, + "entry_time": "2024-07-10T00:00:00", + "exit_price": 92.97199380174195, + "exit_reason": "signal", + "exit_time": "2024-07-11T00:00:00", + "pnl": -74.96579540223684, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.55110234448432, + "entry_time": "2024-07-13T00:00:00", + "exit_price": 92.47254018419862, + "exit_reason": "signal", + "exit_time": "2024-07-14T00:00:00", + "pnl": -107.85621602856918, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.35333984916058, + "entry_time": "2024-07-16T00:00:00", + "exit_price": 92.55290357280875, + "exit_reason": "signal", + "exit_time": "2024-07-17T00:00:00", + "pnl": 19.956372364815252, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.92761668682888, + "entry_time": "2024-07-19T00:00:00", + "exit_price": 92.52405415324874, + "exit_reason": "signal", + "exit_time": "2024-07-20T00:00:00", + "pnl": 59.64374664198658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.01759216619796, + "entry_time": "2024-07-22T00:00:00", + "exit_price": 91.9301791723341, + "exit_reason": "signal", + "exit_time": "2024-07-23T00:00:00", + "pnl": -8.741299386385435, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.98789247555584, + "entry_time": "2024-07-25T00:00:00", + "exit_price": 92.13492749804534, + "exit_reason": "signal", + "exit_time": "2024-07-26T00:00:00", + "pnl": 14.703502248950826, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.88900920001714, + "entry_time": "2024-07-28T00:00:00", + "exit_price": 91.63316803265334, + "exit_reason": "signal", + "exit_time": "2024-07-29T00:00:00", + "pnl": -25.584116736379656, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.85577813730865, + "entry_time": "2024-07-31T00:00:00", + "exit_price": 92.25060393364089, + "exit_reason": "signal", + "exit_time": "2024-08-01T00:00:00", + "pnl": 39.482579633224304, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.37992029678232, + "entry_time": "2024-08-03T00:00:00", + "exit_price": 91.2161626045396, + "exit_reason": "signal", + "exit_time": "2024-08-04T00:00:00", + "pnl": -16.375769224270698, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.94097148564505, + "entry_time": "2024-08-06T00:00:00", + "exit_price": 91.61411385344917, + "exit_reason": "signal", + "exit_time": "2024-08-07T00:00:00", + "pnl": -32.68576321958972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.26633312852945, + "entry_time": "2024-08-09T00:00:00", + "exit_price": 92.57486927906898, + "exit_reason": "signal", + "exit_time": "2024-08-10T00:00:00", + "pnl": 30.853615053951216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.25460128509323, + "entry_time": "2024-08-12T00:00:00", + "exit_price": 92.93806274853755, + "exit_reason": "signal", + "exit_time": "2024-08-13T00:00:00", + "pnl": -31.653853655569037, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.88821464003595, + "entry_time": "2024-08-15T00:00:00", + "exit_price": 92.53437593350753, + "exit_reason": "signal", + "exit_time": "2024-08-16T00:00:00", + "pnl": -35.38387065284223, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.5558255899151, + "entry_time": "2024-08-18T00:00:00", + "exit_price": 92.57746904834741, + "exit_reason": "signal", + "exit_time": "2024-08-19T00:00:00", + "pnl": 2.1643458432317857, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35186779566517, + "entry_time": "2024-08-21T00:00:00", + "exit_price": 93.8222066824917, + "exit_reason": "signal", + "exit_time": "2024-08-22T00:00:00", + "pnl": 47.033888682653924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.33239215677628, + "entry_time": "2024-08-24T00:00:00", + "exit_price": 92.65684927729922, + "exit_reason": "signal", + "exit_time": "2024-08-25T00:00:00", + "pnl": -67.55428794770523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.07995330778445, + "entry_time": "2024-08-27T00:00:00", + "exit_price": 93.14274907856505, + "exit_reason": "signal", + "exit_time": "2024-08-28T00:00:00", + "pnl": 6.279577078059447, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.31638915313647, + "entry_time": "2024-08-30T00:00:00", + "exit_price": 92.80125655346451, + "exit_reason": "signal", + "exit_time": "2024-08-31T00:00:00", + "pnl": -151.51325996719606, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.86908900365832, + "entry_time": "2024-09-02T00:00:00", + "exit_price": 92.43258549076677, + "exit_reason": "signal", + "exit_time": "2024-09-03T00:00:00", + "pnl": -43.65035128915588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.74183853860589, + "entry_time": "2024-09-05T00:00:00", + "exit_price": 93.04661736537737, + "exit_reason": "signal", + "exit_time": "2024-09-06T00:00:00", + "pnl": 30.477882677147136, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.18409149189986, + "entry_time": "2024-09-08T00:00:00", + "exit_price": 92.27288236124933, + "exit_reason": "signal", + "exit_time": "2024-09-09T00:00:00", + "pnl": 108.87908693494501, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.66757472286284, + "entry_time": "2024-09-11T00:00:00", + "exit_price": 91.66108329653197, + "exit_reason": "signal", + "exit_time": "2024-09-12T00:00:00", + "pnl": -100.64914263308674, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.0113429588981, + "entry_time": "2024-09-14T00:00:00", + "exit_price": 92.01542580767834, + "exit_reason": "signal", + "exit_time": "2024-09-15T00:00:00", + "pnl": 100.40828487802537, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87145951112795, + "entry_time": "2024-09-17T00:00:00", + "exit_price": 91.58043482842866, + "exit_reason": "signal", + "exit_time": "2024-09-18T00:00:00", + "pnl": 70.89753173007011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.28456359684716, + "entry_time": "2024-09-20T00:00:00", + "exit_price": 91.42689177563531, + "exit_reason": "signal", + "exit_time": "2024-09-21T00:00:00", + "pnl": 114.23281787881388, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.10394740945229, + "entry_time": "2024-09-23T00:00:00", + "exit_price": 91.5888902773369, + "exit_reason": "signal", + "exit_time": "2024-09-24T00:00:00", + "pnl": 148.49428678846198, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.05233318851363, + "entry_time": "2024-09-26T00:00:00", + "exit_price": 91.20379964517136, + "exit_reason": "signal", + "exit_time": "2024-09-27T00:00:00", + "pnl": 15.146645665774486, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93054848304011, + "entry_time": "2024-09-29T00:00:00", + "exit_price": 91.4470753529935, + "exit_reason": "signal", + "exit_time": "2024-09-30T00:00:00", + "pnl": 51.65268699533772, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.55093725008568, + "entry_time": "2024-10-02T00:00:00", + "exit_price": 90.1771270171211, + "exit_reason": "signal", + "exit_time": "2024-10-03T00:00:00", + "pnl": -137.3810232964588, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.51951955539236, + "entry_time": "2024-10-05T00:00:00", + "exit_price": 90.35054775405881, + "exit_reason": "signal", + "exit_time": "2024-10-06T00:00:00", + "pnl": -16.897180133355505, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.20200706252784, + "entry_time": "2024-10-08T00:00:00", + "exit_price": 91.07198645570766, + "exit_reason": "signal", + "exit_time": "2024-10-09T00:00:00", + "pnl": -13.002060682018055, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.13850851279538, + "entry_time": "2024-10-11T00:00:00", + "exit_price": 90.2608758916971, + "exit_reason": "signal", + "exit_time": "2024-10-12T00:00:00", + "pnl": -87.76326210982734, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.93035699558081, + "entry_time": "2024-10-14T00:00:00", + "exit_price": 90.52157669994283, + "exit_reason": "signal", + "exit_time": "2024-10-15T00:00:00", + "pnl": -40.8780295637971, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.49395863364698, + "entry_time": "2024-10-17T00:00:00", + "exit_price": 89.86316250689507, + "exit_reason": "signal", + "exit_time": "2024-10-18T00:00:00", + "pnl": -63.07961267519204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.18352844268802, + "entry_time": "2024-10-20T00:00:00", + "exit_price": 88.93546496698286, + "exit_reason": "signal", + "exit_time": "2024-10-21T00:00:00", + "pnl": -124.80634757051484, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.8113095296125, + "entry_time": "2024-10-23T00:00:00", + "exit_price": 89.54696410392557, + "exit_reason": "signal", + "exit_time": "2024-10-24T00:00:00", + "pnl": -26.43454256869336, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.08012041438292, + "entry_time": "2024-10-26T00:00:00", + "exit_price": 89.23016998477505, + "exit_reason": "signal", + "exit_time": "2024-10-27T00:00:00", + "pnl": 15.004957039212968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.84774198158706, + "entry_time": "2024-10-29T00:00:00", + "exit_price": 89.88558944915762, + "exit_reason": "signal", + "exit_time": "2024-10-30T00:00:00", + "pnl": 3.7847467570554727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52000332438061, + "entry_time": "2024-11-01T00:00:00", + "exit_price": 88.86871340352687, + "exit_reason": "signal", + "exit_time": "2024-11-02T00:00:00", + "pnl": 34.87100791462581, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.58373696827199, + "entry_time": "2024-11-04T00:00:00", + "exit_price": 88.82208371804109, + "exit_reason": "signal", + "exit_time": "2024-11-05T00:00:00", + "pnl": -76.16532502309019, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.32832910147938, + "entry_time": "2024-11-07T00:00:00", + "exit_price": 89.06529443738525, + "exit_reason": "signal", + "exit_time": "2024-11-08T00:00:00", + "pnl": -26.303466409412067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.45977666376373, + "entry_time": "2024-11-10T00:00:00", + "exit_price": 89.24686599676619, + "exit_reason": "signal", + "exit_time": "2024-11-11T00:00:00", + "pnl": -121.29106669975408, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21043430906948, + "entry_time": "2024-11-13T00:00:00", + "exit_price": 88.4518561142622, + "exit_reason": "signal", + "exit_time": "2024-11-14T00:00:00", + "pnl": -75.85781948072872, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.80819601768098, + "entry_time": "2024-11-16T00:00:00", + "exit_price": 88.9586155221746, + "exit_reason": "signal", + "exit_time": "2024-11-17T00:00:00", + "pnl": 15.041950449362048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.14254378792333, + "entry_time": "2024-11-19T00:00:00", + "exit_price": 88.6718045936633, + "exit_reason": "signal", + "exit_time": "2024-11-20T00:00:00", + "pnl": -47.07391942600407, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.3689677842857, + "entry_time": "2024-11-22T00:00:00", + "exit_price": 88.87620295869029, + "exit_reason": "signal", + "exit_time": "2024-11-23T00:00:00", + "pnl": -49.27648255954227, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.06997514477666, + "entry_time": "2024-11-25T00:00:00", + "exit_price": 88.79230048470953, + "exit_reason": "signal", + "exit_time": "2024-11-26T00:00:00", + "pnl": -27.76746600671322, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.69842658289039, + "entry_time": "2024-11-28T00:00:00", + "exit_price": 88.84366945841847, + "exit_reason": "signal", + "exit_time": "2024-11-29T00:00:00", + "pnl": -85.47571244719074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.75521347785288, + "entry_time": "2024-12-01T00:00:00", + "exit_price": 89.14459057740478, + "exit_reason": "signal", + "exit_time": "2024-12-02T00:00:00", + "pnl": -61.06229004481065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.78540826994568, + "entry_time": "2024-12-04T00:00:00", + "exit_price": 89.0389294134589, + "exit_reason": "signal", + "exit_time": "2024-12-05T00:00:00", + "pnl": 25.352114351322598, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.backtrader", + "path": "validation/frameworks/backtrader.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "unavailable", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "risk_rules": "framework_adapter" + }, + "digests": { + "adapter": "9d3ee2845f1a37b484d9040c5237d7e0ba8974b0536b216305b3a2dd14fe8976", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" + }, + "framework_target": { + "actual_version": "1.9.78.123", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "version": "1.9.78.123" + }, + "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 1800, + "entry_signals": 600, + "exit_signals": 600, + "framework_closed_trades": 600, + "framework_fills": 1200, + "framework_intents": 1200, + "framework_orders": null, + "ml4t_closed_trades": 600, + "ml4t_fills": 1200, + "ml4t_intents": 1200, + "ml4t_orders": null + } + }, + "release_blocking": false, + "required": true, + "scenario_id": "17", + "scenario_name": "High Event Count", + "status": "pass" + }, + { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99708.90000000002, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99708.90000000002, + "message": "Zipline=$99,708.9000000000, ML4T=$99,708.9000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -291.0999999999767, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -291.0999999999767, + "message": "Zipline=$-291.1000000000, ML4T=$-291.1000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.1000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -387.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 342.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.0000000000009, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 805.8000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -548.1000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -387.30000000000047, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 342.4999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -504.0000000000006, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "01" + }, + "detail": null, + "duration_seconds": 2.004964594030753, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "final_value": 99708.90000000002, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -291.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 805.8000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -548.1000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -387.30000000000047, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 342.4999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -504.0000000000006, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 99708.90000000002, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -291.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.1000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -387.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 342.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.0000000000009, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "01", @@ -474,8 +248392,763 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99708.90000000002, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99708.90000000002, + "message": "Zipline=$99,708.9000000000, ML4T=$99,708.9000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -291.0999999999767, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -291.0999999999767, + "message": "Zipline=$-291.1000000000, ML4T=$-291.1000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.1000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -387.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 342.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.0000000000009, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 805.8000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -548.1000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -387.30000000000047, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 342.4999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -504.0000000000006, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "02" + }, "detail": null, + "duration_seconds": 2.0278703500516713, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "final_value": 99708.90000000002, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -291.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 805.8000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -548.1000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -387.30000000000047, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 342.4999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -504.0000000000006, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 99708.90000000002, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -291.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 805.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -548.1000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -387.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 342.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -504.0000000000009, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "02", @@ -483,8 +249156,321 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Zipline=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99400.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99400.0, + "message": "Zipline=$99,400.0000000000, ML4T=$99,400.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -600.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -600.0, + "message": "Zipline=$-600.0000000000, ML4T=$-600.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 93.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 93.5, + "message": "Zipline=$93.5000000000, ML4T=$93.5000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 93.5, + "exit_reason": "stop_loss", + "exit_time": "2020-01-08T00:00:00", + "pnl": -600.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 93.5, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": -600.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 93.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "03" + }, "detail": null, + "duration_seconds": 1.967110760975629, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 93.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + } + ], + "final_value": 99400.0, + "framework": "Zipline", + "num_trades": 1, + "total_pnl": -600.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 93.5, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": -600.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 93.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "stop_loss", + "price": 93.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + } + ], + "final_value": 99400.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -600.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 93.5, + "exit_reason": "stop_loss", + "exit_time": "2020-01-08T00:00:00", + "pnl": -600.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "289e2e7bbc4c64a281318ef3f25bbefe0a3e96c9393ee3e7672898f6c06a4f5c", + "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "c35f1e258ae4d0cd8eed9125a530bea473632a5bb3f4558583c0818700906e96", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 13, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "03", @@ -492,8 +249478,321 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Zipline=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 101100.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 101100.0, + "message": "Zipline=$101,100.0000000000, ML4T=$101,100.0000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1100.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": 1100.0, + "message": "Zipline=$1,100.0000000000, ML4T=$1,100.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 111.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 111.5, + "message": "Zipline=$111.5000000000, ML4T=$111.5000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "exit_price", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 111.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-09T00:00:00", + "pnl": 1100.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 111.5, + "exit_time": "2020-01-09T21:00:00+00:00", + "pnl": 1100.0, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 111.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 111.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "04" + }, "detail": null, + "duration_seconds": 1.979664044920355, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 111.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 111.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T21:00:00+00:00" + } + ], + "final_value": 101100.0, + "framework": "Zipline", + "num_trades": 1, + "total_pnl": 1100.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 111.5, + "exit_time": "2020-01-09T21:00:00+00:00", + "pnl": 1100.0, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "exit_price": 111.5 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.5, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 111.5, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-09T00:00:00" + } + ], + "final_value": 101100.0, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 1100.0, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.5, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 111.5, + "exit_reason": "take_profit", + "exit_time": "2020-01-09T00:00:00", + "pnl": 1100.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "289e2e7bbc4c64a281318ef3f25bbefe0a3e96c9393ee3e7672898f6c06a4f5c", + "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "9f43427f7ad70fc963aeec58cf8867b5646e88bd608ec489964f802a2c98a57d", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 13, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "04", @@ -501,8 +249800,777 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99619.18869999998, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 4.3655745685100555e-11, + "expected": 99619.18870000003, + "message": "Zipline=$99,619.1887000000, ML4T=$99,619.1887000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -380.81130000001576, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 4.3655745685100555e-11, + "expected": -380.8112999999721, + "message": "Zipline=$-380.8113000000, ML4T=$-380.8113000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 89.7113, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4210854715202004e-14, + "expected": 89.71130000000001, + "message": "Zipline=$89.7113000000, ML4T=$89.7113000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 20.9074, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.892600000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.509300000000003, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6093000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.8235, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -404.1234999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.7999, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 325.7001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.6712, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.6712000000009, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 20.907400000000003, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 784.8926000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.509300000000003, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -566.6093000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.823500000000003, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -404.1235000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.799900000000004, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 325.70009999999974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.6712, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -520.6712000000007, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 10.050799999999999, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.8566, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.5287, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.9806, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.6054, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.2181, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.228700000000002, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.571200000000001, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.5876, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.083599999999999, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 10.0508, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 10.8566, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 9.5287, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.980599999999999, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.605400000000001, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.2181, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.228700000000002, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.571200000000001, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.5876, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.0836, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "05" + }, "detail": null, + "duration_seconds": 2.0347821419127285, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 89.71130000000001 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.0508, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 10.8566, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 9.5287, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.980599999999999, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.605400000000001, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.2181, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.228700000000002, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.571200000000001, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.5876, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 8.0836, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "final_value": 99619.18870000003, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -380.8112999999721, + "trades": [ + { + "asset": "TEST", + "commission": 20.907400000000003, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 784.8926000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.509300000000003, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -566.6093000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.823500000000003, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -404.1235000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.799900000000004, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 325.70009999999974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.6712, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -520.6712000000007, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 89.7113 + }, + "fills": [ + { + "asset": "TEST", + "commission": 10.050799999999999, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 10.8566, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 9.5287, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.9806, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.6054, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.2181, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.228700000000002, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.571200000000001, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.5876, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 8.083599999999999, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 99619.18869999998, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -380.81130000001576, + "trades": [ + { + "asset": "TEST", + "commission": 20.9074, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.892600000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 18.509300000000003, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6093000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.8235, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -404.1234999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.7999, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 325.7001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 16.6712, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.6712000000009, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "05", @@ -510,8 +250578,777 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99703.90000000002, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99703.90000000002, + "message": "Zipline=$99,703.9000000000, ML4T=$99,703.9000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -296.0999999999767, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -296.0999999999767, + "message": "Zipline=$-296.1000000000, ML4T=$-296.1000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": 5.0, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 5.0, + "message": "Zipline=$5.0000000000, ML4T=$5.0000000000 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", + "name": "total_commission", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 804.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -549.1000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -388.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 341.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -505.0000000000009, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 804.8000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -549.1000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -388.30000000000047, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 341.4999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -505.0000000000006, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.5, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "06" + }, "detail": null, + "duration_seconds": 2.0951536900829524, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 5.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.5, + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "final_value": 99703.90000000002, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -296.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.566, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 804.8000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.806, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -549.1000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.181, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -388.30000000000047, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.712, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 341.4999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.836, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -505.0000000000006, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": { + "total_commission": 5.0 + }, + "fills": [ + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 100.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 108.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 95.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 89.806, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 86.054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 82.181, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 82.287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 85.712, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "", + "price": 85.876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.5, + "exit_reason": "signal", + "price": 80.836, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 99703.90000000002, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -296.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 100.508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.566, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 804.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 95.287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.806, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -549.1000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 86.054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.181, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -388.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 82.287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.712, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 341.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 1.0, + "direction": "Long", + "entry_price": 85.876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.836, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -505.0000000000009, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "523af2137e8233ef65d03ffb841e91525f65f7c3057b3111e86aedbf0a973fb7" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "06", @@ -519,8 +251356,763 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99698.90000000002, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99698.90000000002, + "message": "Zipline=$99,698.9000000000, ML4T=$99,698.9000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -301.0999999999767, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -301.0999999999767, + "message": "Zipline=$-301.1000000000, ML4T=$-301.1000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.518, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.556, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 803.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29700000000001, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.79599999999999, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -550.1000000000022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06400000000001, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.17099999999999, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -389.3000000000029, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29700000000001, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.702, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 340.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.88600000000001, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.826, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -506.0000000000009, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.518, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.556, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 803.7999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29700000000001, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.79599999999999, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -550.100000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06400000000001, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.17099999999999, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -389.3000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29700000000001, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.702, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 340.4999999999987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.88600000000001, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.826, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -506.00000000000165, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.79599999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.06400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.17099999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.702, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.88600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.79599999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.06400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.17099999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.702, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.88600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "07" + }, "detail": null, + "duration_seconds": 2.009585133055225, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.79599999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.06400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.17099999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.702, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.88600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "final_value": 99698.90000000002, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -301.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.518, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.556, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 803.7999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29700000000001, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.79599999999999, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -550.100000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06400000000001, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.17099999999999, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -389.3000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29700000000001, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.702, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 340.4999999999987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.88600000000001, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.826, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -506.00000000000165, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.518, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.79599999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.06400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.17099999999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.29700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.702, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.88600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.826, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 99698.90000000002, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -301.0999999999767, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.518, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.556, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 803.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.29700000000001, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.79599999999999, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -550.1000000000022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.06400000000001, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.17099999999999, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -389.3000000000029, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.29700000000001, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.702, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 340.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.88600000000001, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.826, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -506.0000000000009, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "07", @@ -528,8 +252120,763 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99619.1887, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99619.1887, + "message": "Zipline=$99,619.1887000000, ML4T=$99,619.1887000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -380.8113000000012, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -380.8113000000012, + "message": "Zipline=$-380.8113000000, ML4T=$-380.8113000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.608508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.457434, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.892600000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.382287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.716194, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6093000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.140054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.09881899999999, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -404.1235000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.369287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.626288, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 325.7001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.961876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.755164, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.6712000000016, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.608508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.457434, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 784.8926000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.382287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.716194, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -566.6093000000003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.140054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.09881899999999, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -404.12350000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.369287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.626288, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 325.70010000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.961876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.755164, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -520.671200000001, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.608508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.457434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.382287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.716194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.140054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.09881899999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.369287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.626288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.961876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.755164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.608508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.457434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.382287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.716194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.140054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.09881899999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.369287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.626288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.961876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.755164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "08" + }, "detail": null, + "duration_seconds": 2.0269625219516456, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.608508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.457434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.382287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.716194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.140054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.09881899999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.369287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.626288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.961876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.755164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T20:00:00+00:00" + } + ], + "final_value": 99619.1887, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -380.8113000000012, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.608508, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.457434, + "exit_time": "2020-01-08T21:00:00+00:00", + "pnl": 784.8926000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.382287, + "entry_time": "2020-01-23T21:00:00+00:00", + "exit_price": 89.716194, + "exit_time": "2020-01-28T21:00:00+00:00", + "pnl": -566.6093000000003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.140054, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 82.09881899999999, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -404.12350000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.369287, + "entry_time": "2020-03-03T21:00:00+00:00", + "exit_price": 85.626288, + "exit_time": "2020-03-18T20:00:00+00:00", + "pnl": 325.70010000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.961876, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 80.755164, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": -520.671200000001, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.608508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 108.457434, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.382287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.716194, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.140054, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 82.09881899999999, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.369287, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.626288, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 85.961876, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 80.755164, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-07T00:00:00" + } + ], + "final_value": 99619.1887, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -380.8113000000012, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.608508, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.457434, + "exit_reason": "signal", + "exit_time": "2020-01-08T00:00:00", + "pnl": 784.892600000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.382287, + "entry_time": "2020-01-23T00:00:00", + "exit_price": 89.716194, + "exit_reason": "signal", + "exit_time": "2020-01-28T00:00:00", + "pnl": -566.6093000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.140054, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 82.09881899999999, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -404.1235000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 82.369287, + "entry_time": "2020-03-03T00:00:00", + "exit_price": 85.626288, + "exit_reason": "signal", + "exit_time": "2020-03-18T00:00:00", + "pnl": 325.7001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 85.961876, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 80.755164, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": -520.6712000000016, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "08", @@ -537,8 +252884,421 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "Zipline=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99742.19999999998, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.4551915228366852e-11, + "expected": 99742.2, + "message": "Zipline=$99,742.2000000000, ML4T=$99,742.2000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -257.80000000001746, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 1.4551915228366852e-11, + "expected": -257.8000000000029, + "message": "Zipline=$-257.8000000000, ML4T=$-257.8000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.711, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 101.207, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-04T00:00:00", + "pnl": 49.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 95.356, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-05T00:00:00", + "pnl": -307.40000000000146, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.711, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 101.20700000000001, + "exit_time": "2020-02-04T21:00:00+00:00", + "pnl": 49.60000000000093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 95.35600000000001, + "exit_time": "2020-03-05T21:00:00+00:00", + "pnl": -307.3999999999998, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 95.356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-05T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.20700000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.35600000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-05T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "09" + }, "detail": null, + "duration_seconds": 1.9936341198626906, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.20700000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.35600000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-05T21:00:00+00:00" + } + ], + "final_value": 99742.2, + "framework": "Zipline", + "num_trades": 2, + "total_pnl": -257.8000000000029, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.711, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 101.20700000000001, + "exit_time": "2020-02-04T21:00:00+00:00", + "pnl": 49.60000000000093, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 95.35600000000001, + "exit_time": "2020-03-05T21:00:00+00:00", + "pnl": -307.3999999999998, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.711, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 101.207, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 95.356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-05T00:00:00" + } + ], + "final_value": 99742.19999999998, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": -257.80000000001746, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.711, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 101.207, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-04T00:00:00", + "pnl": 49.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.43, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 95.356, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-05T00:00:00", + "pnl": -307.40000000000146, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "de6e2060eccdf8f068669911169eb7a3d28af0622a7a840f637acb82db930a7e", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "09", @@ -546,8 +253306,13 @@ "status": "pass" }, { + "comparison": null, "detail": "Scenario explicitly excludes this framework", + "duration_seconds": 4.532048478722572e-06, "framework": "zipline", + "framework_result": null, + "ml4t_result": null, + "provenance": null, "release_blocking": false, "required": false, "scenario_id": "10", @@ -555,8 +253320,763 @@ "status": "unsupported" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1001679.7, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 1001679.7, + "message": "Zipline=$1,001,679.7000000000, ML4T=$1,001,679.7000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1679.6999999999534, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": 1679.6999999999534, + "message": "Zipline=$1,679.7000000000, ML4T=$1,679.7000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.718, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 93.4, + "exit_reason": "signal", + "exit_time": "2020-01-21T00:00:00", + "pnl": 1431.800000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27, + "entry_time": "2020-01-28T00:00:00", + "exit_price": 88.764, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": 150.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.921, + "entry_time": "2020-03-30T00:00:00", + "exit_price": 81.413, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": 150.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.179, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 79.574, + "exit_reason": "signal", + "exit_time": "2020-06-08T00:00:00", + "pnl": 60.50000000000091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.478, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 85.618, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": -114.0, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.718, + "entry_time": "2020-01-08T21:00:00+00:00", + "exit_price": 93.4, + "exit_time": "2020-01-21T21:00:00+00:00", + "pnl": 1431.7999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27, + "entry_time": "2020-01-28T21:00:00+00:00", + "exit_price": 88.764, + "exit_time": "2020-02-07T21:00:00+00:00", + "pnl": 150.60000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.921, + "entry_time": "2020-03-30T20:00:00+00:00", + "exit_price": 81.413, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": 150.80000000000098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.179, + "entry_time": "2020-04-17T20:00:00+00:00", + "exit_price": 79.574, + "exit_time": "2020-06-08T20:00:00+00:00", + "pnl": 60.5000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.47800000000001, + "entry_time": "2020-06-16T20:00:00+00:00", + "exit_price": 85.618, + "exit_time": "2020-06-26T20:00:00+00:00", + "pnl": -113.99999999999864, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.718, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.27, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.764, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 84.478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 107.718, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.27, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.764, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.47800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "11" + }, "detail": null, + "duration_seconds": 2.0319214940536767, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 107.718, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.27, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.764, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 82.921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 81.413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 80.179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 79.574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.47800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 85.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T20:00:00+00:00" + } + ], + "final_value": 1001679.7, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": 1679.6999999999534, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.718, + "entry_time": "2020-01-08T21:00:00+00:00", + "exit_price": 93.4, + "exit_time": "2020-01-21T21:00:00+00:00", + "pnl": 1431.7999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27, + "entry_time": "2020-01-28T21:00:00+00:00", + "exit_price": 88.764, + "exit_time": "2020-02-07T21:00:00+00:00", + "pnl": 150.60000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.921, + "entry_time": "2020-03-30T20:00:00+00:00", + "exit_price": 81.413, + "exit_time": "2020-04-07T20:00:00+00:00", + "pnl": 150.80000000000098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.179, + "entry_time": "2020-04-17T20:00:00+00:00", + "exit_price": 79.574, + "exit_time": "2020-06-08T20:00:00+00:00", + "pnl": 60.5000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.47800000000001, + "entry_time": "2020-06-16T20:00:00+00:00", + "exit_price": 85.618, + "exit_time": "2020-06-26T20:00:00+00:00", + "pnl": -113.99999999999864, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 107.718, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.27, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.764, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 82.921, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 81.413, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 80.179, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 79.574, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 84.478, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 85.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-26T00:00:00" + } + ], + "final_value": 1001679.7, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": 1679.6999999999534, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 107.718, + "entry_time": "2020-01-08T00:00:00", + "exit_price": 93.4, + "exit_reason": "signal", + "exit_time": "2020-01-21T00:00:00", + "pnl": 1431.800000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 90.27, + "entry_time": "2020-01-28T00:00:00", + "exit_price": 88.764, + "exit_reason": "signal", + "exit_time": "2020-02-07T00:00:00", + "pnl": 150.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 82.921, + "entry_time": "2020-03-30T00:00:00", + "exit_price": 81.413, + "exit_reason": "signal", + "exit_time": "2020-04-07T00:00:00", + "pnl": 150.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 80.179, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 79.574, + "exit_reason": "signal", + "exit_time": "2020-06-08T00:00:00", + "pnl": 60.50000000000091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 84.478, + "entry_time": "2020-06-16T00:00:00", + "exit_price": 85.618, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": -114.0, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "517a65764277b104abf7848a9875d5f09febfddffb82d8fd9318f724ff1aaa86", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 137, + "entry_signals": 7, + "exit_signals": 8, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 15, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 15, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "11", @@ -564,8 +254084,421 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 2, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 2, + "message": "Zipline=2, ML4T=2, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 1001259.3, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 1001259.3, + "message": "Zipline=$1,001,259.3000000000, ML4T=$1,001,259.3000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 1259.3000000000466, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": 1259.3000000000466, + "message": "Zipline=$1,259.3000000000, ML4T=$1,259.3000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.714, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 88.805, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-04T00:00:00", + "pnl": 1090.8999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.2, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 84.516, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-05T00:00:00", + "pnl": 168.39999999999964, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.714, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 88.805, + "exit_time": "2020-02-04T21:00:00+00:00", + "pnl": 1090.8999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.2, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 84.516, + "exit_time": "2020-03-05T21:00:00+00:00", + "pnl": 168.39999999999975, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 88.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.2, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 84.516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.2, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "12" + }, "detail": null, + "duration_seconds": 2.0088390049058944, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 99.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.2, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 84.516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T21:00:00+00:00" + } + ], + "final_value": 1001259.3, + "framework": "Zipline", + "num_trades": 2, + "total_pnl": 1259.3000000000466, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.714, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 88.805, + "exit_time": "2020-02-04T21:00:00+00:00", + "pnl": 1090.8999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.2, + "entry_time": "2020-02-12T21:00:00+00:00", + "exit_price": 84.516, + "exit_time": "2020-03-05T21:00:00+00:00", + "pnl": 168.39999999999975, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 88.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.2, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 84.516, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-05T00:00:00" + } + ], + "final_value": 1001259.3, + "framework": "ml4t.backtest", + "num_trades": 2, + "total_pnl": 1259.3000000000466, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 99.714, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 88.805, + "exit_reason": "trailing_stop", + "exit_time": "2020-02-04T00:00:00", + "pnl": 1090.8999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Short", + "entry_price": 86.2, + "entry_time": "2020-02-12T00:00:00", + "exit_price": 84.516, + "exit_reason": "trailing_stop", + "exit_time": "2020-03-05T00:00:00", + "pnl": 168.39999999999964, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "0a07a9016d0aefe80ef3f3b91b88a8f2db5bc156849e54d232c6e3120652b767", + "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "b211286d7dde78c905f246c3d56fb3c84b7f7de3c5f4a124c6b33680c37aa37d", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 69, + "entry_signals": 2, + "exit_signals": 0, + "framework_closed_trades": 2, + "framework_fills": 4, + "framework_intents": 2, + "framework_orders": null, + "ml4t_closed_trades": 2, + "ml4t_fills": 4, + "ml4t_intents": 2, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "12", @@ -573,8 +254506,307 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Zipline=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100803.1, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 100803.1, + "message": "Zipline=$100,803.1000000000, ML4T=$100,803.1000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 803.1000000000058, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": 803.1000000000058, + "message": "Zipline=$803.1000000000, ML4T=$803.1000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.431, + "exit_reason": "take_profit", + "exit_time": "2020-01-14T00:00:00", + "pnl": 803.1000000000004, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.431, + "exit_time": "2020-01-14T21:00:00+00:00", + "pnl": 803.0999999999992, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "13" + }, "detail": null, + "duration_seconds": 1.993454037932679, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 108.431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T21:00:00+00:00" + } + ], + "final_value": 100803.1, + "framework": "Zipline", + "num_trades": 1, + "total_pnl": 803.1000000000058, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 108.431, + "exit_time": "2020-01-14T21:00:00+00:00", + "pnl": 803.0999999999992, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.4, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "take_profit", + "price": 108.431, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T00:00:00" + } + ], + "final_value": 100803.1, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": 803.1000000000058, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.4, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 108.431, + "exit_reason": "take_profit", + "exit_time": "2020-01-14T00:00:00", + "pnl": 803.1000000000004, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "79590cf03ef0f3e90985c032e8f555ecdf9add3fc21908924a49e7d706b5f041", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 34, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "13", @@ -582,8 +254814,307 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Zipline=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99899.7, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99899.7, + "message": "Zipline=$99,899.7000000000, ML4T=$99,899.7000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -100.30000000000291, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 0.0, + "expected": -100.30000000000291, + "message": "Zipline=$-100.3000000000, ML4T=$-100.3000000000 (exact_diff=$0.0000000000; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 99.297, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-14T00:00:00", + "pnl": -100.30000000000109, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 99.297, + "exit_time": "2020-01-14T21:00:00+00:00", + "pnl": -100.30000000000001, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 99.297, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.297, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "14" + }, "detail": null, + "duration_seconds": 2.1262002419680357, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.297, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T21:00:00+00:00" + } + ], + "final_value": 99899.7, + "framework": "Zipline", + "num_trades": 1, + "total_pnl": -100.30000000000291, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 99.297, + "exit_time": "2020-01-14T21:00:00+00:00", + "pnl": -100.30000000000001, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.3, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 99.297, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-14T00:00:00" + } + ], + "final_value": 99899.7, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -100.30000000000291, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.3, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 99.297, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-14T00:00:00", + "pnl": -100.30000000000109, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "939287c002cf7b640b21c5859335249e1db1400c7d94dd37f62a7f078ba31fad", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 34, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "14", @@ -591,8 +255122,307 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 1, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 1, + "message": "Zipline=1, ML4T=1, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 99737.3, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 0.0, + "expected": 99737.3, + "message": "Zipline=$99,737.3000000000, ML4T=$99,737.3000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": -262.6999999999971, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 10.0, + "difference": 0.0, + "expected": -262.6999999999971, + "message": "Zipline=$-262.7000000000, ML4T=$-262.7000000000 (exact_diff=$0.0000000000; diagnostic_limit=$10.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 94.073, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-07T00:00:00", + "pnl": -262.7000000000007, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 94.07300000000001, + "exit_time": "2020-01-07T21:00:00+00:00", + "pnl": -262.69999999999953, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 94.073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "15" + }, "detail": null, + "duration_seconds": 2.012783998157829, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.07300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T21:00:00+00:00" + } + ], + "final_value": 99737.3, + "framework": "Zipline", + "num_trades": 1, + "total_pnl": -262.6999999999971, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 94.07300000000001, + "exit_time": "2020-01-07T21:00:00+00:00", + "pnl": -262.69999999999953, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.7, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 94.073, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-07T00:00:00" + } + ], + "final_value": 99737.3, + "framework": "ml4t.backtest", + "num_trades": 1, + "total_pnl": -262.6999999999971, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.7, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 94.073, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-07T00:00:00", + "pnl": -262.7000000000007, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "935e7e58b70b2ff5c2181016ceae955c9aa4986a9e1d7653b63043d3be82a524", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 34, + "entry_signals": 1, + "exit_signals": 0, + "framework_closed_trades": 1, + "framework_fills": 2, + "framework_intents": 1, + "framework_orders": null, + "ml4t_closed_trades": 1, + "ml4t_fills": 2, + "ml4t_intents": 1, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "15", @@ -600,17 +255430,39384 @@ "status": "pass" }, { + "comparison": { + "checks": [ + { + "actual": 5, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 5, + "message": "Zipline=5, ML4T=5, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 98495.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.1, + "difference": 0.0, + "expected": 98495.5, + "message": "Zipline=$98,495.5000000000, ML4T=$98,495.5000000000 (exact_diff=$0.0000000000, 0.0000000000%; diagnostic_limit=0.1%)", + "name": "final_value", + "passed": true + }, + { + "actual": -1504.5, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 50.0, + "difference": 0.0, + "expected": -1504.5, + "message": "Zipline=$-1,504.5000000000, ML4T=$-1,504.5000000000 (exact_diff=$0.0000000000; diagnostic_limit=$50.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.888, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 100.505, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-22T00:00:00", + "pnl": -38.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.043, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 86.048, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-22T00:00:00", + "pnl": 1800.4999999999982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 150.151, + "entry_time": "2021-02-08T00:00:00", + "exit_price": 139.858, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-16T00:00:00", + "pnl": -1029.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.821, + "entry_time": "2021-12-03T00:00:00", + "exit_price": 199.696, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-07T00:00:00", + "pnl": -2812.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.98, + "entry_time": "2022-09-29T00:00:00", + "exit_price": 92.731, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-10T00:00:00", + "pnl": 575.0999999999985, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.888, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 100.505, + "exit_time": "2020-01-22T21:00:00+00:00", + "pnl": -38.30000000000098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.043, + "entry_time": "2020-07-21T20:00:00+00:00", + "exit_price": 86.048, + "exit_time": "2020-09-22T20:00:00+00:00", + "pnl": 1800.4999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 150.151, + "entry_time": "2021-02-08T21:00:00+00:00", + "exit_price": 139.858, + "exit_time": "2021-02-16T21:00:00+00:00", + "pnl": -1029.3000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.821, + "entry_time": "2021-12-03T21:00:00+00:00", + "exit_price": 199.696, + "exit_time": "2021-12-07T21:00:00+00:00", + "pnl": -2812.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.98, + "entry_time": "2022-09-29T20:00:00+00:00", + "exit_price": 92.73100000000001, + "exit_time": "2022-10-10T20:00:00+00:00", + "pnl": 575.1000000000005, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 100.505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 68.043, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 86.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 150.151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 139.858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 227.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 199.696, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 92.731, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 68.043, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 150.151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 139.858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 227.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 199.696, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73100000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T20:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "16" + }, "detail": null, + "duration_seconds": 2.472045441158116, "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 100.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 68.043, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 150.151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 139.858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 227.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 199.696, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 86.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73100000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T20:00:00+00:00" + } + ], + "final_value": 98495.5, + "framework": "Zipline", + "num_trades": 5, + "total_pnl": -1504.5, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.888, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 100.505, + "exit_time": "2020-01-22T21:00:00+00:00", + "pnl": -38.30000000000098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.043, + "entry_time": "2020-07-21T20:00:00+00:00", + "exit_price": 86.048, + "exit_time": "2020-09-22T20:00:00+00:00", + "pnl": 1800.4999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 150.151, + "entry_time": "2021-02-08T21:00:00+00:00", + "exit_price": 139.858, + "exit_time": "2021-02-16T21:00:00+00:00", + "pnl": -1029.3000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.821, + "entry_time": "2021-12-03T21:00:00+00:00", + "exit_price": 199.696, + "exit_time": "2021-12-07T21:00:00+00:00", + "pnl": -2812.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.98, + "entry_time": "2022-09-29T20:00:00+00:00", + "exit_price": 92.73100000000001, + "exit_time": "2022-10-10T20:00:00+00:00", + "pnl": 575.1000000000005, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 100.505, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 68.043, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 86.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 150.151, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 139.858, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 227.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 199.696, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 86.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "trailing_stop", + "price": 92.731, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + } + ], + "final_value": 98495.5, + "framework": "ml4t.backtest", + "num_trades": 5, + "total_pnl": -1504.5, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.888, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 100.505, + "exit_reason": "trailing_stop", + "exit_time": "2020-01-22T00:00:00", + "pnl": -38.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 68.043, + "entry_time": "2020-07-21T00:00:00", + "exit_price": 86.048, + "exit_reason": "trailing_stop", + "exit_time": "2020-09-22T00:00:00", + "pnl": 1800.4999999999982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 150.151, + "entry_time": "2021-02-08T00:00:00", + "exit_price": 139.858, + "exit_reason": "trailing_stop", + "exit_time": "2021-02-16T00:00:00", + "pnl": -1029.2999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 227.821, + "entry_time": "2021-12-03T00:00:00", + "exit_price": 199.696, + "exit_reason": "trailing_stop", + "exit_time": "2021-12-07T00:00:00", + "pnl": -2812.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 86.98, + "entry_time": "2022-09-29T00:00:00", + "exit_price": 92.731, + "exit_reason": "trailing_stop", + "exit_time": "2022-10-10T00:00:00", + "pnl": 575.0999999999985, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "adapter_emulated_daily_ohlc", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "fc4132bd3907c4367265ff478960830680f88ab7df440ad0ec317ff5136c039c", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 1034, + "entry_signals": 5, + "exit_signals": 0, + "framework_closed_trades": 5, + "framework_fills": 10, + "framework_intents": 5, + "framework_orders": null, + "ml4t_closed_trades": 5, + "ml4t_fills": 10, + "ml4t_intents": 5, + "ml4t_orders": null + } + }, "release_blocking": false, "required": true, "scenario_id": "16", - "scenario_name": "Stress Test", + "scenario_name": "Regime Path Coverage", + "status": "pass" + }, + { + "comparison": { + "checks": [ + { + "actual": 337, + "canonical_quantum": "1", + "diagnostic_limit": 0, + "difference": 0, + "expected": 337, + "message": "Zipline=337, ML4T=337, exact_diff=0; diagnostic_limit=0", + "name": "trade_count", + "passed": true + }, + { + "actual": 100811.00000000025, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 0.01, + "difference": 1.0186340659856796e-10, + "expected": 100811.00000000015, + "message": "Zipline=$100,811.0000000001, ML4T=$100,811.0000000002 (exact_diff=$0.0000000001, 0.0000000000%; diagnostic_limit=0.01%)", + "name": "final_value", + "passed": true + }, + { + "actual": 811.0000000002474, + "canonical_quantum": "0.00000001", + "diagnostic_limit": 5.0, + "difference": 1.0186340659856796e-10, + "expected": 811.0000000001455, + "message": "Zipline=$811.0000000001, ML4T=$811.0000000002 (exact_diff=$0.0000000001; diagnostic_limit=$5.0)", + "name": "total_pnl", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.119, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 100.032, + "exit_reason": "signal", + "exit_time": "2020-01-06T00:00:00", + "pnl": -108.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.672, + "entry_time": "2020-01-09T00:00:00", + "exit_price": 99.865, + "exit_reason": "signal", + "exit_time": "2020-01-10T00:00:00", + "pnl": 19.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.745, + "entry_time": "2020-01-15T00:00:00", + "exit_price": 99.432, + "exit_reason": "signal", + "exit_time": "2020-01-16T00:00:00", + "pnl": -31.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.592, + "entry_time": "2020-01-21T00:00:00", + "exit_price": 99.213, + "exit_reason": "signal", + "exit_time": "2020-01-22T00:00:00", + "pnl": -37.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.933, + "entry_time": "2020-01-24T00:00:00", + "exit_price": 100.129, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": 19.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21, + "entry_time": "2020-01-30T00:00:00", + "exit_price": 99.284, + "exit_reason": "signal", + "exit_time": "2020-01-31T00:00:00", + "pnl": 7.400000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.414, + "entry_time": "2020-02-05T00:00:00", + "exit_price": 99.742, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 132.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.153, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 98.958, + "exit_reason": "signal", + "exit_time": "2020-02-12T00:00:00", + "pnl": -19.50000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.398, + "entry_time": "2020-02-14T00:00:00", + "exit_price": 98.714, + "exit_reason": "signal", + "exit_time": "2020-02-18T00:00:00", + "pnl": -68.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.687, + "entry_time": "2020-02-20T00:00:00", + "exit_price": 99.197, + "exit_reason": "signal", + "exit_time": "2020-02-21T00:00:00", + "pnl": 51.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.753, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 98.67, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -8.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.944, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.276, + "exit_reason": "signal", + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.967, + "entry_time": "2020-03-06T00:00:00", + "exit_price": 99.019, + "exit_reason": "signal", + "exit_time": "2020-03-09T00:00:00", + "pnl": -94.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.614, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 99.444, + "exit_reason": "signal", + "exit_time": "2020-03-13T00:00:00", + "pnl": -17.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.487, + "entry_time": "2020-03-18T00:00:00", + "exit_price": 98.539, + "exit_reason": "signal", + "exit_time": "2020-03-19T00:00:00", + "pnl": -94.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.361, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.394, + "exit_reason": "signal", + "exit_time": "2020-03-25T00:00:00", + "pnl": 103.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 99.783, + "exit_reason": "signal", + "exit_time": "2020-03-30T00:00:00", + "pnl": 40.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.044, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 100.006, + "exit_reason": "signal", + "exit_time": "2020-04-03T00:00:00", + "pnl": -3.7999999999992724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.073, + "entry_time": "2020-04-08T00:00:00", + "exit_price": 99.85, + "exit_reason": "signal", + "exit_time": "2020-04-09T00:00:00", + "pnl": -122.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.163, + "entry_time": "2020-04-14T00:00:00", + "exit_price": 99.598, + "exit_reason": "signal", + "exit_time": "2020-04-15T00:00:00", + "pnl": -56.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.024, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 100.102, + "exit_reason": "signal", + "exit_time": "2020-04-20T00:00:00", + "pnl": 7.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.475, + "entry_time": "2020-04-23T00:00:00", + "exit_price": 100.785, + "exit_reason": "signal", + "exit_time": "2020-04-24T00:00:00", + "pnl": 31.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.284, + "entry_time": "2020-04-29T00:00:00", + "exit_price": 100.408, + "exit_reason": "signal", + "exit_time": "2020-04-30T00:00:00", + "pnl": 12.399999999997817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.529, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.468, + "exit_reason": "signal", + "exit_time": "2020-05-06T00:00:00", + "pnl": -6.099999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.654, + "entry_time": "2020-05-08T00:00:00", + "exit_price": 100.845, + "exit_reason": "signal", + "exit_time": "2020-05-11T00:00:00", + "pnl": 19.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.833, + "entry_time": "2020-05-14T00:00:00", + "exit_price": 100.141, + "exit_reason": "signal", + "exit_time": "2020-05-15T00:00:00", + "pnl": -69.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.172, + "entry_time": "2020-05-20T00:00:00", + "exit_price": 100.89, + "exit_reason": "signal", + "exit_time": "2020-05-21T00:00:00", + "pnl": 171.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 99.429, + "exit_reason": "signal", + "exit_time": "2020-05-27T00:00:00", + "pnl": 56.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.671, + "entry_time": "2020-05-29T00:00:00", + "exit_price": 97.998, + "exit_reason": "signal", + "exit_time": "2020-06-01T00:00:00", + "pnl": -67.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.689, + "entry_time": "2020-06-04T00:00:00", + "exit_price": 98.907, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 21.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.789, + "entry_time": "2020-06-10T00:00:00", + "exit_price": 99.443, + "exit_reason": "signal", + "exit_time": "2020-06-11T00:00:00", + "pnl": 65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 98.913, + "exit_reason": "signal", + "exit_time": "2020-06-17T00:00:00", + "pnl": -39.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.359, + "entry_time": "2020-06-19T00:00:00", + "exit_price": 99.246, + "exit_reason": "signal", + "exit_time": "2020-06-22T00:00:00", + "pnl": -11.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-06-25T00:00:00", + "exit_price": 98.942, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": 8.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.476, + "entry_time": "2020-07-01T00:00:00", + "exit_price": 98.222, + "exit_reason": "signal", + "exit_time": "2020-07-02T00:00:00", + "pnl": -25.400000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.275, + "entry_time": "2020-07-07T00:00:00", + "exit_price": 99.229, + "exit_reason": "signal", + "exit_time": "2020-07-08T00:00:00", + "pnl": -4.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.847, + "entry_time": "2020-07-10T00:00:00", + "exit_price": 98.98, + "exit_reason": "signal", + "exit_time": "2020-07-13T00:00:00", + "pnl": 13.300000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.523, + "entry_time": "2020-07-16T00:00:00", + "exit_price": 98.848, + "exit_reason": "signal", + "exit_time": "2020-07-17T00:00:00", + "pnl": -67.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.079, + "entry_time": "2020-07-22T00:00:00", + "exit_price": 98.463, + "exit_reason": "signal", + "exit_time": "2020-07-23T00:00:00", + "pnl": 38.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.336, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 97.695, + "exit_reason": "signal", + "exit_time": "2020-07-29T00:00:00", + "pnl": -164.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.931, + "entry_time": "2020-07-31T00:00:00", + "exit_price": 98.053, + "exit_reason": "signal", + "exit_time": "2020-08-03T00:00:00", + "pnl": 12.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.956, + "entry_time": "2020-08-06T00:00:00", + "exit_price": 97.857, + "exit_reason": "signal", + "exit_time": "2020-08-07T00:00:00", + "pnl": -109.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.834, + "entry_time": "2020-08-12T00:00:00", + "exit_price": 97.257, + "exit_reason": "signal", + "exit_time": "2020-08-13T00:00:00", + "pnl": -57.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.416, + "exit_reason": "signal", + "exit_time": "2020-08-19T00:00:00", + "pnl": 25.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.923, + "entry_time": "2020-08-21T00:00:00", + "exit_price": 97.974, + "exit_reason": "signal", + "exit_time": "2020-08-24T00:00:00", + "pnl": 5.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.214, + "entry_time": "2020-08-27T00:00:00", + "exit_price": 98.083, + "exit_reason": "signal", + "exit_time": "2020-08-28T00:00:00", + "pnl": -113.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.001, + "entry_time": "2020-09-02T00:00:00", + "exit_price": 98.653, + "exit_reason": "signal", + "exit_time": "2020-09-03T00:00:00", + "pnl": 65.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.474, + "entry_time": "2020-09-08T00:00:00", + "exit_price": 98.313, + "exit_reason": "signal", + "exit_time": "2020-09-09T00:00:00", + "pnl": -116.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.732, + "entry_time": "2020-09-11T00:00:00", + "exit_price": 98.566, + "exit_reason": "signal", + "exit_time": "2020-09-14T00:00:00", + "pnl": 83.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.9, + "entry_time": "2020-09-17T00:00:00", + "exit_price": 98.388, + "exit_reason": "signal", + "exit_time": "2020-09-18T00:00:00", + "pnl": 148.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.12, + "entry_time": "2020-09-23T00:00:00", + "exit_price": 99.257, + "exit_reason": "signal", + "exit_time": "2020-09-24T00:00:00", + "pnl": 13.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.713, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.383, + "exit_reason": "signal", + "exit_time": "2020-09-30T00:00:00", + "pnl": 67.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.584, + "entry_time": "2020-10-02T00:00:00", + "exit_price": 99.318, + "exit_reason": "signal", + "exit_time": "2020-10-05T00:00:00", + "pnl": -26.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.115, + "entry_time": "2020-10-08T00:00:00", + "exit_price": 97.468, + "exit_reason": "signal", + "exit_time": "2020-10-09T00:00:00", + "pnl": -64.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.615, + "entry_time": "2020-10-14T00:00:00", + "exit_price": 98.16, + "exit_reason": "signal", + "exit_time": "2020-10-15T00:00:00", + "pnl": 54.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.362, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.412, + "exit_reason": "signal", + "exit_time": "2020-10-21T00:00:00", + "pnl": 105.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.782, + "entry_time": "2020-10-23T00:00:00", + "exit_price": 98.91, + "exit_reason": "signal", + "exit_time": "2020-10-26T00:00:00", + "pnl": 12.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.73, + "entry_time": "2020-10-29T00:00:00", + "exit_price": 98.608, + "exit_reason": "signal", + "exit_time": "2020-10-30T00:00:00", + "pnl": -12.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.216, + "entry_time": "2020-11-04T00:00:00", + "exit_price": 98.491, + "exit_reason": "signal", + "exit_time": "2020-11-05T00:00:00", + "pnl": -72.49999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.95, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 97.827, + "exit_reason": "signal", + "exit_time": "2020-11-11T00:00:00", + "pnl": -12.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.914, + "entry_time": "2020-11-13T00:00:00", + "exit_price": 98.93, + "exit_reason": "signal", + "exit_time": "2020-11-16T00:00:00", + "pnl": 1.6000000000003638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.475, + "entry_time": "2020-11-19T00:00:00", + "exit_price": 98.101, + "exit_reason": "signal", + "exit_time": "2020-11-20T00:00:00", + "pnl": -37.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.485, + "entry_time": "2020-11-25T00:00:00", + "exit_price": 98.641, + "exit_reason": "signal", + "exit_time": "2020-11-27T00:00:00", + "pnl": 15.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.76, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.799, + "exit_reason": "signal", + "exit_time": "2020-12-02T00:00:00", + "pnl": 3.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.985, + "entry_time": "2020-12-04T00:00:00", + "exit_price": 98.34, + "exit_reason": "signal", + "exit_time": "2020-12-07T00:00:00", + "pnl": 35.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.428, + "entry_time": "2020-12-10T00:00:00", + "exit_price": 96.632, + "exit_reason": "signal", + "exit_time": "2020-12-11T00:00:00", + "pnl": -79.59999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.731, + "entry_time": "2020-12-16T00:00:00", + "exit_price": 97.619, + "exit_reason": "signal", + "exit_time": "2020-12-17T00:00:00", + "pnl": 88.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.386, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 96.994, + "exit_reason": "signal", + "exit_time": "2020-12-23T00:00:00", + "pnl": -139.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.124, + "entry_time": "2020-12-28T00:00:00", + "exit_price": 97.539, + "exit_reason": "signal", + "exit_time": "2020-12-29T00:00:00", + "pnl": 41.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.603, + "entry_time": "2020-12-31T00:00:00", + "exit_price": 96.822, + "exit_reason": "signal", + "exit_time": "2021-01-04T00:00:00", + "pnl": -78.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.791, + "entry_time": "2021-01-06T00:00:00", + "exit_price": 97.115, + "exit_reason": "signal", + "exit_time": "2021-01-07T00:00:00", + "pnl": 32.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.811, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.28, + "exit_reason": "signal", + "exit_time": "2021-01-13T00:00:00", + "pnl": -53.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.533, + "entry_time": "2021-01-15T00:00:00", + "exit_price": 96.079, + "exit_reason": "signal", + "exit_time": "2021-01-19T00:00:00", + "pnl": -45.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.796, + "entry_time": "2021-01-21T00:00:00", + "exit_price": 95.248, + "exit_reason": "signal", + "exit_time": "2021-01-22T00:00:00", + "pnl": -54.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.556, + "entry_time": "2021-01-27T00:00:00", + "exit_price": 96.557, + "exit_reason": "signal", + "exit_time": "2021-01-28T00:00:00", + "pnl": 100.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.251, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.837, + "exit_reason": "signal", + "exit_time": "2021-02-03T00:00:00", + "pnl": -41.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.265, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 95.261, + "exit_reason": "signal", + "exit_time": "2021-02-08T00:00:00", + "pnl": -0.3999999999996362, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.948, + "entry_time": "2021-02-11T00:00:00", + "exit_price": 95.051, + "exit_reason": "signal", + "exit_time": "2021-02-12T00:00:00", + "pnl": 10.300000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97, + "entry_time": "2021-02-17T00:00:00", + "exit_price": 96.348, + "exit_reason": "signal", + "exit_time": "2021-02-18T00:00:00", + "pnl": -62.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.318, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.625, + "exit_reason": "signal", + "exit_time": "2021-02-24T00:00:00", + "pnl": -69.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2021-02-26T00:00:00", + "exit_price": 95.236, + "exit_reason": "signal", + "exit_time": "2021-03-01T00:00:00", + "pnl": 35.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.403, + "entry_time": "2021-03-04T00:00:00", + "exit_price": 94.323, + "exit_reason": "signal", + "exit_time": "2021-03-05T00:00:00", + "pnl": -8.000000000001819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.082, + "entry_time": "2021-03-10T00:00:00", + "exit_price": 94.588, + "exit_reason": "signal", + "exit_time": "2021-03-11T00:00:00", + "pnl": -49.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.802, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.783, + "exit_reason": "signal", + "exit_time": "2021-03-17T00:00:00", + "pnl": -1.9000000000014552, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.661, + "entry_time": "2021-03-19T00:00:00", + "exit_price": 95.004, + "exit_reason": "signal", + "exit_time": "2021-03-22T00:00:00", + "pnl": 134.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.499, + "entry_time": "2021-03-25T00:00:00", + "exit_price": 93.976, + "exit_reason": "signal", + "exit_time": "2021-03-26T00:00:00", + "pnl": -152.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.019, + "entry_time": "2021-03-31T00:00:00", + "exit_price": 94.256, + "exit_reason": "signal", + "exit_time": "2021-04-01T00:00:00", + "pnl": 23.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.471, + "entry_time": "2021-04-06T00:00:00", + "exit_price": 93.724, + "exit_reason": "signal", + "exit_time": "2021-04-07T00:00:00", + "pnl": 25.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.199, + "entry_time": "2021-04-09T00:00:00", + "exit_price": 93.341, + "exit_reason": "signal", + "exit_time": "2021-04-12T00:00:00", + "pnl": 14.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.729, + "entry_time": "2021-04-15T00:00:00", + "exit_price": 93.256, + "exit_reason": "signal", + "exit_time": "2021-04-16T00:00:00", + "pnl": -47.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.926, + "entry_time": "2021-04-21T00:00:00", + "exit_price": 94.143, + "exit_reason": "signal", + "exit_time": "2021-04-22T00:00:00", + "pnl": 121.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.774, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.493, + "exit_reason": "signal", + "exit_time": "2021-04-28T00:00:00", + "pnl": -28.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.685, + "entry_time": "2021-04-30T00:00:00", + "exit_price": 94.267, + "exit_reason": "signal", + "exit_time": "2021-05-03T00:00:00", + "pnl": 58.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.415, + "entry_time": "2021-05-06T00:00:00", + "exit_price": 93.364, + "exit_reason": "signal", + "exit_time": "2021-05-07T00:00:00", + "pnl": -5.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.742, + "entry_time": "2021-05-12T00:00:00", + "exit_price": 94.554, + "exit_reason": "signal", + "exit_time": "2021-05-13T00:00:00", + "pnl": 81.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.502, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 94.556, + "exit_reason": "signal", + "exit_time": "2021-05-19T00:00:00", + "pnl": 105.40000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.081, + "entry_time": "2021-05-21T00:00:00", + "exit_price": 92.813, + "exit_reason": "signal", + "exit_time": "2021-05-24T00:00:00", + "pnl": -26.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.953, + "entry_time": "2021-05-27T00:00:00", + "exit_price": 93.147, + "exit_reason": "signal", + "exit_time": "2021-05-28T00:00:00", + "pnl": 19.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.945, + "entry_time": "2021-06-02T00:00:00", + "exit_price": 92.896, + "exit_reason": "signal", + "exit_time": "2021-06-03T00:00:00", + "pnl": -4.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.577, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.284, + "exit_reason": "signal", + "exit_time": "2021-06-09T00:00:00", + "pnl": -129.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2021-06-11T00:00:00", + "exit_price": 92.333, + "exit_reason": "signal", + "exit_time": "2021-06-14T00:00:00", + "pnl": -79.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.95, + "entry_time": "2021-06-17T00:00:00", + "exit_price": 92.166, + "exit_reason": "signal", + "exit_time": "2021-06-18T00:00:00", + "pnl": 21.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.256, + "entry_time": "2021-06-23T00:00:00", + "exit_price": 92.456, + "exit_reason": "signal", + "exit_time": "2021-06-24T00:00:00", + "pnl": 20.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.731, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.788, + "exit_reason": "signal", + "exit_time": "2021-06-30T00:00:00", + "pnl": 5.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.941, + "entry_time": "2021-07-02T00:00:00", + "exit_price": 90.653, + "exit_reason": "signal", + "exit_time": "2021-07-06T00:00:00", + "pnl": -28.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.824, + "entry_time": "2021-07-08T00:00:00", + "exit_price": 91.78, + "exit_reason": "signal", + "exit_time": "2021-07-09T00:00:00", + "pnl": -4.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.098, + "entry_time": "2021-07-14T00:00:00", + "exit_price": 91.642, + "exit_reason": "signal", + "exit_time": "2021-07-15T00:00:00", + "pnl": 54.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.333, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.025, + "exit_reason": "signal", + "exit_time": "2021-07-21T00:00:00", + "pnl": -30.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.238, + "entry_time": "2021-07-23T00:00:00", + "exit_price": 91.959, + "exit_reason": "signal", + "exit_time": "2021-07-26T00:00:00", + "pnl": 72.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.122, + "entry_time": "2021-07-29T00:00:00", + "exit_price": 93.031, + "exit_reason": "signal", + "exit_time": "2021-07-30T00:00:00", + "pnl": 90.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16, + "entry_time": "2021-08-04T00:00:00", + "exit_price": 91.643, + "exit_reason": "signal", + "exit_time": "2021-08-05T00:00:00", + "pnl": -51.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.188, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 93.342, + "exit_reason": "signal", + "exit_time": "2021-08-11T00:00:00", + "pnl": 15.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.618, + "entry_time": "2021-08-13T00:00:00", + "exit_price": 94.259, + "exit_reason": "signal", + "exit_time": "2021-08-16T00:00:00", + "pnl": 64.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98, + "entry_time": "2021-08-19T00:00:00", + "exit_price": 93.988, + "exit_reason": "signal", + "exit_time": "2021-08-20T00:00:00", + "pnl": 100.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2021-08-25T00:00:00", + "exit_price": 92.705, + "exit_reason": "signal", + "exit_time": "2021-08-26T00:00:00", + "pnl": 2.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.361, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.802, + "exit_reason": "signal", + "exit_time": "2021-09-01T00:00:00", + "pnl": 144.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.154, + "entry_time": "2021-09-03T00:00:00", + "exit_price": 93.729, + "exit_reason": "signal", + "exit_time": "2021-09-07T00:00:00", + "pnl": 57.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.158, + "entry_time": "2021-09-09T00:00:00", + "exit_price": 93.741, + "exit_reason": "signal", + "exit_time": "2021-09-10T00:00:00", + "pnl": -41.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.019, + "entry_time": "2021-09-15T00:00:00", + "exit_price": 94.422, + "exit_reason": "signal", + "exit_time": "2021-09-16T00:00:00", + "pnl": -59.70000000000255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.354, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 94.986, + "exit_reason": "signal", + "exit_time": "2021-09-22T00:00:00", + "pnl": 63.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87, + "entry_time": "2021-09-24T00:00:00", + "exit_price": 94.849, + "exit_reason": "signal", + "exit_time": "2021-09-27T00:00:00", + "pnl": 97.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.309, + "entry_time": "2021-09-30T00:00:00", + "exit_price": 93.994, + "exit_reason": "signal", + "exit_time": "2021-10-01T00:00:00", + "pnl": -31.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.074, + "entry_time": "2021-10-06T00:00:00", + "exit_price": 94.048, + "exit_reason": "signal", + "exit_time": "2021-10-07T00:00:00", + "pnl": -2.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.849, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.437, + "exit_reason": "signal", + "exit_time": "2021-10-13T00:00:00", + "pnl": 58.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2021-10-15T00:00:00", + "exit_price": 95.093, + "exit_reason": "signal", + "exit_time": "2021-10-18T00:00:00", + "pnl": 72.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.029, + "entry_time": "2021-10-21T00:00:00", + "exit_price": 94.805, + "exit_reason": "signal", + "exit_time": "2021-10-22T00:00:00", + "pnl": 77.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.249, + "entry_time": "2021-10-27T00:00:00", + "exit_price": 93.601, + "exit_reason": "signal", + "exit_time": "2021-10-28T00:00:00", + "pnl": -64.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.241, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 94.429, + "exit_reason": "signal", + "exit_time": "2021-11-03T00:00:00", + "pnl": 118.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.416, + "entry_time": "2021-11-05T00:00:00", + "exit_price": 92.51, + "exit_reason": "signal", + "exit_time": "2021-11-08T00:00:00", + "pnl": -90.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96, + "entry_time": "2021-11-11T00:00:00", + "exit_price": 93.531, + "exit_reason": "signal", + "exit_time": "2021-11-12T00:00:00", + "pnl": 57.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.427, + "entry_time": "2021-11-17T00:00:00", + "exit_price": 92.196, + "exit_reason": "signal", + "exit_time": "2021-11-18T00:00:00", + "pnl": -23.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 93.982, + "exit_reason": "signal", + "exit_time": "2021-11-24T00:00:00", + "pnl": 146.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 91.736, + "exit_reason": "signal", + "exit_time": "2021-12-03T00:00:00", + "pnl": -8.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.704, + "entry_time": "2021-12-08T00:00:00", + "exit_price": 92.183, + "exit_reason": "signal", + "exit_time": "2021-12-09T00:00:00", + "pnl": 47.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.131, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.825, + "exit_reason": "signal", + "exit_time": "2021-12-15T00:00:00", + "pnl": 69.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.809, + "entry_time": "2021-12-17T00:00:00", + "exit_price": 93.226, + "exit_reason": "signal", + "exit_time": "2021-12-20T00:00:00", + "pnl": -58.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.067, + "entry_time": "2021-12-23T00:00:00", + "exit_price": 92.105, + "exit_reason": "signal", + "exit_time": "2021-12-27T00:00:00", + "pnl": -96.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.026, + "entry_time": "2021-12-29T00:00:00", + "exit_price": 93.011, + "exit_reason": "signal", + "exit_time": "2021-12-30T00:00:00", + "pnl": 98.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.067, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.642, + "exit_reason": "signal", + "exit_time": "2022-01-05T00:00:00", + "pnl": -42.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.202, + "entry_time": "2022-01-07T00:00:00", + "exit_price": 91.813, + "exit_reason": "signal", + "exit_time": "2022-01-10T00:00:00", + "pnl": -38.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.255, + "entry_time": "2022-01-13T00:00:00", + "exit_price": 91.975, + "exit_reason": "signal", + "exit_time": "2022-01-14T00:00:00", + "pnl": -28.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.763, + "entry_time": "2022-01-19T00:00:00", + "exit_price": 91.432, + "exit_reason": "signal", + "exit_time": "2022-01-20T00:00:00", + "pnl": -33.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.966, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.852, + "exit_reason": "signal", + "exit_time": "2022-01-26T00:00:00", + "pnl": -11.399999999997817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.814, + "entry_time": "2022-01-28T00:00:00", + "exit_price": 91.676, + "exit_reason": "signal", + "exit_time": "2022-01-31T00:00:00", + "pnl": 86.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.985, + "entry_time": "2022-02-03T00:00:00", + "exit_price": 91.188, + "exit_reason": "signal", + "exit_time": "2022-02-04T00:00:00", + "pnl": -79.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97, + "entry_time": "2022-02-09T00:00:00", + "exit_price": 92.17, + "exit_reason": "signal", + "exit_time": "2022-02-10T00:00:00", + "pnl": 20.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.507, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.156, + "exit_reason": "signal", + "exit_time": "2022-02-16T00:00:00", + "pnl": -35.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.661, + "entry_time": "2022-02-18T00:00:00", + "exit_price": 92.287, + "exit_reason": "signal", + "exit_time": "2022-02-22T00:00:00", + "pnl": 62.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.068, + "entry_time": "2022-02-24T00:00:00", + "exit_price": 91.351, + "exit_reason": "signal", + "exit_time": "2022-02-25T00:00:00", + "pnl": 28.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.094, + "entry_time": "2022-03-02T00:00:00", + "exit_price": 91.421, + "exit_reason": "signal", + "exit_time": "2022-03-03T00:00:00", + "pnl": -67.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.526, + "exit_reason": "signal", + "exit_time": "2022-03-09T00:00:00", + "pnl": -48.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.012, + "entry_time": "2022-03-11T00:00:00", + "exit_price": 90.821, + "exit_reason": "signal", + "exit_time": "2022-03-14T00:00:00", + "pnl": -19.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.925, + "entry_time": "2022-03-17T00:00:00", + "exit_price": 90.615, + "exit_reason": "signal", + "exit_time": "2022-03-18T00:00:00", + "pnl": -131.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.965, + "entry_time": "2022-03-23T00:00:00", + "exit_price": 90.7, + "exit_reason": "signal", + "exit_time": "2022-03-24T00:00:00", + "pnl": -26.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.683, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.694, + "exit_reason": "signal", + "exit_time": "2022-03-30T00:00:00", + "pnl": 101.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87, + "entry_time": "2022-04-01T00:00:00", + "exit_price": 90.055, + "exit_reason": "signal", + "exit_time": "2022-04-04T00:00:00", + "pnl": -81.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.631, + "entry_time": "2022-04-07T00:00:00", + "exit_price": 89.96, + "exit_reason": "signal", + "exit_time": "2022-04-08T00:00:00", + "pnl": -67.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.759, + "entry_time": "2022-04-13T00:00:00", + "exit_price": 90.978, + "exit_reason": "signal", + "exit_time": "2022-04-14T00:00:00", + "pnl": 121.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.009, + "entry_time": "2022-04-19T00:00:00", + "exit_price": 90.972, + "exit_reason": "signal", + "exit_time": "2022-04-20T00:00:00", + "pnl": 96.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.449, + "entry_time": "2022-04-22T00:00:00", + "exit_price": 89.939, + "exit_reason": "signal", + "exit_time": "2022-04-25T00:00:00", + "pnl": -51.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.137, + "entry_time": "2022-04-28T00:00:00", + "exit_price": 90.92, + "exit_reason": "signal", + "exit_time": "2022-04-29T00:00:00", + "pnl": 78.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.235, + "entry_time": "2022-05-04T00:00:00", + "exit_price": 92.161, + "exit_reason": "signal", + "exit_time": "2022-05-05T00:00:00", + "pnl": 92.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.242, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.392, + "exit_reason": "signal", + "exit_time": "2022-05-11T00:00:00", + "pnl": 114.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.798, + "entry_time": "2022-05-13T00:00:00", + "exit_price": 91.741, + "exit_reason": "signal", + "exit_time": "2022-05-16T00:00:00", + "pnl": -5.699999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129, + "entry_time": "2022-05-19T00:00:00", + "exit_price": 91.294, + "exit_reason": "signal", + "exit_time": "2022-05-20T00:00:00", + "pnl": 16.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.508, + "entry_time": "2022-05-25T00:00:00", + "exit_price": 90.206, + "exit_reason": "signal", + "exit_time": "2022-05-26T00:00:00", + "pnl": -30.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.881, + "entry_time": "2022-05-31T00:00:00", + "exit_price": 90.543, + "exit_reason": "signal", + "exit_time": "2022-06-01T00:00:00", + "pnl": 66.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.973, + "entry_time": "2022-06-03T00:00:00", + "exit_price": 90.741, + "exit_reason": "signal", + "exit_time": "2022-06-06T00:00:00", + "pnl": -23.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.848, + "entry_time": "2022-06-09T00:00:00", + "exit_price": 90.837, + "exit_reason": "signal", + "exit_time": "2022-06-10T00:00:00", + "pnl": -1.0999999999985448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.825, + "entry_time": "2022-06-15T00:00:00", + "exit_price": 90.17, + "exit_reason": "signal", + "exit_time": "2022-06-16T00:00:00", + "pnl": -65.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.553, + "entry_time": "2022-06-21T00:00:00", + "exit_price": 90.601, + "exit_reason": "signal", + "exit_time": "2022-06-22T00:00:00", + "pnl": 4.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.687, + "entry_time": "2022-06-24T00:00:00", + "exit_price": 90.053, + "exit_reason": "signal", + "exit_time": "2022-06-27T00:00:00", + "pnl": -63.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.794, + "entry_time": "2022-06-30T00:00:00", + "exit_price": 92.411, + "exit_reason": "signal", + "exit_time": "2022-07-01T00:00:00", + "pnl": 161.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.303, + "entry_time": "2022-07-06T00:00:00", + "exit_price": 90.141, + "exit_reason": "signal", + "exit_time": "2022-07-07T00:00:00", + "pnl": -116.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.156, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 90.998, + "exit_reason": "signal", + "exit_time": "2022-07-13T00:00:00", + "pnl": -15.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.512, + "entry_time": "2022-07-15T00:00:00", + "exit_price": 91.253, + "exit_reason": "signal", + "exit_time": "2022-07-18T00:00:00", + "pnl": 74.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.474, + "entry_time": "2022-07-21T00:00:00", + "exit_price": 89.988, + "exit_reason": "signal", + "exit_time": "2022-07-22T00:00:00", + "pnl": -148.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.051, + "entry_time": "2022-07-27T00:00:00", + "exit_price": 91.314, + "exit_reason": "signal", + "exit_time": "2022-07-28T00:00:00", + "pnl": 26.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.376, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.542, + "exit_reason": "signal", + "exit_time": "2022-08-03T00:00:00", + "pnl": 16.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.898, + "entry_time": "2022-08-05T00:00:00", + "exit_price": 92.023, + "exit_reason": "signal", + "exit_time": "2022-08-08T00:00:00", + "pnl": 12.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.244, + "entry_time": "2022-08-11T00:00:00", + "exit_price": 92.691, + "exit_reason": "signal", + "exit_time": "2022-08-12T00:00:00", + "pnl": 44.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.181, + "entry_time": "2022-08-17T00:00:00", + "exit_price": 92.495, + "exit_reason": "signal", + "exit_time": "2022-08-18T00:00:00", + "pnl": -68.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.024, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.281, + "exit_reason": "signal", + "exit_time": "2022-08-24T00:00:00", + "pnl": 25.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.724, + "entry_time": "2022-08-26T00:00:00", + "exit_price": 93.027, + "exit_reason": "signal", + "exit_time": "2022-08-29T00:00:00", + "pnl": -69.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.267, + "entry_time": "2022-09-01T00:00:00", + "exit_price": 93.319, + "exit_reason": "signal", + "exit_time": "2022-09-02T00:00:00", + "pnl": 5.200000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.866, + "entry_time": "2022-09-07T00:00:00", + "exit_price": 93.548, + "exit_reason": "signal", + "exit_time": "2022-09-08T00:00:00", + "pnl": 68.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.821, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 94.111, + "exit_reason": "signal", + "exit_time": "2022-09-14T00:00:00", + "pnl": 29.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.782, + "entry_time": "2022-09-16T00:00:00", + "exit_price": 94.266, + "exit_reason": "signal", + "exit_time": "2022-09-19T00:00:00", + "pnl": -51.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.888, + "entry_time": "2022-09-22T00:00:00", + "exit_price": 94.905, + "exit_reason": "signal", + "exit_time": "2022-09-23T00:00:00", + "pnl": 1.6999999999989086, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.211, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 93.622, + "exit_reason": "signal", + "exit_time": "2022-09-29T00:00:00", + "pnl": -58.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.289, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 95.218, + "exit_reason": "signal", + "exit_time": "2022-10-05T00:00:00", + "pnl": -7.099999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.625, + "entry_time": "2022-10-07T00:00:00", + "exit_price": 93.711, + "exit_reason": "signal", + "exit_time": "2022-10-10T00:00:00", + "pnl": -91.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22, + "entry_time": "2022-10-13T00:00:00", + "exit_price": 95.266, + "exit_reason": "signal", + "exit_time": "2022-10-14T00:00:00", + "pnl": 104.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.369, + "entry_time": "2022-10-19T00:00:00", + "exit_price": 94.388, + "exit_reason": "signal", + "exit_time": "2022-10-20T00:00:00", + "pnl": 101.90000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.253, + "exit_reason": "signal", + "exit_time": "2022-10-26T00:00:00", + "pnl": 21.899999999997817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.929, + "entry_time": "2022-10-28T00:00:00", + "exit_price": 95.019, + "exit_reason": "signal", + "exit_time": "2022-10-31T00:00:00", + "pnl": 9.000000000001819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.458, + "entry_time": "2022-11-03T00:00:00", + "exit_price": 95.965, + "exit_reason": "signal", + "exit_time": "2022-11-04T00:00:00", + "pnl": -49.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.237, + "entry_time": "2022-11-09T00:00:00", + "exit_price": 94.586, + "exit_reason": "signal", + "exit_time": "2022-11-10T00:00:00", + "pnl": -65.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.712, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.086, + "exit_reason": "signal", + "exit_time": "2022-11-16T00:00:00", + "pnl": 37.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.205, + "entry_time": "2022-11-18T00:00:00", + "exit_price": 94.623, + "exit_reason": "signal", + "exit_time": "2022-11-21T00:00:00", + "pnl": 41.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54, + "entry_time": "2022-11-25T00:00:00", + "exit_price": 92.916, + "exit_reason": "signal", + "exit_time": "2022-12-01T00:00:00", + "pnl": -62.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.256, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.359, + "exit_reason": "signal", + "exit_time": "2022-12-07T00:00:00", + "pnl": 10.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.218, + "entry_time": "2022-12-09T00:00:00", + "exit_price": 93.916, + "exit_reason": "signal", + "exit_time": "2022-12-12T00:00:00", + "pnl": 69.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.424, + "entry_time": "2022-12-15T00:00:00", + "exit_price": 92.996, + "exit_reason": "signal", + "exit_time": "2022-12-16T00:00:00", + "pnl": -42.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.738, + "entry_time": "2022-12-21T00:00:00", + "exit_price": 91.786, + "exit_reason": "signal", + "exit_time": "2022-12-22T00:00:00", + "pnl": 104.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.399, + "entry_time": "2022-12-27T00:00:00", + "exit_price": 92.116, + "exit_reason": "signal", + "exit_time": "2022-12-28T00:00:00", + "pnl": -28.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.771, + "entry_time": "2022-12-30T00:00:00", + "exit_price": 92.978, + "exit_reason": "signal", + "exit_time": "2023-01-03T00:00:00", + "pnl": 20.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.823, + "entry_time": "2023-01-05T00:00:00", + "exit_price": 92.889, + "exit_reason": "signal", + "exit_time": "2023-01-06T00:00:00", + "pnl": 6.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.776, + "entry_time": "2023-01-11T00:00:00", + "exit_price": 92.849, + "exit_reason": "signal", + "exit_time": "2023-01-12T00:00:00", + "pnl": 7.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.165, + "entry_time": "2023-01-17T00:00:00", + "exit_price": 93.645, + "exit_reason": "signal", + "exit_time": "2023-01-18T00:00:00", + "pnl": 48.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.349, + "entry_time": "2023-01-20T00:00:00", + "exit_price": 93.529, + "exit_reason": "signal", + "exit_time": "2023-01-23T00:00:00", + "pnl": 118.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.145, + "entry_time": "2023-01-26T00:00:00", + "exit_price": 93.092, + "exit_reason": "signal", + "exit_time": "2023-01-27T00:00:00", + "pnl": -105.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2023-02-01T00:00:00", + "exit_price": 92.672, + "exit_reason": "signal", + "exit_time": "2023-02-02T00:00:00", + "pnl": -136.20000000000255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.253, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.168, + "exit_reason": "signal", + "exit_time": "2023-02-08T00:00:00", + "pnl": -8.499999999998181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2023-02-10T00:00:00", + "exit_price": 94.092, + "exit_reason": "signal", + "exit_time": "2023-02-13T00:00:00", + "pnl": 96.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.536, + "entry_time": "2023-02-16T00:00:00", + "exit_price": 94.216, + "exit_reason": "signal", + "exit_time": "2023-02-17T00:00:00", + "pnl": -32.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.185, + "entry_time": "2023-02-22T00:00:00", + "exit_price": 93.989, + "exit_reason": "signal", + "exit_time": "2023-02-23T00:00:00", + "pnl": -19.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.454, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.437, + "exit_reason": "signal", + "exit_time": "2023-03-01T00:00:00", + "pnl": -1.7000000000007276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.958, + "entry_time": "2023-03-03T00:00:00", + "exit_price": 93.665, + "exit_reason": "signal", + "exit_time": "2023-03-06T00:00:00", + "pnl": -29.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35, + "entry_time": "2023-03-09T00:00:00", + "exit_price": 93.062, + "exit_reason": "signal", + "exit_time": "2023-03-10T00:00:00", + "pnl": -28.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.884, + "entry_time": "2023-03-15T00:00:00", + "exit_price": 94.082, + "exit_reason": "signal", + "exit_time": "2023-03-16T00:00:00", + "pnl": 19.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.295, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.05, + "exit_reason": "signal", + "exit_time": "2023-03-22T00:00:00", + "pnl": -24.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.845, + "entry_time": "2023-03-24T00:00:00", + "exit_price": 93.328, + "exit_reason": "signal", + "exit_time": "2023-03-27T00:00:00", + "pnl": 148.3000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.949, + "entry_time": "2023-03-30T00:00:00", + "exit_price": 93.548, + "exit_reason": "signal", + "exit_time": "2023-03-31T00:00:00", + "pnl": 59.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.731, + "entry_time": "2023-04-05T00:00:00", + "exit_price": 92.13, + "exit_reason": "signal", + "exit_time": "2023-04-06T00:00:00", + "pnl": -60.099999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.325, + "entry_time": "2023-04-11T00:00:00", + "exit_price": 92.404, + "exit_reason": "signal", + "exit_time": "2023-04-12T00:00:00", + "pnl": -92.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56, + "entry_time": "2023-04-14T00:00:00", + "exit_price": 92.829, + "exit_reason": "signal", + "exit_time": "2023-04-17T00:00:00", + "pnl": 26.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-04-20T00:00:00", + "exit_price": 92.951, + "exit_reason": "signal", + "exit_time": "2023-04-21T00:00:00", + "pnl": 15.19999999999709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.359, + "entry_time": "2023-04-26T00:00:00", + "exit_price": 92.905, + "exit_reason": "signal", + "exit_time": "2023-04-27T00:00:00", + "pnl": -45.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 92.829, + "exit_reason": "signal", + "exit_time": "2023-05-03T00:00:00", + "pnl": 14.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.067, + "entry_time": "2023-05-05T00:00:00", + "exit_price": 93.195, + "exit_reason": "signal", + "exit_time": "2023-05-08T00:00:00", + "pnl": 12.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.877, + "entry_time": "2023-05-11T00:00:00", + "exit_price": 93.476, + "exit_reason": "signal", + "exit_time": "2023-05-12T00:00:00", + "pnl": 159.90000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.775, + "entry_time": "2023-05-17T00:00:00", + "exit_price": 93.218, + "exit_reason": "signal", + "exit_time": "2023-05-18T00:00:00", + "pnl": 44.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.969, + "exit_reason": "signal", + "exit_time": "2023-05-24T00:00:00", + "pnl": 8.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.333, + "entry_time": "2023-05-26T00:00:00", + "exit_price": 94.059, + "exit_reason": "signal", + "exit_time": "2023-05-30T00:00:00", + "pnl": -27.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.762, + "entry_time": "2023-06-01T00:00:00", + "exit_price": 94.25, + "exit_reason": "signal", + "exit_time": "2023-06-02T00:00:00", + "pnl": 148.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.294, + "entry_time": "2023-06-07T00:00:00", + "exit_price": 94.603, + "exit_reason": "signal", + "exit_time": "2023-06-08T00:00:00", + "pnl": 30.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.427, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.339, + "exit_reason": "signal", + "exit_time": "2023-06-14T00:00:00", + "pnl": -8.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2023-06-16T00:00:00", + "exit_price": 94.163, + "exit_reason": "signal", + "exit_time": "2023-06-20T00:00:00", + "pnl": -20.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.953, + "entry_time": "2023-06-22T00:00:00", + "exit_price": 94.374, + "exit_reason": "signal", + "exit_time": "2023-06-23T00:00:00", + "pnl": -57.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.898, + "entry_time": "2023-06-28T00:00:00", + "exit_price": 94.566, + "exit_reason": "signal", + "exit_time": "2023-06-29T00:00:00", + "pnl": 66.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.277, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.941, + "exit_reason": "signal", + "exit_time": "2023-07-10T00:00:00", + "pnl": 66.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493, + "entry_time": "2023-07-13T00:00:00", + "exit_price": 94.347, + "exit_reason": "signal", + "exit_time": "2023-07-14T00:00:00", + "pnl": -14.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.237, + "entry_time": "2023-07-19T00:00:00", + "exit_price": 94.334, + "exit_reason": "signal", + "exit_time": "2023-07-20T00:00:00", + "pnl": 109.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.304, + "exit_reason": "signal", + "exit_time": "2023-07-26T00:00:00", + "pnl": -22.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.055, + "entry_time": "2023-07-28T00:00:00", + "exit_price": 93.971, + "exit_reason": "signal", + "exit_time": "2023-07-31T00:00:00", + "pnl": -8.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.498, + "entry_time": "2023-08-03T00:00:00", + "exit_price": 93.961, + "exit_reason": "signal", + "exit_time": "2023-08-04T00:00:00", + "pnl": 46.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.216, + "entry_time": "2023-08-09T00:00:00", + "exit_price": 93.228, + "exit_reason": "signal", + "exit_time": "2023-08-10T00:00:00", + "pnl": -98.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.656, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 94.398, + "exit_reason": "signal", + "exit_time": "2023-08-16T00:00:00", + "pnl": 174.1999999999989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.089, + "entry_time": "2023-08-18T00:00:00", + "exit_price": 93.399, + "exit_reason": "signal", + "exit_time": "2023-08-21T00:00:00", + "pnl": -69.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-08-24T00:00:00", + "exit_price": 93.688, + "exit_reason": "signal", + "exit_time": "2023-08-25T00:00:00", + "pnl": 88.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.791, + "entry_time": "2023-08-30T00:00:00", + "exit_price": 92.573, + "exit_reason": "signal", + "exit_time": "2023-08-31T00:00:00", + "pnl": -121.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.041, + "entry_time": "2023-09-05T00:00:00", + "exit_price": 94.468, + "exit_reason": "signal", + "exit_time": "2023-09-06T00:00:00", + "pnl": 142.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.237, + "entry_time": "2023-09-08T00:00:00", + "exit_price": 94.095, + "exit_reason": "signal", + "exit_time": "2023-09-11T00:00:00", + "pnl": -14.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.791, + "entry_time": "2023-09-14T00:00:00", + "exit_price": 94.029, + "exit_reason": "signal", + "exit_time": "2023-09-15T00:00:00", + "pnl": -76.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.173, + "entry_time": "2023-09-20T00:00:00", + "exit_price": 93.583, + "exit_reason": "signal", + "exit_time": "2023-09-21T00:00:00", + "pnl": -59.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.115, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.162, + "exit_reason": "signal", + "exit_time": "2023-09-27T00:00:00", + "pnl": -95.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.496, + "entry_time": "2023-09-29T00:00:00", + "exit_price": 92.842, + "exit_reason": "signal", + "exit_time": "2023-10-02T00:00:00", + "pnl": -65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.019, + "entry_time": "2023-10-05T00:00:00", + "exit_price": 92.773, + "exit_reason": "signal", + "exit_time": "2023-10-06T00:00:00", + "pnl": -24.600000000002183, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.345, + "entry_time": "2023-10-11T00:00:00", + "exit_price": 92.322, + "exit_reason": "signal", + "exit_time": "2023-10-12T00:00:00", + "pnl": -2.2999999999992724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.994, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.586, + "exit_reason": "signal", + "exit_time": "2023-10-18T00:00:00", + "pnl": -40.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.467, + "entry_time": "2023-10-20T00:00:00", + "exit_price": 92.361, + "exit_reason": "signal", + "exit_time": "2023-10-23T00:00:00", + "pnl": 89.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.379, + "entry_time": "2023-10-26T00:00:00", + "exit_price": 91.412, + "exit_reason": "signal", + "exit_time": "2023-10-27T00:00:00", + "pnl": -96.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43, + "entry_time": "2023-11-01T00:00:00", + "exit_price": 91.133, + "exit_reason": "signal", + "exit_time": "2023-11-02T00:00:00", + "pnl": -29.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.967, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.602, + "exit_reason": "signal", + "exit_time": "2023-11-08T00:00:00", + "pnl": 63.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.416, + "entry_time": "2023-11-10T00:00:00", + "exit_price": 92.325, + "exit_reason": "signal", + "exit_time": "2023-11-13T00:00:00", + "pnl": -9.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.945, + "entry_time": "2023-11-16T00:00:00", + "exit_price": 92.019, + "exit_reason": "signal", + "exit_time": "2023-11-17T00:00:00", + "pnl": -92.59999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.744, + "entry_time": "2023-11-22T00:00:00", + "exit_price": 93.688, + "exit_reason": "signal", + "exit_time": "2023-11-24T00:00:00", + "pnl": 94.40000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.139, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 92.476, + "exit_reason": "signal", + "exit_time": "2023-11-29T00:00:00", + "pnl": -166.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76, + "entry_time": "2023-12-01T00:00:00", + "exit_price": 93.448, + "exit_reason": "signal", + "exit_time": "2023-12-04T00:00:00", + "pnl": 68.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.583, + "entry_time": "2023-12-07T00:00:00", + "exit_price": 94.144, + "exit_reason": "signal", + "exit_time": "2023-12-08T00:00:00", + "pnl": 56.10000000000218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.056, + "entry_time": "2023-12-13T00:00:00", + "exit_price": 93.356, + "exit_reason": "signal", + "exit_time": "2023-12-14T00:00:00", + "pnl": 129.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.194, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 92.511, + "exit_reason": "signal", + "exit_time": "2023-12-20T00:00:00", + "pnl": 31.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.914, + "entry_time": "2023-12-22T00:00:00", + "exit_price": 92.894, + "exit_reason": "signal", + "exit_time": "2023-12-26T00:00:00", + "pnl": -101.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.128, + "entry_time": "2023-12-28T00:00:00", + "exit_price": 93.66, + "exit_reason": "signal", + "exit_time": "2023-12-29T00:00:00", + "pnl": 53.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.892, + "entry_time": "2024-01-03T00:00:00", + "exit_price": 94.589, + "exit_reason": "signal", + "exit_time": "2024-01-04T00:00:00", + "pnl": -30.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.077, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.764, + "exit_reason": "signal", + "exit_time": "2024-01-10T00:00:00", + "pnl": -31.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.805, + "entry_time": "2024-01-12T00:00:00", + "exit_price": 94.409, + "exit_reason": "signal", + "exit_time": "2024-01-16T00:00:00", + "pnl": -39.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.092, + "entry_time": "2024-01-18T00:00:00", + "exit_price": 94.92, + "exit_reason": "signal", + "exit_time": "2024-01-19T00:00:00", + "pnl": -17.200000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2024-01-24T00:00:00", + "exit_price": 95.417, + "exit_reason": "signal", + "exit_time": "2024-01-25T00:00:00", + "pnl": 53.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.117, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.586, + "exit_reason": "signal", + "exit_time": "2024-01-31T00:00:00", + "pnl": 46.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.519, + "entry_time": "2024-02-02T00:00:00", + "exit_price": 95.646, + "exit_reason": "signal", + "exit_time": "2024-02-05T00:00:00", + "pnl": 12.699999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.974, + "entry_time": "2024-02-08T00:00:00", + "exit_price": 96.257, + "exit_reason": "signal", + "exit_time": "2024-02-09T00:00:00", + "pnl": 128.3000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.384, + "entry_time": "2024-02-14T00:00:00", + "exit_price": 94.768, + "exit_reason": "signal", + "exit_time": "2024-02-15T00:00:00", + "pnl": 38.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.926, + "entry_time": "2024-02-20T00:00:00", + "exit_price": 95.284, + "exit_reason": "signal", + "exit_time": "2024-02-21T00:00:00", + "pnl": 35.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.645, + "entry_time": "2024-02-23T00:00:00", + "exit_price": 94.632, + "exit_reason": "signal", + "exit_time": "2024-02-26T00:00:00", + "pnl": -1.2999999999992724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.994, + "entry_time": "2024-02-29T00:00:00", + "exit_price": 93.516, + "exit_reason": "signal", + "exit_time": "2024-03-01T00:00:00", + "pnl": 52.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.208, + "entry_time": "2024-03-06T00:00:00", + "exit_price": 93.035, + "exit_reason": "signal", + "exit_time": "2024-03-07T00:00:00", + "pnl": -17.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.579, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.424, + "exit_reason": "signal", + "exit_time": "2024-03-13T00:00:00", + "pnl": -15.499999999998181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.322, + "entry_time": "2024-03-15T00:00:00", + "exit_price": 93.745, + "exit_reason": "signal", + "exit_time": "2024-03-18T00:00:00", + "pnl": 42.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.567, + "entry_time": "2024-03-21T00:00:00", + "exit_price": 90.994, + "exit_reason": "signal", + "exit_time": "2024-03-22T00:00:00", + "pnl": -157.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.365, + "entry_time": "2024-03-27T00:00:00", + "exit_price": 92.886, + "exit_reason": "signal", + "exit_time": "2024-03-28T00:00:00", + "pnl": 52.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.875, + "entry_time": "2024-04-02T00:00:00", + "exit_price": 92.605, + "exit_reason": "signal", + "exit_time": "2024-04-03T00:00:00", + "pnl": -27.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.203, + "entry_time": "2024-04-05T00:00:00", + "exit_price": 92.389, + "exit_reason": "signal", + "exit_time": "2024-04-08T00:00:00", + "pnl": 18.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.968, + "entry_time": "2024-04-11T00:00:00", + "exit_price": 91.888, + "exit_reason": "signal", + "exit_time": "2024-04-12T00:00:00", + "pnl": -8.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.872, + "entry_time": "2024-04-17T00:00:00", + "exit_price": 92.005, + "exit_reason": "signal", + "exit_time": "2024-04-18T00:00:00", + "pnl": -86.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.847, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 91.521, + "exit_reason": "signal", + "exit_time": "2024-04-24T00:00:00", + "pnl": -132.59999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.615, + "entry_time": "2024-04-26T00:00:00", + "exit_price": 92.84, + "exit_reason": "signal", + "exit_time": "2024-04-29T00:00:00", + "pnl": 22.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.018, + "entry_time": "2024-05-02T00:00:00", + "exit_price": 93.195, + "exit_reason": "signal", + "exit_time": "2024-05-03T00:00:00", + "pnl": 117.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.761, + "entry_time": "2024-05-08T00:00:00", + "exit_price": 93.992, + "exit_reason": "signal", + "exit_time": "2024-05-09T00:00:00", + "pnl": 23.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.186, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.292, + "exit_reason": "signal", + "exit_time": "2024-05-15T00:00:00", + "pnl": 10.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.053, + "entry_time": "2024-05-17T00:00:00", + "exit_price": 92.898, + "exit_reason": "signal", + "exit_time": "2024-05-20T00:00:00", + "pnl": -15.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.003, + "entry_time": "2024-05-23T00:00:00", + "exit_price": 93.803, + "exit_reason": "signal", + "exit_time": "2024-05-24T00:00:00", + "pnl": 80.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2024-05-29T00:00:00", + "exit_price": 93.551, + "exit_reason": "signal", + "exit_time": "2024-05-30T00:00:00", + "pnl": 2.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.921, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.378, + "exit_reason": "signal", + "exit_time": "2024-06-05T00:00:00", + "pnl": -54.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.738, + "entry_time": "2024-06-07T00:00:00", + "exit_price": 94.058, + "exit_reason": "signal", + "exit_time": "2024-06-10T00:00:00", + "pnl": 32.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.716, + "entry_time": "2024-06-13T00:00:00", + "exit_price": 92.354, + "exit_reason": "signal", + "exit_time": "2024-06-14T00:00:00", + "pnl": -36.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.204, + "entry_time": "2024-06-20T00:00:00", + "exit_price": 93.86, + "exit_reason": "signal", + "exit_time": "2024-06-26T00:00:00", + "pnl": -34.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.769, + "entry_time": "2024-06-28T00:00:00", + "exit_price": 94.267, + "exit_reason": "signal", + "exit_time": "2024-07-01T00:00:00", + "pnl": 149.79999999999745, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.501, + "entry_time": "2024-07-05T00:00:00", + "exit_price": 92.972, + "exit_reason": "signal", + "exit_time": "2024-07-11T00:00:00", + "pnl": -52.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.501, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.553, + "exit_reason": "signal", + "exit_time": "2024-07-17T00:00:00", + "pnl": 5.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.928, + "entry_time": "2024-07-19T00:00:00", + "exit_price": 92.018, + "exit_reason": "signal", + "exit_time": "2024-07-22T00:00:00", + "pnl": 9.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.988, + "entry_time": "2024-07-25T00:00:00", + "exit_price": 92.135, + "exit_reason": "signal", + "exit_time": "2024-07-26T00:00:00", + "pnl": 14.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.856, + "entry_time": "2024-07-31T00:00:00", + "exit_price": 92.251, + "exit_reason": "signal", + "exit_time": "2024-08-01T00:00:00", + "pnl": 39.50000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.903, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.614, + "exit_reason": "signal", + "exit_time": "2024-08-07T00:00:00", + "pnl": -28.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.266, + "entry_time": "2024-08-09T00:00:00", + "exit_price": 93.255, + "exit_reason": "signal", + "exit_time": "2024-08-12T00:00:00", + "pnl": 98.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.888, + "entry_time": "2024-08-15T00:00:00", + "exit_price": 92.534, + "exit_reason": "signal", + "exit_time": "2024-08-16T00:00:00", + "pnl": -35.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.352, + "entry_time": "2024-08-21T00:00:00", + "exit_price": 93.822, + "exit_reason": "signal", + "exit_time": "2024-08-22T00:00:00", + "pnl": 47.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.143, + "exit_reason": "signal", + "exit_time": "2024-08-28T00:00:00", + "pnl": 112.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.316, + "entry_time": "2024-08-30T00:00:00", + "exit_price": 92.433, + "exit_reason": "signal", + "exit_time": "2024-09-03T00:00:00", + "pnl": -188.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.742, + "entry_time": "2024-09-05T00:00:00", + "exit_price": 93.047, + "exit_reason": "signal", + "exit_time": "2024-09-06T00:00:00", + "pnl": 30.49999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.668, + "entry_time": "2024-09-11T00:00:00", + "exit_price": 91.661, + "exit_reason": "signal", + "exit_time": "2024-09-12T00:00:00", + "pnl": -100.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.179, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.58, + "exit_reason": "signal", + "exit_time": "2024-09-18T00:00:00", + "pnl": 40.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.285, + "entry_time": "2024-09-20T00:00:00", + "exit_price": 90.104, + "exit_reason": "signal", + "exit_time": "2024-09-23T00:00:00", + "pnl": -18.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.052, + "entry_time": "2024-09-26T00:00:00", + "exit_price": 91.204, + "exit_reason": "signal", + "exit_time": "2024-09-27T00:00:00", + "pnl": 15.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.551, + "entry_time": "2024-10-02T00:00:00", + "exit_price": 90.177, + "exit_reason": "signal", + "exit_time": "2024-10-03T00:00:00", + "pnl": -137.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 91.072, + "exit_reason": "signal", + "exit_time": "2024-10-09T00:00:00", + "pnl": 24.200000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.139, + "entry_time": "2024-10-11T00:00:00", + "exit_price": 90.93, + "exit_reason": "signal", + "exit_time": "2024-10-14T00:00:00", + "pnl": -20.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.494, + "entry_time": "2024-10-17T00:00:00", + "exit_price": 89.863, + "exit_reason": "signal", + "exit_time": "2024-10-18T00:00:00", + "pnl": -63.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.811, + "entry_time": "2024-10-23T00:00:00", + "exit_price": 89.547, + "exit_reason": "signal", + "exit_time": "2024-10-24T00:00:00", + "pnl": -26.400000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.856, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.886, + "exit_reason": "signal", + "exit_time": "2024-10-30T00:00:00", + "pnl": 3.000000000001819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52, + "entry_time": "2024-11-01T00:00:00", + "exit_price": 89.584, + "exit_reason": "signal", + "exit_time": "2024-11-04T00:00:00", + "pnl": 106.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.328, + "entry_time": "2024-11-07T00:00:00", + "exit_price": 89.065, + "exit_reason": "signal", + "exit_time": "2024-11-08T00:00:00", + "pnl": -26.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21, + "entry_time": "2024-11-13T00:00:00", + "exit_price": 88.452, + "exit_reason": "signal", + "exit_time": "2024-11-14T00:00:00", + "pnl": -75.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.859, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.672, + "exit_reason": "signal", + "exit_time": "2024-11-20T00:00:00", + "pnl": 81.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.369, + "entry_time": "2024-11-22T00:00:00", + "exit_price": 89.07, + "exit_reason": "signal", + "exit_time": "2024-11-25T00:00:00", + "pnl": -29.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.844, + "entry_time": "2024-11-29T00:00:00", + "exit_price": 89.039, + "exit_reason": "signal", + "exit_time": "2024-12-05T00:00:00", + "pnl": 19.5, + "size": 100.0 + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.119, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 100.032, + "exit_time": "2020-01-06T21:00:00+00:00", + "pnl": -108.70000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.672, + "entry_time": "2020-01-09T21:00:00+00:00", + "exit_price": 99.86500000000001, + "exit_time": "2020-01-10T21:00:00+00:00", + "pnl": 19.300000000001205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.745, + "entry_time": "2020-01-15T21:00:00+00:00", + "exit_price": 99.432, + "exit_time": "2020-01-16T21:00:00+00:00", + "pnl": -31.30000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.592, + "entry_time": "2020-01-21T21:00:00+00:00", + "exit_price": 99.21300000000001, + "exit_time": "2020-01-22T21:00:00+00:00", + "pnl": -37.89999999999907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.933, + "entry_time": "2020-01-24T21:00:00+00:00", + "exit_price": 100.129, + "exit_time": "2020-01-27T21:00:00+00:00", + "pnl": 19.599999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21000000000001, + "entry_time": "2020-01-30T21:00:00+00:00", + "exit_price": 99.284, + "exit_time": "2020-01-31T21:00:00+00:00", + "pnl": 7.399999999999807, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.414, + "entry_time": "2020-02-05T21:00:00+00:00", + "exit_price": 99.742, + "exit_time": "2020-02-06T21:00:00+00:00", + "pnl": 132.8000000000003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.153, + "entry_time": "2020-02-10T21:00:00+00:00", + "exit_price": 98.958, + "exit_time": "2020-02-12T21:00:00+00:00", + "pnl": -19.50000000000074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.398, + "entry_time": "2020-02-14T21:00:00+00:00", + "exit_price": 98.714, + "exit_time": "2020-02-18T21:00:00+00:00", + "pnl": -68.39999999999975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.687, + "entry_time": "2020-02-20T21:00:00+00:00", + "exit_price": 99.197, + "exit_time": "2020-02-21T21:00:00+00:00", + "pnl": 51.00000000000051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.753, + "entry_time": "2020-02-26T21:00:00+00:00", + "exit_price": 98.67, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -8.29999999999984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.944, + "entry_time": "2020-03-02T21:00:00+00:00", + "exit_price": 99.276, + "exit_time": "2020-03-04T21:00:00+00:00", + "pnl": -66.80000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.967, + "entry_time": "2020-03-06T21:00:00+00:00", + "exit_price": 99.019, + "exit_time": "2020-03-09T20:00:00+00:00", + "pnl": -94.79999999999933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.614, + "entry_time": "2020-03-12T20:00:00+00:00", + "exit_price": 99.444, + "exit_time": "2020-03-13T20:00:00+00:00", + "pnl": -17.00000000000017, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.48700000000001, + "entry_time": "2020-03-18T20:00:00+00:00", + "exit_price": 98.539, + "exit_time": "2020-03-19T20:00:00+00:00", + "pnl": -94.80000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.361, + "entry_time": "2020-03-23T20:00:00+00:00", + "exit_price": 99.394, + "exit_time": "2020-03-25T20:00:00+00:00", + "pnl": 103.30000000000013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38, + "entry_time": "2020-03-27T20:00:00+00:00", + "exit_price": 99.783, + "exit_time": "2020-03-30T20:00:00+00:00", + "pnl": 40.30000000000058, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.044, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 100.006, + "exit_time": "2020-04-03T20:00:00+00:00", + "pnl": -3.7999999999996703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.07300000000001, + "entry_time": "2020-04-08T20:00:00+00:00", + "exit_price": 99.85000000000001, + "exit_time": "2020-04-09T20:00:00+00:00", + "pnl": -122.2999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.163, + "entry_time": "2020-04-14T20:00:00+00:00", + "exit_price": 99.598, + "exit_time": "2020-04-15T20:00:00+00:00", + "pnl": -56.49999999999977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.024, + "entry_time": "2020-04-17T20:00:00+00:00", + "exit_price": 100.102, + "exit_time": "2020-04-20T20:00:00+00:00", + "pnl": 7.800000000000296, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.47500000000001, + "entry_time": "2020-04-23T20:00:00+00:00", + "exit_price": 100.785, + "exit_time": "2020-04-24T20:00:00+00:00", + "pnl": 30.999999999998806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.284, + "entry_time": "2020-04-29T20:00:00+00:00", + "exit_price": 100.408, + "exit_time": "2020-04-30T20:00:00+00:00", + "pnl": 12.399999999999523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.529, + "entry_time": "2020-05-04T20:00:00+00:00", + "exit_price": 100.468, + "exit_time": "2020-05-06T20:00:00+00:00", + "pnl": -6.099999999999284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.654, + "entry_time": "2020-05-08T20:00:00+00:00", + "exit_price": 100.845, + "exit_time": "2020-05-11T20:00:00+00:00", + "pnl": 19.10000000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.833, + "entry_time": "2020-05-14T20:00:00+00:00", + "exit_price": 100.141, + "exit_time": "2020-05-15T20:00:00+00:00", + "pnl": -69.1999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.172, + "entry_time": "2020-05-20T20:00:00+00:00", + "exit_price": 100.89, + "exit_time": "2020-05-21T20:00:00+00:00", + "pnl": 171.80000000000035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-05-26T20:00:00+00:00", + "exit_price": 99.429, + "exit_time": "2020-05-27T20:00:00+00:00", + "pnl": 56.90000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.671, + "entry_time": "2020-05-29T20:00:00+00:00", + "exit_price": 97.998, + "exit_time": "2020-06-01T20:00:00+00:00", + "pnl": -67.30000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68900000000001, + "entry_time": "2020-06-04T20:00:00+00:00", + "exit_price": 98.907, + "exit_time": "2020-06-05T20:00:00+00:00", + "pnl": 21.79999999999893, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.789, + "entry_time": "2020-06-10T20:00:00+00:00", + "exit_price": 99.443, + "exit_time": "2020-06-11T20:00:00+00:00", + "pnl": 65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31, + "entry_time": "2020-06-15T20:00:00+00:00", + "exit_price": 98.913, + "exit_time": "2020-06-17T20:00:00+00:00", + "pnl": -39.70000000000056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.35900000000001, + "entry_time": "2020-06-19T20:00:00+00:00", + "exit_price": 99.246, + "exit_time": "2020-06-22T20:00:00+00:00", + "pnl": -11.300000000001376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-06-25T20:00:00+00:00", + "exit_price": 98.94200000000001, + "exit_time": "2020-06-26T20:00:00+00:00", + "pnl": 8.200000000000784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.476, + "entry_time": "2020-07-01T20:00:00+00:00", + "exit_price": 98.22200000000001, + "exit_time": "2020-07-02T20:00:00+00:00", + "pnl": -25.399999999999068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.275, + "entry_time": "2020-07-07T20:00:00+00:00", + "exit_price": 99.229, + "exit_time": "2020-07-08T20:00:00+00:00", + "pnl": -4.600000000000648, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84700000000001, + "entry_time": "2020-07-10T20:00:00+00:00", + "exit_price": 98.98, + "exit_time": "2020-07-13T20:00:00+00:00", + "pnl": 13.299999999999557, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.523, + "entry_time": "2020-07-16T20:00:00+00:00", + "exit_price": 98.848, + "exit_time": "2020-07-17T20:00:00+00:00", + "pnl": -67.49999999999972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07900000000001, + "entry_time": "2020-07-22T20:00:00+00:00", + "exit_price": 98.46300000000001, + "exit_time": "2020-07-23T20:00:00+00:00", + "pnl": 38.400000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.336, + "entry_time": "2020-07-27T20:00:00+00:00", + "exit_price": 97.69500000000001, + "exit_time": "2020-07-29T20:00:00+00:00", + "pnl": -164.0999999999991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.931, + "entry_time": "2020-07-31T20:00:00+00:00", + "exit_price": 98.053, + "exit_time": "2020-08-03T20:00:00+00:00", + "pnl": 12.199999999999989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.956, + "entry_time": "2020-08-06T20:00:00+00:00", + "exit_price": 97.857, + "exit_time": "2020-08-07T20:00:00+00:00", + "pnl": -109.90000000000038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.834, + "entry_time": "2020-08-12T20:00:00+00:00", + "exit_price": 97.257, + "exit_time": "2020-08-13T20:00:00+00:00", + "pnl": -57.69999999999982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16, + "entry_time": "2020-08-17T20:00:00+00:00", + "exit_price": 98.416, + "exit_time": "2020-08-19T20:00:00+00:00", + "pnl": 25.600000000000023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.923, + "entry_time": "2020-08-21T20:00:00+00:00", + "exit_price": 97.974, + "exit_time": "2020-08-24T20:00:00+00:00", + "pnl": 5.100000000000193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.214, + "entry_time": "2020-08-27T20:00:00+00:00", + "exit_price": 98.083, + "exit_time": "2020-08-28T20:00:00+00:00", + "pnl": -113.10000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.001, + "entry_time": "2020-09-02T20:00:00+00:00", + "exit_price": 98.653, + "exit_time": "2020-09-03T20:00:00+00:00", + "pnl": 65.2000000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.474, + "entry_time": "2020-09-08T20:00:00+00:00", + "exit_price": 98.313, + "exit_time": "2020-09-09T20:00:00+00:00", + "pnl": -116.10000000000014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.732, + "entry_time": "2020-09-11T20:00:00+00:00", + "exit_price": 98.566, + "exit_time": "2020-09-14T20:00:00+00:00", + "pnl": 83.40000000000032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.9, + "entry_time": "2020-09-17T20:00:00+00:00", + "exit_price": 98.388, + "exit_time": "2020-09-18T20:00:00+00:00", + "pnl": 148.79999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.12, + "entry_time": "2020-09-23T20:00:00+00:00", + "exit_price": 99.257, + "exit_time": "2020-09-24T20:00:00+00:00", + "pnl": 13.700000000000045, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.71300000000001, + "entry_time": "2020-09-28T20:00:00+00:00", + "exit_price": 99.383, + "exit_time": "2020-09-30T20:00:00+00:00", + "pnl": 66.99999999999875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.584, + "entry_time": "2020-10-02T20:00:00+00:00", + "exit_price": 99.318, + "exit_time": "2020-10-05T20:00:00+00:00", + "pnl": -26.600000000000534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11500000000001, + "entry_time": "2020-10-08T20:00:00+00:00", + "exit_price": 97.468, + "exit_time": "2020-10-09T20:00:00+00:00", + "pnl": -64.70000000000056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.61500000000001, + "entry_time": "2020-10-14T20:00:00+00:00", + "exit_price": 98.16, + "exit_time": "2020-10-15T20:00:00+00:00", + "pnl": 54.49999999999875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.36200000000001, + "entry_time": "2020-10-19T20:00:00+00:00", + "exit_price": 98.412, + "exit_time": "2020-10-21T20:00:00+00:00", + "pnl": 104.99999999999972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.782, + "entry_time": "2020-10-23T20:00:00+00:00", + "exit_price": 98.91, + "exit_time": "2020-10-26T20:00:00+00:00", + "pnl": 12.800000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.73, + "entry_time": "2020-10-29T20:00:00+00:00", + "exit_price": 98.608, + "exit_time": "2020-10-30T20:00:00+00:00", + "pnl": -12.199999999999989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21600000000001, + "entry_time": "2020-11-04T21:00:00+00:00", + "exit_price": 98.491, + "exit_time": "2020-11-05T21:00:00+00:00", + "pnl": -72.50000000000085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.95, + "entry_time": "2020-11-09T21:00:00+00:00", + "exit_price": 97.827, + "exit_time": "2020-11-11T21:00:00+00:00", + "pnl": -12.300000000000466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.914, + "entry_time": "2020-11-13T21:00:00+00:00", + "exit_price": 98.93, + "exit_time": "2020-11-16T21:00:00+00:00", + "pnl": 1.6000000000005343, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47500000000001, + "entry_time": "2020-11-19T21:00:00+00:00", + "exit_price": 98.101, + "exit_time": "2020-11-20T21:00:00+00:00", + "pnl": -37.400000000000944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.485, + "entry_time": "2020-11-25T21:00:00+00:00", + "exit_price": 98.641, + "exit_time": "2020-11-27T18:00:00+00:00", + "pnl": 15.600000000000591, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.76, + "entry_time": "2020-11-30T21:00:00+00:00", + "exit_price": 97.799, + "exit_time": "2020-12-02T21:00:00+00:00", + "pnl": 3.900000000000148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.985, + "entry_time": "2020-12-04T21:00:00+00:00", + "exit_price": 98.34, + "exit_time": "2020-12-07T21:00:00+00:00", + "pnl": 35.5000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.428, + "entry_time": "2020-12-10T21:00:00+00:00", + "exit_price": 96.632, + "exit_time": "2020-12-11T21:00:00+00:00", + "pnl": -79.59999999999923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.73100000000001, + "entry_time": "2020-12-16T21:00:00+00:00", + "exit_price": 97.619, + "exit_time": "2020-12-17T21:00:00+00:00", + "pnl": 88.7999999999991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.386, + "entry_time": "2020-12-21T21:00:00+00:00", + "exit_price": 96.994, + "exit_time": "2020-12-23T21:00:00+00:00", + "pnl": -139.1999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.124, + "entry_time": "2020-12-28T21:00:00+00:00", + "exit_price": 97.539, + "exit_time": "2020-12-29T21:00:00+00:00", + "pnl": 41.500000000000625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.60300000000001, + "entry_time": "2020-12-31T21:00:00+00:00", + "exit_price": 96.822, + "exit_time": "2021-01-04T21:00:00+00:00", + "pnl": -78.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.791, + "entry_time": "2021-01-06T21:00:00+00:00", + "exit_price": 97.11500000000001, + "exit_time": "2021-01-07T21:00:00+00:00", + "pnl": 32.40000000000123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.811, + "entry_time": "2021-01-11T21:00:00+00:00", + "exit_price": 96.28, + "exit_time": "2021-01-13T21:00:00+00:00", + "pnl": -53.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.533, + "entry_time": "2021-01-15T21:00:00+00:00", + "exit_price": 96.07900000000001, + "exit_time": "2021-01-19T21:00:00+00:00", + "pnl": -45.39999999999935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.796, + "entry_time": "2021-01-21T21:00:00+00:00", + "exit_price": 95.248, + "exit_time": "2021-01-22T21:00:00+00:00", + "pnl": -54.80000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.556, + "entry_time": "2021-01-27T21:00:00+00:00", + "exit_price": 96.557, + "exit_time": "2021-01-28T21:00:00+00:00", + "pnl": 100.10000000000048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.251, + "entry_time": "2021-02-01T21:00:00+00:00", + "exit_price": 95.837, + "exit_time": "2021-02-03T21:00:00+00:00", + "pnl": -41.40000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.265, + "entry_time": "2021-02-05T21:00:00+00:00", + "exit_price": 95.261, + "exit_time": "2021-02-08T21:00:00+00:00", + "pnl": -0.40000000000048885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94800000000001, + "entry_time": "2021-02-11T21:00:00+00:00", + "exit_price": 95.051, + "exit_time": "2021-02-12T21:00:00+00:00", + "pnl": 10.299999999999443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97, + "entry_time": "2021-02-17T21:00:00+00:00", + "exit_price": 96.348, + "exit_time": "2021-02-18T21:00:00+00:00", + "pnl": -62.19999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.318, + "entry_time": "2021-02-22T21:00:00+00:00", + "exit_price": 95.625, + "exit_time": "2021-02-24T21:00:00+00:00", + "pnl": -69.29999999999978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2021-02-26T21:00:00+00:00", + "exit_price": 95.236, + "exit_time": "2021-03-01T21:00:00+00:00", + "pnl": 35.00000000000085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.403, + "entry_time": "2021-03-04T21:00:00+00:00", + "exit_price": 94.32300000000001, + "exit_time": "2021-03-05T21:00:00+00:00", + "pnl": -7.9999999999998295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.08200000000001, + "entry_time": "2021-03-10T21:00:00+00:00", + "exit_price": 94.58800000000001, + "exit_time": "2021-03-11T21:00:00+00:00", + "pnl": -49.39999999999998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.802, + "entry_time": "2021-03-15T20:00:00+00:00", + "exit_price": 94.783, + "exit_time": "2021-03-17T20:00:00+00:00", + "pnl": -1.9000000000005457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.661, + "entry_time": "2021-03-19T20:00:00+00:00", + "exit_price": 95.004, + "exit_time": "2021-03-22T20:00:00+00:00", + "pnl": 134.30000000000035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.499, + "entry_time": "2021-03-25T20:00:00+00:00", + "exit_price": 93.976, + "exit_time": "2021-03-26T20:00:00+00:00", + "pnl": -152.2999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.019, + "entry_time": "2021-03-31T20:00:00+00:00", + "exit_price": 94.256, + "exit_time": "2021-04-01T20:00:00+00:00", + "pnl": 23.699999999999477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.471, + "entry_time": "2021-04-06T20:00:00+00:00", + "exit_price": 93.724, + "exit_time": "2021-04-07T20:00:00+00:00", + "pnl": 25.30000000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.199, + "entry_time": "2021-04-09T20:00:00+00:00", + "exit_price": 93.34100000000001, + "exit_time": "2021-04-12T20:00:00+00:00", + "pnl": 14.200000000001012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.729, + "entry_time": "2021-04-15T20:00:00+00:00", + "exit_price": 93.256, + "exit_time": "2021-04-16T20:00:00+00:00", + "pnl": -47.2999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.926, + "entry_time": "2021-04-21T20:00:00+00:00", + "exit_price": 94.143, + "exit_time": "2021-04-22T20:00:00+00:00", + "pnl": 121.69999999999987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.774, + "entry_time": "2021-04-26T20:00:00+00:00", + "exit_price": 93.493, + "exit_time": "2021-04-28T20:00:00+00:00", + "pnl": -28.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.685, + "entry_time": "2021-04-30T20:00:00+00:00", + "exit_price": 94.267, + "exit_time": "2021-05-03T20:00:00+00:00", + "pnl": 58.19999999999936, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.415, + "entry_time": "2021-05-06T20:00:00+00:00", + "exit_price": 93.364, + "exit_time": "2021-05-07T20:00:00+00:00", + "pnl": -5.100000000000193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.742, + "entry_time": "2021-05-12T20:00:00+00:00", + "exit_price": 94.554, + "exit_time": "2021-05-13T20:00:00+00:00", + "pnl": 81.19999999999976, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.502, + "entry_time": "2021-05-17T20:00:00+00:00", + "exit_price": 94.556, + "exit_time": "2021-05-19T20:00:00+00:00", + "pnl": 105.4000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.081, + "entry_time": "2021-05-21T20:00:00+00:00", + "exit_price": 92.813, + "exit_time": "2021-05-24T20:00:00+00:00", + "pnl": -26.800000000000068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.953, + "entry_time": "2021-05-27T20:00:00+00:00", + "exit_price": 93.147, + "exit_time": "2021-05-28T20:00:00+00:00", + "pnl": 19.40000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94500000000001, + "entry_time": "2021-06-02T20:00:00+00:00", + "exit_price": 92.896, + "exit_time": "2021-06-03T20:00:00+00:00", + "pnl": -4.900000000000659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.577, + "entry_time": "2021-06-07T20:00:00+00:00", + "exit_price": 91.284, + "exit_time": "2021-06-09T20:00:00+00:00", + "pnl": -129.29999999999922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2021-06-11T20:00:00+00:00", + "exit_price": 92.333, + "exit_time": "2021-06-14T20:00:00+00:00", + "pnl": -79.6999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.95, + "entry_time": "2021-06-17T20:00:00+00:00", + "exit_price": 92.166, + "exit_time": "2021-06-18T20:00:00+00:00", + "pnl": 21.599999999999397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.256, + "entry_time": "2021-06-23T20:00:00+00:00", + "exit_price": 92.456, + "exit_time": "2021-06-24T20:00:00+00:00", + "pnl": 20.000000000000284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73100000000001, + "entry_time": "2021-06-28T20:00:00+00:00", + "exit_price": 91.788, + "exit_time": "2021-06-30T20:00:00+00:00", + "pnl": 5.699999999998795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.941, + "entry_time": "2021-07-02T20:00:00+00:00", + "exit_price": 90.653, + "exit_time": "2021-07-06T20:00:00+00:00", + "pnl": -28.79999999999967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.824, + "entry_time": "2021-07-08T20:00:00+00:00", + "exit_price": 91.78, + "exit_time": "2021-07-09T20:00:00+00:00", + "pnl": -4.399999999999693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.098, + "entry_time": "2021-07-14T20:00:00+00:00", + "exit_price": 91.642, + "exit_time": "2021-07-15T20:00:00+00:00", + "pnl": 54.39999999999969, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.333, + "entry_time": "2021-07-19T20:00:00+00:00", + "exit_price": 91.025, + "exit_time": "2021-07-21T20:00:00+00:00", + "pnl": -30.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.238, + "entry_time": "2021-07-23T20:00:00+00:00", + "exit_price": 91.959, + "exit_time": "2021-07-26T20:00:00+00:00", + "pnl": 72.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.122, + "entry_time": "2021-07-29T20:00:00+00:00", + "exit_price": 93.031, + "exit_time": "2021-07-30T20:00:00+00:00", + "pnl": 90.9000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16, + "entry_time": "2021-08-04T20:00:00+00:00", + "exit_price": 91.643, + "exit_time": "2021-08-05T20:00:00+00:00", + "pnl": -51.69999999999959, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.188, + "entry_time": "2021-08-09T20:00:00+00:00", + "exit_price": 93.342, + "exit_time": "2021-08-11T20:00:00+00:00", + "pnl": 15.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.618, + "entry_time": "2021-08-13T20:00:00+00:00", + "exit_price": 94.259, + "exit_time": "2021-08-16T20:00:00+00:00", + "pnl": 64.10000000000053, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98, + "entry_time": "2021-08-19T20:00:00+00:00", + "exit_price": 93.988, + "exit_time": "2021-08-20T20:00:00+00:00", + "pnl": 100.79999999999956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2021-08-25T20:00:00+00:00", + "exit_price": 92.705, + "exit_time": "2021-08-26T20:00:00+00:00", + "pnl": 2.400000000000091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.361, + "entry_time": "2021-08-30T20:00:00+00:00", + "exit_price": 93.802, + "exit_time": "2021-09-01T20:00:00+00:00", + "pnl": 144.10000000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.154, + "entry_time": "2021-09-03T20:00:00+00:00", + "exit_price": 93.729, + "exit_time": "2021-09-07T20:00:00+00:00", + "pnl": 57.500000000000284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.158, + "entry_time": "2021-09-09T20:00:00+00:00", + "exit_price": 93.741, + "exit_time": "2021-09-10T20:00:00+00:00", + "pnl": -41.70000000000016, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.019, + "entry_time": "2021-09-15T20:00:00+00:00", + "exit_price": 94.422, + "exit_time": "2021-09-16T20:00:00+00:00", + "pnl": -59.70000000000084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.354, + "entry_time": "2021-09-20T20:00:00+00:00", + "exit_price": 94.986, + "exit_time": "2021-09-22T20:00:00+00:00", + "pnl": 63.2000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87, + "entry_time": "2021-09-24T20:00:00+00:00", + "exit_price": 94.849, + "exit_time": "2021-09-27T20:00:00+00:00", + "pnl": 97.89999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.309, + "entry_time": "2021-09-30T20:00:00+00:00", + "exit_price": 93.994, + "exit_time": "2021-10-01T20:00:00+00:00", + "pnl": -31.499999999999773, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.074, + "entry_time": "2021-10-06T20:00:00+00:00", + "exit_price": 94.048, + "exit_time": "2021-10-07T20:00:00+00:00", + "pnl": -2.599999999999625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.849, + "entry_time": "2021-10-11T20:00:00+00:00", + "exit_price": 94.437, + "exit_time": "2021-10-13T20:00:00+00:00", + "pnl": 58.799999999999386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2021-10-15T20:00:00+00:00", + "exit_price": 95.093, + "exit_time": "2021-10-18T20:00:00+00:00", + "pnl": 72.2999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.029, + "entry_time": "2021-10-21T20:00:00+00:00", + "exit_price": 94.805, + "exit_time": "2021-10-22T20:00:00+00:00", + "pnl": 77.60000000000105, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.249, + "entry_time": "2021-10-27T20:00:00+00:00", + "exit_price": 93.601, + "exit_time": "2021-10-28T20:00:00+00:00", + "pnl": -64.79999999999961, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.241, + "entry_time": "2021-11-01T20:00:00+00:00", + "exit_price": 94.429, + "exit_time": "2021-11-03T20:00:00+00:00", + "pnl": 118.80000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.416, + "entry_time": "2021-11-05T20:00:00+00:00", + "exit_price": 92.51, + "exit_time": "2021-11-08T21:00:00+00:00", + "pnl": -90.59999999999917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96000000000001, + "entry_time": "2021-11-11T21:00:00+00:00", + "exit_price": 93.531, + "exit_time": "2021-11-12T21:00:00+00:00", + "pnl": 57.099999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.427, + "entry_time": "2021-11-17T21:00:00+00:00", + "exit_price": 92.196, + "exit_time": "2021-11-18T21:00:00+00:00", + "pnl": -23.100000000000875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52, + "entry_time": "2021-11-22T21:00:00+00:00", + "exit_price": 93.982, + "exit_time": "2021-11-24T21:00:00+00:00", + "pnl": 146.20000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82000000000001, + "entry_time": "2021-12-02T21:00:00+00:00", + "exit_price": 91.736, + "exit_time": "2021-12-03T21:00:00+00:00", + "pnl": -8.400000000000318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.70400000000001, + "entry_time": "2021-12-08T21:00:00+00:00", + "exit_price": 92.183, + "exit_time": "2021-12-09T21:00:00+00:00", + "pnl": 47.89999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.131, + "entry_time": "2021-12-13T21:00:00+00:00", + "exit_price": 92.825, + "exit_time": "2021-12-15T21:00:00+00:00", + "pnl": 69.40000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.809, + "entry_time": "2021-12-17T21:00:00+00:00", + "exit_price": 93.226, + "exit_time": "2021-12-20T21:00:00+00:00", + "pnl": -58.29999999999984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06700000000001, + "entry_time": "2021-12-23T21:00:00+00:00", + "exit_price": 92.105, + "exit_time": "2021-12-27T21:00:00+00:00", + "pnl": -96.20000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.026, + "entry_time": "2021-12-29T21:00:00+00:00", + "exit_price": 93.011, + "exit_time": "2021-12-30T21:00:00+00:00", + "pnl": 98.49999999999994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.06700000000001, + "entry_time": "2022-01-03T21:00:00+00:00", + "exit_price": 91.642, + "exit_time": "2022-01-05T21:00:00+00:00", + "pnl": -42.50000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.202, + "entry_time": "2022-01-07T21:00:00+00:00", + "exit_price": 91.813, + "exit_time": "2022-01-10T21:00:00+00:00", + "pnl": -38.89999999999958, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.255, + "entry_time": "2022-01-13T21:00:00+00:00", + "exit_price": 91.97500000000001, + "exit_time": "2022-01-14T21:00:00+00:00", + "pnl": -27.999999999998693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.763, + "entry_time": "2022-01-19T21:00:00+00:00", + "exit_price": 91.432, + "exit_time": "2022-01-20T21:00:00+00:00", + "pnl": -33.10000000000031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96600000000001, + "entry_time": "2022-01-24T21:00:00+00:00", + "exit_price": 91.852, + "exit_time": "2022-01-26T21:00:00+00:00", + "pnl": -11.400000000000432, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.81400000000001, + "entry_time": "2022-01-28T21:00:00+00:00", + "exit_price": 91.676, + "exit_time": "2022-01-31T21:00:00+00:00", + "pnl": 86.19999999999948, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.985, + "entry_time": "2022-02-03T21:00:00+00:00", + "exit_price": 91.188, + "exit_time": "2022-02-04T21:00:00+00:00", + "pnl": -79.6999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97, + "entry_time": "2022-02-09T21:00:00+00:00", + "exit_price": 92.17, + "exit_time": "2022-02-10T21:00:00+00:00", + "pnl": 20.000000000000284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.507, + "entry_time": "2022-02-14T21:00:00+00:00", + "exit_price": 91.156, + "exit_time": "2022-02-16T21:00:00+00:00", + "pnl": -35.09999999999991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.661, + "entry_time": "2022-02-18T21:00:00+00:00", + "exit_price": 92.287, + "exit_time": "2022-02-22T21:00:00+00:00", + "pnl": 62.60000000000048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.068, + "entry_time": "2022-02-24T21:00:00+00:00", + "exit_price": 91.351, + "exit_time": "2022-02-25T21:00:00+00:00", + "pnl": 28.300000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09400000000001, + "entry_time": "2022-03-02T21:00:00+00:00", + "exit_price": 91.421, + "exit_time": "2022-03-03T21:00:00+00:00", + "pnl": -67.30000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2022-03-07T21:00:00+00:00", + "exit_price": 91.526, + "exit_time": "2022-03-09T21:00:00+00:00", + "pnl": -48.7000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.012, + "entry_time": "2022-03-11T21:00:00+00:00", + "exit_price": 90.821, + "exit_time": "2022-03-14T20:00:00+00:00", + "pnl": -19.10000000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.925, + "entry_time": "2022-03-17T20:00:00+00:00", + "exit_price": 90.615, + "exit_time": "2022-03-18T20:00:00+00:00", + "pnl": -131.00000000000023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.965, + "entry_time": "2022-03-23T20:00:00+00:00", + "exit_price": 90.7, + "exit_time": "2022-03-24T20:00:00+00:00", + "pnl": -26.500000000000057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.683, + "entry_time": "2022-03-28T20:00:00+00:00", + "exit_price": 91.694, + "exit_time": "2022-03-30T20:00:00+00:00", + "pnl": 101.09999999999957, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87, + "entry_time": "2022-04-01T20:00:00+00:00", + "exit_price": 90.055, + "exit_time": "2022-04-04T20:00:00+00:00", + "pnl": -81.49999999999977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.631, + "entry_time": "2022-04-07T20:00:00+00:00", + "exit_price": 89.96000000000001, + "exit_time": "2022-04-08T20:00:00+00:00", + "pnl": -67.09999999999923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.759, + "entry_time": "2022-04-13T20:00:00+00:00", + "exit_price": 90.97800000000001, + "exit_time": "2022-04-14T20:00:00+00:00", + "pnl": 121.90000000000083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.009, + "entry_time": "2022-04-19T20:00:00+00:00", + "exit_price": 90.97200000000001, + "exit_time": "2022-04-20T20:00:00+00:00", + "pnl": 96.30000000000081, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.449, + "entry_time": "2022-04-22T20:00:00+00:00", + "exit_price": 89.93900000000001, + "exit_time": "2022-04-25T20:00:00+00:00", + "pnl": -50.99999999999909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.137, + "entry_time": "2022-04-28T20:00:00+00:00", + "exit_price": 90.92, + "exit_time": "2022-04-29T20:00:00+00:00", + "pnl": 78.30000000000013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.235, + "entry_time": "2022-05-04T20:00:00+00:00", + "exit_price": 92.161, + "exit_time": "2022-05-05T20:00:00+00:00", + "pnl": 92.6000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.242, + "entry_time": "2022-05-09T20:00:00+00:00", + "exit_price": 91.392, + "exit_time": "2022-05-11T20:00:00+00:00", + "pnl": 114.99999999999915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.798, + "entry_time": "2022-05-13T20:00:00+00:00", + "exit_price": 91.741, + "exit_time": "2022-05-16T20:00:00+00:00", + "pnl": -5.700000000000216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129, + "entry_time": "2022-05-19T20:00:00+00:00", + "exit_price": 91.294, + "exit_time": "2022-05-20T20:00:00+00:00", + "pnl": 16.499999999999204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.508, + "entry_time": "2022-05-25T20:00:00+00:00", + "exit_price": 90.206, + "exit_time": "2022-05-26T20:00:00+00:00", + "pnl": -30.19999999999925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.881, + "entry_time": "2022-05-31T20:00:00+00:00", + "exit_price": 90.543, + "exit_time": "2022-06-01T20:00:00+00:00", + "pnl": 66.20000000000061, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.973, + "entry_time": "2022-06-03T20:00:00+00:00", + "exit_price": 90.741, + "exit_time": "2022-06-06T20:00:00+00:00", + "pnl": -23.199999999999932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.848, + "entry_time": "2022-06-09T20:00:00+00:00", + "exit_price": 90.837, + "exit_time": "2022-06-10T20:00:00+00:00", + "pnl": -1.099999999999568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.825, + "entry_time": "2022-06-15T20:00:00+00:00", + "exit_price": 90.17, + "exit_time": "2022-06-16T20:00:00+00:00", + "pnl": -65.50000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.553, + "entry_time": "2022-06-21T20:00:00+00:00", + "exit_price": 90.601, + "exit_time": "2022-06-22T20:00:00+00:00", + "pnl": 4.800000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.687, + "entry_time": "2022-06-24T20:00:00+00:00", + "exit_price": 90.053, + "exit_time": "2022-06-27T20:00:00+00:00", + "pnl": -63.400000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.794, + "entry_time": "2022-06-30T20:00:00+00:00", + "exit_price": 92.411, + "exit_time": "2022-07-01T20:00:00+00:00", + "pnl": 161.70000000000044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.303, + "entry_time": "2022-07-06T20:00:00+00:00", + "exit_price": 90.141, + "exit_time": "2022-07-07T20:00:00+00:00", + "pnl": -116.19999999999919, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.156, + "entry_time": "2022-07-11T20:00:00+00:00", + "exit_price": 90.998, + "exit_time": "2022-07-13T20:00:00+00:00", + "pnl": -15.800000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.512, + "entry_time": "2022-07-15T20:00:00+00:00", + "exit_price": 91.253, + "exit_time": "2022-07-18T20:00:00+00:00", + "pnl": 74.09999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.474, + "entry_time": "2022-07-21T20:00:00+00:00", + "exit_price": 89.988, + "exit_time": "2022-07-22T20:00:00+00:00", + "pnl": -148.60000000000042, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.051, + "entry_time": "2022-07-27T20:00:00+00:00", + "exit_price": 91.31400000000001, + "exit_time": "2022-07-28T20:00:00+00:00", + "pnl": 26.300000000000523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.376, + "entry_time": "2022-08-01T20:00:00+00:00", + "exit_price": 91.542, + "exit_time": "2022-08-03T20:00:00+00:00", + "pnl": 16.59999999999968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.898, + "entry_time": "2022-08-05T20:00:00+00:00", + "exit_price": 92.023, + "exit_time": "2022-08-08T20:00:00+00:00", + "pnl": 12.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.244, + "entry_time": "2022-08-11T20:00:00+00:00", + "exit_price": 92.691, + "exit_time": "2022-08-12T20:00:00+00:00", + "pnl": 44.70000000000027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.181, + "entry_time": "2022-08-17T20:00:00+00:00", + "exit_price": 92.495, + "exit_time": "2022-08-18T20:00:00+00:00", + "pnl": -68.59999999999928, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.024, + "entry_time": "2022-08-22T20:00:00+00:00", + "exit_price": 93.281, + "exit_time": "2022-08-24T20:00:00+00:00", + "pnl": 25.7000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.724, + "entry_time": "2022-08-26T20:00:00+00:00", + "exit_price": 93.027, + "exit_time": "2022-08-29T20:00:00+00:00", + "pnl": -69.70000000000027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.267, + "entry_time": "2022-09-01T20:00:00+00:00", + "exit_price": 93.319, + "exit_time": "2022-09-02T20:00:00+00:00", + "pnl": 5.200000000000671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.866, + "entry_time": "2022-09-07T20:00:00+00:00", + "exit_price": 93.548, + "exit_time": "2022-09-08T20:00:00+00:00", + "pnl": 68.20000000000022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.821, + "entry_time": "2022-09-12T20:00:00+00:00", + "exit_price": 94.111, + "exit_time": "2022-09-14T20:00:00+00:00", + "pnl": 29.000000000000625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.782, + "entry_time": "2022-09-16T20:00:00+00:00", + "exit_price": 94.266, + "exit_time": "2022-09-19T20:00:00+00:00", + "pnl": -51.59999999999911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.888, + "entry_time": "2022-09-22T20:00:00+00:00", + "exit_price": 94.905, + "exit_time": "2022-09-23T20:00:00+00:00", + "pnl": 1.6999999999995907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.211, + "entry_time": "2022-09-28T20:00:00+00:00", + "exit_price": 93.622, + "exit_time": "2022-09-29T20:00:00+00:00", + "pnl": -58.899999999999864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.289, + "entry_time": "2022-10-03T20:00:00+00:00", + "exit_price": 95.218, + "exit_time": "2022-10-05T20:00:00+00:00", + "pnl": -7.099999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.625, + "entry_time": "2022-10-07T20:00:00+00:00", + "exit_price": 93.711, + "exit_time": "2022-10-10T20:00:00+00:00", + "pnl": -91.40000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22, + "entry_time": "2022-10-13T20:00:00+00:00", + "exit_price": 95.266, + "exit_time": "2022-10-14T20:00:00+00:00", + "pnl": 104.60000000000065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.369, + "entry_time": "2022-10-19T20:00:00+00:00", + "exit_price": 94.388, + "exit_time": "2022-10-20T20:00:00+00:00", + "pnl": 101.90000000000055, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2022-10-24T20:00:00+00:00", + "exit_price": 94.253, + "exit_time": "2022-10-26T20:00:00+00:00", + "pnl": 21.89999999999941, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.929, + "entry_time": "2022-10-28T20:00:00+00:00", + "exit_price": 95.019, + "exit_time": "2022-10-31T20:00:00+00:00", + "pnl": 9.000000000000341, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.458, + "entry_time": "2022-11-03T20:00:00+00:00", + "exit_price": 95.965, + "exit_time": "2022-11-04T20:00:00+00:00", + "pnl": -49.2999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23700000000001, + "entry_time": "2022-11-09T21:00:00+00:00", + "exit_price": 94.586, + "exit_time": "2022-11-10T21:00:00+00:00", + "pnl": -65.10000000000105, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.712, + "entry_time": "2022-11-14T21:00:00+00:00", + "exit_price": 94.086, + "exit_time": "2022-11-16T21:00:00+00:00", + "pnl": 37.39999999999952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.205, + "entry_time": "2022-11-18T21:00:00+00:00", + "exit_price": 94.623, + "exit_time": "2022-11-21T21:00:00+00:00", + "pnl": 41.80000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54, + "entry_time": "2022-11-25T18:00:00+00:00", + "exit_price": 92.916, + "exit_time": "2022-12-01T21:00:00+00:00", + "pnl": -62.400000000000944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.256, + "entry_time": "2022-12-05T21:00:00+00:00", + "exit_price": 93.35900000000001, + "exit_time": "2022-12-07T21:00:00+00:00", + "pnl": 10.300000000000864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.218, + "entry_time": "2022-12-09T21:00:00+00:00", + "exit_price": 93.916, + "exit_time": "2022-12-12T21:00:00+00:00", + "pnl": 69.79999999999933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.424, + "entry_time": "2022-12-15T21:00:00+00:00", + "exit_price": 92.996, + "exit_time": "2022-12-16T21:00:00+00:00", + "pnl": -42.80000000000115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.738, + "entry_time": "2022-12-21T21:00:00+00:00", + "exit_price": 91.786, + "exit_time": "2022-12-22T21:00:00+00:00", + "pnl": 104.80000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.399, + "entry_time": "2022-12-27T21:00:00+00:00", + "exit_price": 92.116, + "exit_time": "2022-12-28T21:00:00+00:00", + "pnl": -28.300000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.771, + "entry_time": "2022-12-30T21:00:00+00:00", + "exit_price": 92.97800000000001, + "exit_time": "2023-01-03T21:00:00+00:00", + "pnl": 20.700000000000784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82300000000001, + "entry_time": "2023-01-05T21:00:00+00:00", + "exit_price": 92.889, + "exit_time": "2023-01-06T21:00:00+00:00", + "pnl": 6.599999999998829, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.776, + "entry_time": "2023-01-11T21:00:00+00:00", + "exit_price": 92.849, + "exit_time": "2023-01-12T21:00:00+00:00", + "pnl": 7.30000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.165, + "entry_time": "2023-01-17T21:00:00+00:00", + "exit_price": 93.645, + "exit_time": "2023-01-18T21:00:00+00:00", + "pnl": 47.99999999999898, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.349, + "entry_time": "2023-01-20T21:00:00+00:00", + "exit_price": 93.529, + "exit_time": "2023-01-23T21:00:00+00:00", + "pnl": 117.99999999999926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.145, + "entry_time": "2023-01-26T21:00:00+00:00", + "exit_price": 93.092, + "exit_time": "2023-01-27T21:00:00+00:00", + "pnl": -105.29999999999973, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2023-02-01T21:00:00+00:00", + "exit_price": 92.672, + "exit_time": "2023-02-02T21:00:00+00:00", + "pnl": -136.2000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.253, + "entry_time": "2023-02-06T21:00:00+00:00", + "exit_price": 93.168, + "exit_time": "2023-02-08T21:00:00+00:00", + "pnl": -8.499999999999375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2023-02-10T21:00:00+00:00", + "exit_price": 94.092, + "exit_time": "2023-02-13T21:00:00+00:00", + "pnl": 96.20000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.536, + "entry_time": "2023-02-16T21:00:00+00:00", + "exit_price": 94.21600000000001, + "exit_time": "2023-02-17T21:00:00+00:00", + "pnl": -31.999999999999318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.185, + "entry_time": "2023-02-22T21:00:00+00:00", + "exit_price": 93.989, + "exit_time": "2023-02-23T21:00:00+00:00", + "pnl": -19.599999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45400000000001, + "entry_time": "2023-02-27T21:00:00+00:00", + "exit_price": 94.437, + "exit_time": "2023-03-01T21:00:00+00:00", + "pnl": -1.7000000000010118, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.958, + "entry_time": "2023-03-03T21:00:00+00:00", + "exit_price": 93.665, + "exit_time": "2023-03-06T21:00:00+00:00", + "pnl": -29.299999999999216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35000000000001, + "entry_time": "2023-03-09T21:00:00+00:00", + "exit_price": 93.062, + "exit_time": "2023-03-10T21:00:00+00:00", + "pnl": -28.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.884, + "entry_time": "2023-03-15T20:00:00+00:00", + "exit_price": 94.08200000000001, + "exit_time": "2023-03-16T20:00:00+00:00", + "pnl": 19.80000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.295, + "entry_time": "2023-03-20T20:00:00+00:00", + "exit_price": 92.05, + "exit_time": "2023-03-22T20:00:00+00:00", + "pnl": -24.500000000000455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.845, + "entry_time": "2023-03-24T20:00:00+00:00", + "exit_price": 93.328, + "exit_time": "2023-03-27T20:00:00+00:00", + "pnl": 148.3000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.949, + "entry_time": "2023-03-30T20:00:00+00:00", + "exit_price": 93.548, + "exit_time": "2023-03-31T20:00:00+00:00", + "pnl": 59.900000000000375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73100000000001, + "entry_time": "2023-04-05T20:00:00+00:00", + "exit_price": 92.13, + "exit_time": "2023-04-06T20:00:00+00:00", + "pnl": -60.10000000000133, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.325, + "entry_time": "2023-04-11T20:00:00+00:00", + "exit_price": 92.404, + "exit_time": "2023-04-12T20:00:00+00:00", + "pnl": -92.10000000000065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56, + "entry_time": "2023-04-14T20:00:00+00:00", + "exit_price": 92.82900000000001, + "exit_time": "2023-04-17T20:00:00+00:00", + "pnl": 26.900000000000546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-04-20T20:00:00+00:00", + "exit_price": 92.95100000000001, + "exit_time": "2023-04-21T20:00:00+00:00", + "pnl": 15.200000000000102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35900000000001, + "entry_time": "2023-04-26T20:00:00+00:00", + "exit_price": 92.905, + "exit_time": "2023-04-27T20:00:00+00:00", + "pnl": -45.40000000000077, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2023-05-01T20:00:00+00:00", + "exit_price": 92.82900000000001, + "exit_time": "2023-05-03T20:00:00+00:00", + "pnl": 14.800000000001035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06700000000001, + "entry_time": "2023-05-05T20:00:00+00:00", + "exit_price": 93.19500000000001, + "exit_time": "2023-05-08T20:00:00+00:00", + "pnl": 12.800000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.877, + "entry_time": "2023-05-11T20:00:00+00:00", + "exit_price": 93.476, + "exit_time": "2023-05-12T20:00:00+00:00", + "pnl": 159.90000000000038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.775, + "entry_time": "2023-05-17T20:00:00+00:00", + "exit_price": 93.218, + "exit_time": "2023-05-18T20:00:00+00:00", + "pnl": 44.299999999999784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88, + "entry_time": "2023-05-22T20:00:00+00:00", + "exit_price": 93.96900000000001, + "exit_time": "2023-05-24T20:00:00+00:00", + "pnl": 8.900000000001285, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.333, + "entry_time": "2023-05-26T20:00:00+00:00", + "exit_price": 94.059, + "exit_time": "2023-05-30T20:00:00+00:00", + "pnl": -27.40000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.762, + "entry_time": "2023-06-01T20:00:00+00:00", + "exit_price": 94.25, + "exit_time": "2023-06-02T20:00:00+00:00", + "pnl": 148.79999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.294, + "entry_time": "2023-06-07T20:00:00+00:00", + "exit_price": 94.60300000000001, + "exit_time": "2023-06-08T20:00:00+00:00", + "pnl": 30.90000000000117, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.427, + "entry_time": "2023-06-12T20:00:00+00:00", + "exit_price": 94.339, + "exit_time": "2023-06-14T20:00:00+00:00", + "pnl": -8.800000000000807, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2023-06-16T20:00:00+00:00", + "exit_price": 94.163, + "exit_time": "2023-06-20T20:00:00+00:00", + "pnl": -20.700000000000784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.953, + "entry_time": "2023-06-22T20:00:00+00:00", + "exit_price": 94.374, + "exit_time": "2023-06-23T20:00:00+00:00", + "pnl": -57.90000000000077, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.898, + "entry_time": "2023-06-28T20:00:00+00:00", + "exit_price": 94.566, + "exit_time": "2023-06-29T20:00:00+00:00", + "pnl": 66.80000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.277, + "entry_time": "2023-07-03T17:00:00+00:00", + "exit_price": 94.941, + "exit_time": "2023-07-10T20:00:00+00:00", + "pnl": 66.40000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493, + "entry_time": "2023-07-13T20:00:00+00:00", + "exit_price": 94.34700000000001, + "exit_time": "2023-07-14T20:00:00+00:00", + "pnl": -14.599999999998658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23700000000001, + "entry_time": "2023-07-19T20:00:00+00:00", + "exit_price": 94.334, + "exit_time": "2023-07-20T20:00:00+00:00", + "pnl": 109.69999999999942, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2023-07-24T20:00:00+00:00", + "exit_price": 93.304, + "exit_time": "2023-07-26T20:00:00+00:00", + "pnl": -22.700000000000387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.055, + "entry_time": "2023-07-28T20:00:00+00:00", + "exit_price": 93.971, + "exit_time": "2023-07-31T20:00:00+00:00", + "pnl": -8.400000000000318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.498, + "entry_time": "2023-08-03T20:00:00+00:00", + "exit_price": 93.961, + "exit_time": "2023-08-04T20:00:00+00:00", + "pnl": 46.299999999999386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21600000000001, + "entry_time": "2023-08-09T20:00:00+00:00", + "exit_price": 93.22800000000001, + "exit_time": "2023-08-10T20:00:00+00:00", + "pnl": -98.79999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.656, + "entry_time": "2023-08-14T20:00:00+00:00", + "exit_price": 94.398, + "exit_time": "2023-08-16T20:00:00+00:00", + "pnl": 174.19999999999902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.089, + "entry_time": "2023-08-18T20:00:00+00:00", + "exit_price": 93.399, + "exit_time": "2023-08-21T20:00:00+00:00", + "pnl": -68.99999999999977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-08-24T20:00:00+00:00", + "exit_price": 93.688, + "exit_time": "2023-08-25T20:00:00+00:00", + "pnl": 88.89999999999958, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.791, + "entry_time": "2023-08-30T20:00:00+00:00", + "exit_price": 92.57300000000001, + "exit_time": "2023-08-31T20:00:00+00:00", + "pnl": -121.79999999999893, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.041, + "entry_time": "2023-09-05T20:00:00+00:00", + "exit_price": 94.468, + "exit_time": "2023-09-06T20:00:00+00:00", + "pnl": 142.70000000000067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23700000000001, + "entry_time": "2023-09-08T20:00:00+00:00", + "exit_price": 94.095, + "exit_time": "2023-09-11T20:00:00+00:00", + "pnl": -14.200000000001012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.791, + "entry_time": "2023-09-14T20:00:00+00:00", + "exit_price": 94.029, + "exit_time": "2023-09-15T20:00:00+00:00", + "pnl": -76.20000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.173, + "entry_time": "2023-09-20T20:00:00+00:00", + "exit_price": 93.583, + "exit_time": "2023-09-21T20:00:00+00:00", + "pnl": -59.00000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.115, + "entry_time": "2023-09-25T20:00:00+00:00", + "exit_price": 93.162, + "exit_time": "2023-09-27T20:00:00+00:00", + "pnl": -95.29999999999887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.496, + "entry_time": "2023-09-29T20:00:00+00:00", + "exit_price": 92.842, + "exit_time": "2023-10-02T20:00:00+00:00", + "pnl": -65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.019, + "entry_time": "2023-10-05T20:00:00+00:00", + "exit_price": 92.773, + "exit_time": "2023-10-06T20:00:00+00:00", + "pnl": -24.600000000000932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.345, + "entry_time": "2023-10-11T20:00:00+00:00", + "exit_price": 92.322, + "exit_time": "2023-10-12T20:00:00+00:00", + "pnl": -2.2999999999996135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.994, + "entry_time": "2023-10-16T20:00:00+00:00", + "exit_price": 91.586, + "exit_time": "2023-10-18T20:00:00+00:00", + "pnl": -40.800000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.467, + "entry_time": "2023-10-20T20:00:00+00:00", + "exit_price": 92.361, + "exit_time": "2023-10-23T20:00:00+00:00", + "pnl": 89.40000000000055, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.379, + "entry_time": "2023-10-26T20:00:00+00:00", + "exit_price": 91.412, + "exit_time": "2023-10-27T20:00:00+00:00", + "pnl": -96.69999999999987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43, + "entry_time": "2023-11-01T20:00:00+00:00", + "exit_price": 91.133, + "exit_time": "2023-11-02T20:00:00+00:00", + "pnl": -29.700000000001125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.967, + "entry_time": "2023-11-06T21:00:00+00:00", + "exit_price": 91.602, + "exit_time": "2023-11-08T21:00:00+00:00", + "pnl": 63.50000000000051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.416, + "entry_time": "2023-11-10T21:00:00+00:00", + "exit_price": 92.325, + "exit_time": "2023-11-13T21:00:00+00:00", + "pnl": -9.099999999999397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94500000000001, + "entry_time": "2023-11-16T21:00:00+00:00", + "exit_price": 92.019, + "exit_time": "2023-11-17T21:00:00+00:00", + "pnl": -92.6000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.744, + "entry_time": "2023-11-22T21:00:00+00:00", + "exit_price": 93.688, + "exit_time": "2023-11-24T18:00:00+00:00", + "pnl": 94.40000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.139, + "entry_time": "2023-11-27T21:00:00+00:00", + "exit_price": 92.476, + "exit_time": "2023-11-29T21:00:00+00:00", + "pnl": -166.29999999999967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76, + "entry_time": "2023-12-01T21:00:00+00:00", + "exit_price": 93.44800000000001, + "exit_time": "2023-12-04T21:00:00+00:00", + "pnl": 68.80000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.583, + "entry_time": "2023-12-07T21:00:00+00:00", + "exit_price": 94.144, + "exit_time": "2023-12-08T21:00:00+00:00", + "pnl": 56.100000000000705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.056, + "entry_time": "2023-12-13T21:00:00+00:00", + "exit_price": 93.35600000000001, + "exit_time": "2023-12-14T21:00:00+00:00", + "pnl": 130.00000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.194, + "entry_time": "2023-12-18T21:00:00+00:00", + "exit_price": 92.511, + "exit_time": "2023-12-20T21:00:00+00:00", + "pnl": 31.699999999999307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.914, + "entry_time": "2023-12-22T21:00:00+00:00", + "exit_price": 92.894, + "exit_time": "2023-12-26T21:00:00+00:00", + "pnl": -101.9999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.128, + "entry_time": "2023-12-28T21:00:00+00:00", + "exit_price": 93.66, + "exit_time": "2023-12-29T21:00:00+00:00", + "pnl": 53.19999999999965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.892, + "entry_time": "2024-01-03T21:00:00+00:00", + "exit_price": 94.589, + "exit_time": "2024-01-04T21:00:00+00:00", + "pnl": -30.299999999999727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.077, + "entry_time": "2024-01-08T21:00:00+00:00", + "exit_price": 94.764, + "exit_time": "2024-01-10T21:00:00+00:00", + "pnl": -31.30000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.805, + "entry_time": "2024-01-12T21:00:00+00:00", + "exit_price": 94.409, + "exit_time": "2024-01-16T21:00:00+00:00", + "pnl": -39.60000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.092, + "entry_time": "2024-01-18T21:00:00+00:00", + "exit_price": 94.92, + "exit_time": "2024-01-19T21:00:00+00:00", + "pnl": -17.199999999999704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2024-01-24T21:00:00+00:00", + "exit_price": 95.417, + "exit_time": "2024-01-25T21:00:00+00:00", + "pnl": 53.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.117, + "entry_time": "2024-01-29T21:00:00+00:00", + "exit_price": 94.586, + "exit_time": "2024-01-31T21:00:00+00:00", + "pnl": 46.89999999999941, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.519, + "entry_time": "2024-02-02T21:00:00+00:00", + "exit_price": 95.646, + "exit_time": "2024-02-05T21:00:00+00:00", + "pnl": 12.699999999999534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.974, + "entry_time": "2024-02-08T21:00:00+00:00", + "exit_price": 96.257, + "exit_time": "2024-02-09T21:00:00+00:00", + "pnl": 128.30000000000013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.384, + "entry_time": "2024-02-14T21:00:00+00:00", + "exit_price": 94.768, + "exit_time": "2024-02-15T21:00:00+00:00", + "pnl": 38.400000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.926, + "entry_time": "2024-02-20T21:00:00+00:00", + "exit_price": 95.284, + "exit_time": "2024-02-21T21:00:00+00:00", + "pnl": 35.80000000000041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.645, + "entry_time": "2024-02-23T21:00:00+00:00", + "exit_price": 94.632, + "exit_time": "2024-02-26T21:00:00+00:00", + "pnl": -1.2999999999991019, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.994, + "entry_time": "2024-02-29T21:00:00+00:00", + "exit_price": 93.516, + "exit_time": "2024-03-01T21:00:00+00:00", + "pnl": 52.20000000000056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.208, + "entry_time": "2024-03-06T21:00:00+00:00", + "exit_price": 93.035, + "exit_time": "2024-03-07T21:00:00+00:00", + "pnl": -17.300000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57900000000001, + "entry_time": "2024-03-11T20:00:00+00:00", + "exit_price": 93.424, + "exit_time": "2024-03-13T20:00:00+00:00", + "pnl": -15.500000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.322, + "entry_time": "2024-03-15T20:00:00+00:00", + "exit_price": 93.745, + "exit_time": "2024-03-18T20:00:00+00:00", + "pnl": 42.30000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56700000000001, + "entry_time": "2024-03-21T20:00:00+00:00", + "exit_price": 90.994, + "exit_time": "2024-03-22T20:00:00+00:00", + "pnl": -157.30000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.365, + "entry_time": "2024-03-27T20:00:00+00:00", + "exit_price": 92.886, + "exit_time": "2024-03-28T20:00:00+00:00", + "pnl": 52.10000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.875, + "entry_time": "2024-04-02T20:00:00+00:00", + "exit_price": 92.605, + "exit_time": "2024-04-03T20:00:00+00:00", + "pnl": -26.999999999999602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.203, + "entry_time": "2024-04-05T20:00:00+00:00", + "exit_price": 92.389, + "exit_time": "2024-04-08T20:00:00+00:00", + "pnl": 18.599999999999284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.968, + "entry_time": "2024-04-11T20:00:00+00:00", + "exit_price": 91.888, + "exit_time": "2024-04-12T20:00:00+00:00", + "pnl": -7.9999999999998295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.872, + "entry_time": "2024-04-17T20:00:00+00:00", + "exit_price": 92.005, + "exit_time": "2024-04-18T20:00:00+00:00", + "pnl": -86.70000000000044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.84700000000001, + "entry_time": "2024-04-22T20:00:00+00:00", + "exit_price": 91.521, + "exit_time": "2024-04-24T20:00:00+00:00", + "pnl": -132.60000000000076, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.615, + "entry_time": "2024-04-26T20:00:00+00:00", + "exit_price": 92.84, + "exit_time": "2024-04-29T20:00:00+00:00", + "pnl": 22.500000000000853, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.018, + "entry_time": "2024-05-02T20:00:00+00:00", + "exit_price": 93.19500000000001, + "exit_time": "2024-05-03T20:00:00+00:00", + "pnl": 117.70000000000067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.761, + "entry_time": "2024-05-08T20:00:00+00:00", + "exit_price": 93.992, + "exit_time": "2024-05-09T20:00:00+00:00", + "pnl": 23.100000000000875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.186, + "entry_time": "2024-05-13T20:00:00+00:00", + "exit_price": 93.292, + "exit_time": "2024-05-15T20:00:00+00:00", + "pnl": 10.599999999999454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.053, + "entry_time": "2024-05-17T20:00:00+00:00", + "exit_price": 92.898, + "exit_time": "2024-05-20T20:00:00+00:00", + "pnl": -15.500000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.003, + "entry_time": "2024-05-23T20:00:00+00:00", + "exit_price": 93.803, + "exit_time": "2024-05-24T20:00:00+00:00", + "pnl": 79.99999999999972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2024-05-29T20:00:00+00:00", + "exit_price": 93.551, + "exit_time": "2024-05-30T20:00:00+00:00", + "pnl": 1.999999999999602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.921, + "entry_time": "2024-06-03T20:00:00+00:00", + "exit_price": 93.378, + "exit_time": "2024-06-05T20:00:00+00:00", + "pnl": -54.30000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.738, + "entry_time": "2024-06-07T20:00:00+00:00", + "exit_price": 94.058, + "exit_time": "2024-06-10T20:00:00+00:00", + "pnl": 32.00000000000074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71600000000001, + "entry_time": "2024-06-13T20:00:00+00:00", + "exit_price": 92.354, + "exit_time": "2024-06-14T20:00:00+00:00", + "pnl": -36.2000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20400000000001, + "entry_time": "2024-06-20T20:00:00+00:00", + "exit_price": 93.86, + "exit_time": "2024-06-26T20:00:00+00:00", + "pnl": -34.40000000000083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.769, + "entry_time": "2024-06-28T20:00:00+00:00", + "exit_price": 94.267, + "exit_time": "2024-07-01T20:00:00+00:00", + "pnl": 149.79999999999905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.501, + "entry_time": "2024-07-05T20:00:00+00:00", + "exit_price": 92.97200000000001, + "exit_time": "2024-07-11T20:00:00+00:00", + "pnl": -52.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.501, + "entry_time": "2024-07-15T20:00:00+00:00", + "exit_price": 92.553, + "exit_time": "2024-07-17T20:00:00+00:00", + "pnl": 5.19999999999925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.928, + "entry_time": "2024-07-19T20:00:00+00:00", + "exit_price": 92.018, + "exit_time": "2024-07-22T20:00:00+00:00", + "pnl": 9.000000000000341, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.988, + "entry_time": "2024-07-25T20:00:00+00:00", + "exit_price": 92.135, + "exit_time": "2024-07-26T20:00:00+00:00", + "pnl": 14.700000000000557, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.85600000000001, + "entry_time": "2024-07-31T20:00:00+00:00", + "exit_price": 92.251, + "exit_time": "2024-08-01T20:00:00+00:00", + "pnl": 39.4999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.903, + "entry_time": "2024-08-05T20:00:00+00:00", + "exit_price": 91.614, + "exit_time": "2024-08-07T20:00:00+00:00", + "pnl": -28.900000000000148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.266, + "entry_time": "2024-08-09T20:00:00+00:00", + "exit_price": 93.255, + "exit_time": "2024-08-12T20:00:00+00:00", + "pnl": 98.89999999999901, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.888, + "entry_time": "2024-08-15T20:00:00+00:00", + "exit_price": 92.534, + "exit_time": "2024-08-16T20:00:00+00:00", + "pnl": -35.39999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.352, + "entry_time": "2024-08-21T20:00:00+00:00", + "exit_price": 93.822, + "exit_time": "2024-08-22T20:00:00+00:00", + "pnl": 46.999999999999886, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2024-08-26T20:00:00+00:00", + "exit_price": 93.143, + "exit_time": "2024-08-28T20:00:00+00:00", + "pnl": 112.99999999999955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.316, + "entry_time": "2024-08-30T20:00:00+00:00", + "exit_price": 92.433, + "exit_time": "2024-09-03T20:00:00+00:00", + "pnl": -188.29999999999956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.742, + "entry_time": "2024-09-05T20:00:00+00:00", + "exit_price": 93.047, + "exit_time": "2024-09-06T20:00:00+00:00", + "pnl": 30.49999999999926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.668, + "entry_time": "2024-09-11T20:00:00+00:00", + "exit_price": 91.661, + "exit_time": "2024-09-12T20:00:00+00:00", + "pnl": -100.7000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.179, + "entry_time": "2024-09-16T20:00:00+00:00", + "exit_price": 91.58, + "exit_time": "2024-09-18T20:00:00+00:00", + "pnl": 40.099999999999625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.285, + "entry_time": "2024-09-20T20:00:00+00:00", + "exit_price": 90.104, + "exit_time": "2024-09-23T20:00:00+00:00", + "pnl": -18.09999999999974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.052, + "entry_time": "2024-09-26T20:00:00+00:00", + "exit_price": 91.20400000000001, + "exit_time": "2024-09-27T20:00:00+00:00", + "pnl": 15.200000000000102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.551, + "entry_time": "2024-10-02T20:00:00+00:00", + "exit_price": 90.177, + "exit_time": "2024-10-03T20:00:00+00:00", + "pnl": -137.39999999999952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83, + "entry_time": "2024-10-07T20:00:00+00:00", + "exit_price": 91.072, + "exit_time": "2024-10-09T20:00:00+00:00", + "pnl": 24.200000000000443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.139, + "entry_time": "2024-10-11T20:00:00+00:00", + "exit_price": 90.93, + "exit_time": "2024-10-14T20:00:00+00:00", + "pnl": -20.899999999998897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.494, + "entry_time": "2024-10-17T20:00:00+00:00", + "exit_price": 89.863, + "exit_time": "2024-10-18T20:00:00+00:00", + "pnl": -63.10000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.811, + "entry_time": "2024-10-23T20:00:00+00:00", + "exit_price": 89.547, + "exit_time": "2024-10-24T20:00:00+00:00", + "pnl": -26.400000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.85600000000001, + "entry_time": "2024-10-28T20:00:00+00:00", + "exit_price": 89.886, + "exit_time": "2024-10-30T20:00:00+00:00", + "pnl": 2.9999999999986926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52, + "entry_time": "2024-11-01T20:00:00+00:00", + "exit_price": 89.584, + "exit_time": "2024-11-04T21:00:00+00:00", + "pnl": 106.40000000000072, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.328, + "entry_time": "2024-11-07T21:00:00+00:00", + "exit_price": 89.065, + "exit_time": "2024-11-08T21:00:00+00:00", + "pnl": -26.300000000000523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21000000000001, + "entry_time": "2024-11-13T21:00:00+00:00", + "exit_price": 88.452, + "exit_time": "2024-11-14T21:00:00+00:00", + "pnl": -75.80000000000098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.85900000000001, + "entry_time": "2024-11-18T21:00:00+00:00", + "exit_price": 88.672, + "exit_time": "2024-11-20T21:00:00+00:00", + "pnl": 81.29999999999882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.369, + "entry_time": "2024-11-22T21:00:00+00:00", + "exit_price": 89.07000000000001, + "exit_time": "2024-11-25T21:00:00+00:00", + "pnl": -29.89999999999924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.84400000000001, + "entry_time": "2024-11-29T18:00:00+00:00", + "exit_price": 89.039, + "exit_time": "2024-12-05T21:00:00+00:00", + "pnl": 19.499999999999318, + "size": 100.0 + } + ], + "message": "exact ordered match", + "name": "trade_level_match", + "passed": true + }, + { + "actual": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.672, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.213, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.21, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.414, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.153, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.753, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.38, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.073, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.85, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.598, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.529, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.654, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.89, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.907, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.789, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.443, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.942, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.222, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.98, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.695, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.931, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.956, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.923, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.974, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.214, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.083, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.313, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.9, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.12, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.713, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.383, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.16, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.91, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.73, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.641, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.34, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.28, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.079, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.248, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.948, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.051, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.348, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.004, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.499, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.415, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.333, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.788, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.824, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.959, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.122, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.705, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.422, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.074, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.849, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.093, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.029, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.982, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.131, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.825, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.809, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.011, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.202, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.763, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.676, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.068, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.694, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.96, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.759, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.009, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.939, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.137, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.242, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.303, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.156, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.051, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.314, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.542, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.023, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.244, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.866, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.211, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.289, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.22, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.237, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.623, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.996, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.889, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.645, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.253, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.216, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.845, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.328, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.949, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.13, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.56, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.829, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.829, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.195, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.347, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.237, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.971, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.498, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.089, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.399, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.237, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.095, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.379, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.133, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.448, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.583, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.511, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.128, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.077, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.764, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.409, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.417, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.117, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.035, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.745, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.203, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.888, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.195, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.761, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.292, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.053, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.003, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.921, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.378, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.716, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.354, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.769, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.988, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.856, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.251, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.255, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.316, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.433, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.668, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.83, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.072, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.494, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.547, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.856, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.21, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.859, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.07, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.039, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T00:00:00" + } + ], + "canonical_quantum": "0.00000001", + "diagnostic_limit": null, + "difference": null, + "expected": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.672, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.414, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.153, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.753, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.48700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.38, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.07300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.85000000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.598, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.47500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.529, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.654, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.89, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.907, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.789, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.443, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.35900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.22200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.98, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.69500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.931, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.956, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.923, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.974, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.214, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.083, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.313, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.9, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.12, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.383, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.61500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.36200000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.73, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.641, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-27T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.34, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.73100000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.60300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.11500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.28, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.248, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94800000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.051, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.348, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.08200000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.004, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.499, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34100000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.415, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.333, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73100000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.788, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.824, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.959, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.122, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.705, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.422, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.074, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.849, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.093, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.029, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.982, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.70400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.131, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.825, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.809, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.011, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.06700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.202, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.763, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.676, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.068, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.694, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.96000000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.759, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.009, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.93900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.137, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.242, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.303, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.156, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.051, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.31400000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.542, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.023, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.244, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.866, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.211, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.289, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.22, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.23700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.623, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-25T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.996, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.889, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.645, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.253, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21600000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.45400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.845, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.328, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.949, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73100000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.13, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95100000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T17:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34700000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.971, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.498, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.089, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.399, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.095, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.379, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.133, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-24T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.583, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35600000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.511, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.128, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.077, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.764, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.409, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.417, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.117, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.035, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.745, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.203, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.888, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.761, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.292, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.053, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.003, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.921, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.378, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.354, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.769, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.988, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.85600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.251, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.255, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.316, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.433, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.668, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20400000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.072, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.494, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.547, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.85600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.21000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.85900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.07000000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-29T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.039, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T21:00:00+00:00" + } + ], + "message": "exact ordered match", + "name": "fill_level_match", + "passed": true + } + ], + "framework": "Zipline", + "passed": true, + "scenario_id": "17" + }, + "detail": null, + "duration_seconds": 2.8047522220294923, + "framework": "zipline", + "framework_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "price": 101.119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.672, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.86500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.414, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.153, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.753, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.67, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.48700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.38, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 101.07300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.85000000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.598, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.47500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.529, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.654, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 100.89, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.68900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.907, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.789, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.443, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.31, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.35900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.94200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.22200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.84700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.98, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.07900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.46300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.69500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.931, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.956, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.923, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.974, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.214, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.083, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.313, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.9, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.12, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.71300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.383, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.11500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.61500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.16, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.36200000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.91, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.73, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 99.21600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.47500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.641, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-27T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.34, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.73100000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 98.386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.60300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 97.11500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.28, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.07900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.248, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.94800000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.051, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.348, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.32300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.08200000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.58800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.004, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.499, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.34100000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.415, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.333, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.73100000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.788, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.824, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.78, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.959, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.122, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.705, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.422, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.074, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.849, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.093, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.029, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.51, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.96000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.982, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.82000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.70400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.131, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.825, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.809, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.011, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.06700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.202, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.763, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.96600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.81400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.676, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.068, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.09400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.694, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.96000000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.759, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.009, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.97200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.93900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.137, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.242, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.303, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.156, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.051, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.31400000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.542, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.023, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.244, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.866, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.211, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.289, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.22, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.23700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.623, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.54, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-25T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.996, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82300000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.889, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.645, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.253, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21600000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.45400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.08200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.05, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.845, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.328, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.949, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.73100000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.13, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.95100000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.82900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.06700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.88, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.96900000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.25, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.60300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T17:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.34700000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.23700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.971, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.498, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.21600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.22800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.089, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.399, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.57300000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.23700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.095, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.379, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.133, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.94500000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-24T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.44800000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.583, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.35600000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.511, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.128, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.66, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.077, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.764, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.409, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.417, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.117, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 96.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 95.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.035, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.57900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.745, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.56700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.203, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.888, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84700000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.84, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.19500000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.761, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.292, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.053, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.003, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.921, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.378, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.71600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.354, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.20400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.86, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.769, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.97200000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.988, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.85600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.251, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.255, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 94.316, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.433, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 93.047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 92.668, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.58, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.20400000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.83, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.072, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 91.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 90.494, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.547, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.85600000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T20:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.21000000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 87.85900000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.07000000000001, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T21:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 88.84400000000001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-29T18:00:00+00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "price": 89.039, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T21:00:00+00:00" + } + ], + "final_value": 100811.00000000015, + "framework": "Zipline", + "num_trades": 337, + "total_pnl": 811.0000000001455, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.119, + "entry_time": "2020-01-03T21:00:00+00:00", + "exit_price": 100.032, + "exit_time": "2020-01-06T21:00:00+00:00", + "pnl": -108.70000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.672, + "entry_time": "2020-01-09T21:00:00+00:00", + "exit_price": 99.86500000000001, + "exit_time": "2020-01-10T21:00:00+00:00", + "pnl": 19.300000000001205, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.745, + "entry_time": "2020-01-15T21:00:00+00:00", + "exit_price": 99.432, + "exit_time": "2020-01-16T21:00:00+00:00", + "pnl": -31.30000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.592, + "entry_time": "2020-01-21T21:00:00+00:00", + "exit_price": 99.21300000000001, + "exit_time": "2020-01-22T21:00:00+00:00", + "pnl": -37.89999999999907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.933, + "entry_time": "2020-01-24T21:00:00+00:00", + "exit_price": 100.129, + "exit_time": "2020-01-27T21:00:00+00:00", + "pnl": 19.599999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21000000000001, + "entry_time": "2020-01-30T21:00:00+00:00", + "exit_price": 99.284, + "exit_time": "2020-01-31T21:00:00+00:00", + "pnl": 7.399999999999807, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.414, + "entry_time": "2020-02-05T21:00:00+00:00", + "exit_price": 99.742, + "exit_time": "2020-02-06T21:00:00+00:00", + "pnl": 132.8000000000003, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.153, + "entry_time": "2020-02-10T21:00:00+00:00", + "exit_price": 98.958, + "exit_time": "2020-02-12T21:00:00+00:00", + "pnl": -19.50000000000074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.398, + "entry_time": "2020-02-14T21:00:00+00:00", + "exit_price": 98.714, + "exit_time": "2020-02-18T21:00:00+00:00", + "pnl": -68.39999999999975, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.687, + "entry_time": "2020-02-20T21:00:00+00:00", + "exit_price": 99.197, + "exit_time": "2020-02-21T21:00:00+00:00", + "pnl": 51.00000000000051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.753, + "entry_time": "2020-02-26T21:00:00+00:00", + "exit_price": 98.67, + "exit_time": "2020-02-27T21:00:00+00:00", + "pnl": -8.29999999999984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.944, + "entry_time": "2020-03-02T21:00:00+00:00", + "exit_price": 99.276, + "exit_time": "2020-03-04T21:00:00+00:00", + "pnl": -66.80000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.967, + "entry_time": "2020-03-06T21:00:00+00:00", + "exit_price": 99.019, + "exit_time": "2020-03-09T20:00:00+00:00", + "pnl": -94.79999999999933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.614, + "entry_time": "2020-03-12T20:00:00+00:00", + "exit_price": 99.444, + "exit_time": "2020-03-13T20:00:00+00:00", + "pnl": -17.00000000000017, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.48700000000001, + "entry_time": "2020-03-18T20:00:00+00:00", + "exit_price": 98.539, + "exit_time": "2020-03-19T20:00:00+00:00", + "pnl": -94.80000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.361, + "entry_time": "2020-03-23T20:00:00+00:00", + "exit_price": 99.394, + "exit_time": "2020-03-25T20:00:00+00:00", + "pnl": 103.30000000000013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38, + "entry_time": "2020-03-27T20:00:00+00:00", + "exit_price": 99.783, + "exit_time": "2020-03-30T20:00:00+00:00", + "pnl": 40.30000000000058, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.044, + "entry_time": "2020-04-02T20:00:00+00:00", + "exit_price": 100.006, + "exit_time": "2020-04-03T20:00:00+00:00", + "pnl": -3.7999999999996703, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.07300000000001, + "entry_time": "2020-04-08T20:00:00+00:00", + "exit_price": 99.85000000000001, + "exit_time": "2020-04-09T20:00:00+00:00", + "pnl": -122.2999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.163, + "entry_time": "2020-04-14T20:00:00+00:00", + "exit_price": 99.598, + "exit_time": "2020-04-15T20:00:00+00:00", + "pnl": -56.49999999999977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.024, + "entry_time": "2020-04-17T20:00:00+00:00", + "exit_price": 100.102, + "exit_time": "2020-04-20T20:00:00+00:00", + "pnl": 7.800000000000296, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.47500000000001, + "entry_time": "2020-04-23T20:00:00+00:00", + "exit_price": 100.785, + "exit_time": "2020-04-24T20:00:00+00:00", + "pnl": 30.999999999998806, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.284, + "entry_time": "2020-04-29T20:00:00+00:00", + "exit_price": 100.408, + "exit_time": "2020-04-30T20:00:00+00:00", + "pnl": 12.399999999999523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.529, + "entry_time": "2020-05-04T20:00:00+00:00", + "exit_price": 100.468, + "exit_time": "2020-05-06T20:00:00+00:00", + "pnl": -6.099999999999284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.654, + "entry_time": "2020-05-08T20:00:00+00:00", + "exit_price": 100.845, + "exit_time": "2020-05-11T20:00:00+00:00", + "pnl": 19.10000000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.833, + "entry_time": "2020-05-14T20:00:00+00:00", + "exit_price": 100.141, + "exit_time": "2020-05-15T20:00:00+00:00", + "pnl": -69.1999999999993, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.172, + "entry_time": "2020-05-20T20:00:00+00:00", + "exit_price": 100.89, + "exit_time": "2020-05-21T20:00:00+00:00", + "pnl": 171.80000000000035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-05-26T20:00:00+00:00", + "exit_price": 99.429, + "exit_time": "2020-05-27T20:00:00+00:00", + "pnl": 56.90000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.671, + "entry_time": "2020-05-29T20:00:00+00:00", + "exit_price": 97.998, + "exit_time": "2020-06-01T20:00:00+00:00", + "pnl": -67.30000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.68900000000001, + "entry_time": "2020-06-04T20:00:00+00:00", + "exit_price": 98.907, + "exit_time": "2020-06-05T20:00:00+00:00", + "pnl": 21.79999999999893, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.789, + "entry_time": "2020-06-10T20:00:00+00:00", + "exit_price": 99.443, + "exit_time": "2020-06-11T20:00:00+00:00", + "pnl": 65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31, + "entry_time": "2020-06-15T20:00:00+00:00", + "exit_price": 98.913, + "exit_time": "2020-06-17T20:00:00+00:00", + "pnl": -39.70000000000056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.35900000000001, + "entry_time": "2020-06-19T20:00:00+00:00", + "exit_price": 99.246, + "exit_time": "2020-06-22T20:00:00+00:00", + "pnl": -11.300000000001376, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-06-25T20:00:00+00:00", + "exit_price": 98.94200000000001, + "exit_time": "2020-06-26T20:00:00+00:00", + "pnl": 8.200000000000784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.476, + "entry_time": "2020-07-01T20:00:00+00:00", + "exit_price": 98.22200000000001, + "exit_time": "2020-07-02T20:00:00+00:00", + "pnl": -25.399999999999068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.275, + "entry_time": "2020-07-07T20:00:00+00:00", + "exit_price": 99.229, + "exit_time": "2020-07-08T20:00:00+00:00", + "pnl": -4.600000000000648, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.84700000000001, + "entry_time": "2020-07-10T20:00:00+00:00", + "exit_price": 98.98, + "exit_time": "2020-07-13T20:00:00+00:00", + "pnl": 13.299999999999557, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.523, + "entry_time": "2020-07-16T20:00:00+00:00", + "exit_price": 98.848, + "exit_time": "2020-07-17T20:00:00+00:00", + "pnl": -67.49999999999972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.07900000000001, + "entry_time": "2020-07-22T20:00:00+00:00", + "exit_price": 98.46300000000001, + "exit_time": "2020-07-23T20:00:00+00:00", + "pnl": 38.400000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.336, + "entry_time": "2020-07-27T20:00:00+00:00", + "exit_price": 97.69500000000001, + "exit_time": "2020-07-29T20:00:00+00:00", + "pnl": -164.0999999999991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.931, + "entry_time": "2020-07-31T20:00:00+00:00", + "exit_price": 98.053, + "exit_time": "2020-08-03T20:00:00+00:00", + "pnl": 12.199999999999989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.956, + "entry_time": "2020-08-06T20:00:00+00:00", + "exit_price": 97.857, + "exit_time": "2020-08-07T20:00:00+00:00", + "pnl": -109.90000000000038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.834, + "entry_time": "2020-08-12T20:00:00+00:00", + "exit_price": 97.257, + "exit_time": "2020-08-13T20:00:00+00:00", + "pnl": -57.69999999999982, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16, + "entry_time": "2020-08-17T20:00:00+00:00", + "exit_price": 98.416, + "exit_time": "2020-08-19T20:00:00+00:00", + "pnl": 25.600000000000023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.923, + "entry_time": "2020-08-21T20:00:00+00:00", + "exit_price": 97.974, + "exit_time": "2020-08-24T20:00:00+00:00", + "pnl": 5.100000000000193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.214, + "entry_time": "2020-08-27T20:00:00+00:00", + "exit_price": 98.083, + "exit_time": "2020-08-28T20:00:00+00:00", + "pnl": -113.10000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.001, + "entry_time": "2020-09-02T20:00:00+00:00", + "exit_price": 98.653, + "exit_time": "2020-09-03T20:00:00+00:00", + "pnl": 65.2000000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.474, + "entry_time": "2020-09-08T20:00:00+00:00", + "exit_price": 98.313, + "exit_time": "2020-09-09T20:00:00+00:00", + "pnl": -116.10000000000014, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.732, + "entry_time": "2020-09-11T20:00:00+00:00", + "exit_price": 98.566, + "exit_time": "2020-09-14T20:00:00+00:00", + "pnl": 83.40000000000032, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.9, + "entry_time": "2020-09-17T20:00:00+00:00", + "exit_price": 98.388, + "exit_time": "2020-09-18T20:00:00+00:00", + "pnl": 148.79999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.12, + "entry_time": "2020-09-23T20:00:00+00:00", + "exit_price": 99.257, + "exit_time": "2020-09-24T20:00:00+00:00", + "pnl": 13.700000000000045, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.71300000000001, + "entry_time": "2020-09-28T20:00:00+00:00", + "exit_price": 99.383, + "exit_time": "2020-09-30T20:00:00+00:00", + "pnl": 66.99999999999875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.584, + "entry_time": "2020-10-02T20:00:00+00:00", + "exit_price": 99.318, + "exit_time": "2020-10-05T20:00:00+00:00", + "pnl": -26.600000000000534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.11500000000001, + "entry_time": "2020-10-08T20:00:00+00:00", + "exit_price": 97.468, + "exit_time": "2020-10-09T20:00:00+00:00", + "pnl": -64.70000000000056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.61500000000001, + "entry_time": "2020-10-14T20:00:00+00:00", + "exit_price": 98.16, + "exit_time": "2020-10-15T20:00:00+00:00", + "pnl": 54.49999999999875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.36200000000001, + "entry_time": "2020-10-19T20:00:00+00:00", + "exit_price": 98.412, + "exit_time": "2020-10-21T20:00:00+00:00", + "pnl": 104.99999999999972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.782, + "entry_time": "2020-10-23T20:00:00+00:00", + "exit_price": 98.91, + "exit_time": "2020-10-26T20:00:00+00:00", + "pnl": 12.800000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.73, + "entry_time": "2020-10-29T20:00:00+00:00", + "exit_price": 98.608, + "exit_time": "2020-10-30T20:00:00+00:00", + "pnl": -12.199999999999989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21600000000001, + "entry_time": "2020-11-04T21:00:00+00:00", + "exit_price": 98.491, + "exit_time": "2020-11-05T21:00:00+00:00", + "pnl": -72.50000000000085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.95, + "entry_time": "2020-11-09T21:00:00+00:00", + "exit_price": 97.827, + "exit_time": "2020-11-11T21:00:00+00:00", + "pnl": -12.300000000000466, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.914, + "entry_time": "2020-11-13T21:00:00+00:00", + "exit_price": 98.93, + "exit_time": "2020-11-16T21:00:00+00:00", + "pnl": 1.6000000000005343, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.47500000000001, + "entry_time": "2020-11-19T21:00:00+00:00", + "exit_price": 98.101, + "exit_time": "2020-11-20T21:00:00+00:00", + "pnl": -37.400000000000944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.485, + "entry_time": "2020-11-25T21:00:00+00:00", + "exit_price": 98.641, + "exit_time": "2020-11-27T18:00:00+00:00", + "pnl": 15.600000000000591, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.76, + "entry_time": "2020-11-30T21:00:00+00:00", + "exit_price": 97.799, + "exit_time": "2020-12-02T21:00:00+00:00", + "pnl": 3.900000000000148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.985, + "entry_time": "2020-12-04T21:00:00+00:00", + "exit_price": 98.34, + "exit_time": "2020-12-07T21:00:00+00:00", + "pnl": 35.5000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.428, + "entry_time": "2020-12-10T21:00:00+00:00", + "exit_price": 96.632, + "exit_time": "2020-12-11T21:00:00+00:00", + "pnl": -79.59999999999923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.73100000000001, + "entry_time": "2020-12-16T21:00:00+00:00", + "exit_price": 97.619, + "exit_time": "2020-12-17T21:00:00+00:00", + "pnl": 88.7999999999991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.386, + "entry_time": "2020-12-21T21:00:00+00:00", + "exit_price": 96.994, + "exit_time": "2020-12-23T21:00:00+00:00", + "pnl": -139.1999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.124, + "entry_time": "2020-12-28T21:00:00+00:00", + "exit_price": 97.539, + "exit_time": "2020-12-29T21:00:00+00:00", + "pnl": 41.500000000000625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.60300000000001, + "entry_time": "2020-12-31T21:00:00+00:00", + "exit_price": 96.822, + "exit_time": "2021-01-04T21:00:00+00:00", + "pnl": -78.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.791, + "entry_time": "2021-01-06T21:00:00+00:00", + "exit_price": 97.11500000000001, + "exit_time": "2021-01-07T21:00:00+00:00", + "pnl": 32.40000000000123, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.811, + "entry_time": "2021-01-11T21:00:00+00:00", + "exit_price": 96.28, + "exit_time": "2021-01-13T21:00:00+00:00", + "pnl": -53.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.533, + "entry_time": "2021-01-15T21:00:00+00:00", + "exit_price": 96.07900000000001, + "exit_time": "2021-01-19T21:00:00+00:00", + "pnl": -45.39999999999935, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.796, + "entry_time": "2021-01-21T21:00:00+00:00", + "exit_price": 95.248, + "exit_time": "2021-01-22T21:00:00+00:00", + "pnl": -54.80000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.556, + "entry_time": "2021-01-27T21:00:00+00:00", + "exit_price": 96.557, + "exit_time": "2021-01-28T21:00:00+00:00", + "pnl": 100.10000000000048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.251, + "entry_time": "2021-02-01T21:00:00+00:00", + "exit_price": 95.837, + "exit_time": "2021-02-03T21:00:00+00:00", + "pnl": -41.40000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.265, + "entry_time": "2021-02-05T21:00:00+00:00", + "exit_price": 95.261, + "exit_time": "2021-02-08T21:00:00+00:00", + "pnl": -0.40000000000048885, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.94800000000001, + "entry_time": "2021-02-11T21:00:00+00:00", + "exit_price": 95.051, + "exit_time": "2021-02-12T21:00:00+00:00", + "pnl": 10.299999999999443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97, + "entry_time": "2021-02-17T21:00:00+00:00", + "exit_price": 96.348, + "exit_time": "2021-02-18T21:00:00+00:00", + "pnl": -62.19999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.318, + "entry_time": "2021-02-22T21:00:00+00:00", + "exit_price": 95.625, + "exit_time": "2021-02-24T21:00:00+00:00", + "pnl": -69.29999999999978, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2021-02-26T21:00:00+00:00", + "exit_price": 95.236, + "exit_time": "2021-03-01T21:00:00+00:00", + "pnl": 35.00000000000085, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.403, + "entry_time": "2021-03-04T21:00:00+00:00", + "exit_price": 94.32300000000001, + "exit_time": "2021-03-05T21:00:00+00:00", + "pnl": -7.9999999999998295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.08200000000001, + "entry_time": "2021-03-10T21:00:00+00:00", + "exit_price": 94.58800000000001, + "exit_time": "2021-03-11T21:00:00+00:00", + "pnl": -49.39999999999998, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.802, + "entry_time": "2021-03-15T20:00:00+00:00", + "exit_price": 94.783, + "exit_time": "2021-03-17T20:00:00+00:00", + "pnl": -1.9000000000005457, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.661, + "entry_time": "2021-03-19T20:00:00+00:00", + "exit_price": 95.004, + "exit_time": "2021-03-22T20:00:00+00:00", + "pnl": 134.30000000000035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.499, + "entry_time": "2021-03-25T20:00:00+00:00", + "exit_price": 93.976, + "exit_time": "2021-03-26T20:00:00+00:00", + "pnl": -152.2999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.019, + "entry_time": "2021-03-31T20:00:00+00:00", + "exit_price": 94.256, + "exit_time": "2021-04-01T20:00:00+00:00", + "pnl": 23.699999999999477, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.471, + "entry_time": "2021-04-06T20:00:00+00:00", + "exit_price": 93.724, + "exit_time": "2021-04-07T20:00:00+00:00", + "pnl": 25.30000000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.199, + "entry_time": "2021-04-09T20:00:00+00:00", + "exit_price": 93.34100000000001, + "exit_time": "2021-04-12T20:00:00+00:00", + "pnl": 14.200000000001012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.729, + "entry_time": "2021-04-15T20:00:00+00:00", + "exit_price": 93.256, + "exit_time": "2021-04-16T20:00:00+00:00", + "pnl": -47.2999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.926, + "entry_time": "2021-04-21T20:00:00+00:00", + "exit_price": 94.143, + "exit_time": "2021-04-22T20:00:00+00:00", + "pnl": 121.69999999999987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.774, + "entry_time": "2021-04-26T20:00:00+00:00", + "exit_price": 93.493, + "exit_time": "2021-04-28T20:00:00+00:00", + "pnl": -28.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.685, + "entry_time": "2021-04-30T20:00:00+00:00", + "exit_price": 94.267, + "exit_time": "2021-05-03T20:00:00+00:00", + "pnl": 58.19999999999936, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.415, + "entry_time": "2021-05-06T20:00:00+00:00", + "exit_price": 93.364, + "exit_time": "2021-05-07T20:00:00+00:00", + "pnl": -5.100000000000193, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.742, + "entry_time": "2021-05-12T20:00:00+00:00", + "exit_price": 94.554, + "exit_time": "2021-05-13T20:00:00+00:00", + "pnl": 81.19999999999976, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.502, + "entry_time": "2021-05-17T20:00:00+00:00", + "exit_price": 94.556, + "exit_time": "2021-05-19T20:00:00+00:00", + "pnl": 105.4000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.081, + "entry_time": "2021-05-21T20:00:00+00:00", + "exit_price": 92.813, + "exit_time": "2021-05-24T20:00:00+00:00", + "pnl": -26.800000000000068, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.953, + "entry_time": "2021-05-27T20:00:00+00:00", + "exit_price": 93.147, + "exit_time": "2021-05-28T20:00:00+00:00", + "pnl": 19.40000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94500000000001, + "entry_time": "2021-06-02T20:00:00+00:00", + "exit_price": 92.896, + "exit_time": "2021-06-03T20:00:00+00:00", + "pnl": -4.900000000000659, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.577, + "entry_time": "2021-06-07T20:00:00+00:00", + "exit_price": 91.284, + "exit_time": "2021-06-09T20:00:00+00:00", + "pnl": -129.29999999999922, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2021-06-11T20:00:00+00:00", + "exit_price": 92.333, + "exit_time": "2021-06-14T20:00:00+00:00", + "pnl": -79.6999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.95, + "entry_time": "2021-06-17T20:00:00+00:00", + "exit_price": 92.166, + "exit_time": "2021-06-18T20:00:00+00:00", + "pnl": 21.599999999999397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.256, + "entry_time": "2021-06-23T20:00:00+00:00", + "exit_price": 92.456, + "exit_time": "2021-06-24T20:00:00+00:00", + "pnl": 20.000000000000284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.73100000000001, + "entry_time": "2021-06-28T20:00:00+00:00", + "exit_price": 91.788, + "exit_time": "2021-06-30T20:00:00+00:00", + "pnl": 5.699999999998795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.941, + "entry_time": "2021-07-02T20:00:00+00:00", + "exit_price": 90.653, + "exit_time": "2021-07-06T20:00:00+00:00", + "pnl": -28.79999999999967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.824, + "entry_time": "2021-07-08T20:00:00+00:00", + "exit_price": 91.78, + "exit_time": "2021-07-09T20:00:00+00:00", + "pnl": -4.399999999999693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.098, + "entry_time": "2021-07-14T20:00:00+00:00", + "exit_price": 91.642, + "exit_time": "2021-07-15T20:00:00+00:00", + "pnl": 54.39999999999969, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.333, + "entry_time": "2021-07-19T20:00:00+00:00", + "exit_price": 91.025, + "exit_time": "2021-07-21T20:00:00+00:00", + "pnl": -30.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.238, + "entry_time": "2021-07-23T20:00:00+00:00", + "exit_price": 91.959, + "exit_time": "2021-07-26T20:00:00+00:00", + "pnl": 72.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.122, + "entry_time": "2021-07-29T20:00:00+00:00", + "exit_price": 93.031, + "exit_time": "2021-07-30T20:00:00+00:00", + "pnl": 90.9000000000006, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16, + "entry_time": "2021-08-04T20:00:00+00:00", + "exit_price": 91.643, + "exit_time": "2021-08-05T20:00:00+00:00", + "pnl": -51.69999999999959, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.188, + "entry_time": "2021-08-09T20:00:00+00:00", + "exit_price": 93.342, + "exit_time": "2021-08-11T20:00:00+00:00", + "pnl": 15.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.618, + "entry_time": "2021-08-13T20:00:00+00:00", + "exit_price": 94.259, + "exit_time": "2021-08-16T20:00:00+00:00", + "pnl": 64.10000000000053, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98, + "entry_time": "2021-08-19T20:00:00+00:00", + "exit_price": 93.988, + "exit_time": "2021-08-20T20:00:00+00:00", + "pnl": 100.79999999999956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2021-08-25T20:00:00+00:00", + "exit_price": 92.705, + "exit_time": "2021-08-26T20:00:00+00:00", + "pnl": 2.400000000000091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.361, + "entry_time": "2021-08-30T20:00:00+00:00", + "exit_price": 93.802, + "exit_time": "2021-09-01T20:00:00+00:00", + "pnl": 144.10000000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.154, + "entry_time": "2021-09-03T20:00:00+00:00", + "exit_price": 93.729, + "exit_time": "2021-09-07T20:00:00+00:00", + "pnl": 57.500000000000284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.158, + "entry_time": "2021-09-09T20:00:00+00:00", + "exit_price": 93.741, + "exit_time": "2021-09-10T20:00:00+00:00", + "pnl": -41.70000000000016, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.019, + "entry_time": "2021-09-15T20:00:00+00:00", + "exit_price": 94.422, + "exit_time": "2021-09-16T20:00:00+00:00", + "pnl": -59.70000000000084, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.354, + "entry_time": "2021-09-20T20:00:00+00:00", + "exit_price": 94.986, + "exit_time": "2021-09-22T20:00:00+00:00", + "pnl": 63.2000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87, + "entry_time": "2021-09-24T20:00:00+00:00", + "exit_price": 94.849, + "exit_time": "2021-09-27T20:00:00+00:00", + "pnl": 97.89999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.309, + "entry_time": "2021-09-30T20:00:00+00:00", + "exit_price": 93.994, + "exit_time": "2021-10-01T20:00:00+00:00", + "pnl": -31.499999999999773, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.074, + "entry_time": "2021-10-06T20:00:00+00:00", + "exit_price": 94.048, + "exit_time": "2021-10-07T20:00:00+00:00", + "pnl": -2.599999999999625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.849, + "entry_time": "2021-10-11T20:00:00+00:00", + "exit_price": 94.437, + "exit_time": "2021-10-13T20:00:00+00:00", + "pnl": 58.799999999999386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2021-10-15T20:00:00+00:00", + "exit_price": 95.093, + "exit_time": "2021-10-18T20:00:00+00:00", + "pnl": 72.2999999999999, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.029, + "entry_time": "2021-10-21T20:00:00+00:00", + "exit_price": 94.805, + "exit_time": "2021-10-22T20:00:00+00:00", + "pnl": 77.60000000000105, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.249, + "entry_time": "2021-10-27T20:00:00+00:00", + "exit_price": 93.601, + "exit_time": "2021-10-28T20:00:00+00:00", + "pnl": -64.79999999999961, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.241, + "entry_time": "2021-11-01T20:00:00+00:00", + "exit_price": 94.429, + "exit_time": "2021-11-03T20:00:00+00:00", + "pnl": 118.80000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.416, + "entry_time": "2021-11-05T20:00:00+00:00", + "exit_price": 92.51, + "exit_time": "2021-11-08T21:00:00+00:00", + "pnl": -90.59999999999917, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96000000000001, + "entry_time": "2021-11-11T21:00:00+00:00", + "exit_price": 93.531, + "exit_time": "2021-11-12T21:00:00+00:00", + "pnl": 57.099999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.427, + "entry_time": "2021-11-17T21:00:00+00:00", + "exit_price": 92.196, + "exit_time": "2021-11-18T21:00:00+00:00", + "pnl": -23.100000000000875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52, + "entry_time": "2021-11-22T21:00:00+00:00", + "exit_price": 93.982, + "exit_time": "2021-11-24T21:00:00+00:00", + "pnl": 146.20000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82000000000001, + "entry_time": "2021-12-02T21:00:00+00:00", + "exit_price": 91.736, + "exit_time": "2021-12-03T21:00:00+00:00", + "pnl": -8.400000000000318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.70400000000001, + "entry_time": "2021-12-08T21:00:00+00:00", + "exit_price": 92.183, + "exit_time": "2021-12-09T21:00:00+00:00", + "pnl": 47.89999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.131, + "entry_time": "2021-12-13T21:00:00+00:00", + "exit_price": 92.825, + "exit_time": "2021-12-15T21:00:00+00:00", + "pnl": 69.40000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.809, + "entry_time": "2021-12-17T21:00:00+00:00", + "exit_price": 93.226, + "exit_time": "2021-12-20T21:00:00+00:00", + "pnl": -58.29999999999984, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06700000000001, + "entry_time": "2021-12-23T21:00:00+00:00", + "exit_price": 92.105, + "exit_time": "2021-12-27T21:00:00+00:00", + "pnl": -96.20000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.026, + "entry_time": "2021-12-29T21:00:00+00:00", + "exit_price": 93.011, + "exit_time": "2021-12-30T21:00:00+00:00", + "pnl": 98.49999999999994, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.06700000000001, + "entry_time": "2022-01-03T21:00:00+00:00", + "exit_price": 91.642, + "exit_time": "2022-01-05T21:00:00+00:00", + "pnl": -42.50000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.202, + "entry_time": "2022-01-07T21:00:00+00:00", + "exit_price": 91.813, + "exit_time": "2022-01-10T21:00:00+00:00", + "pnl": -38.89999999999958, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.255, + "entry_time": "2022-01-13T21:00:00+00:00", + "exit_price": 91.97500000000001, + "exit_time": "2022-01-14T21:00:00+00:00", + "pnl": -27.999999999998693, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.763, + "entry_time": "2022-01-19T21:00:00+00:00", + "exit_price": 91.432, + "exit_time": "2022-01-20T21:00:00+00:00", + "pnl": -33.10000000000031, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.96600000000001, + "entry_time": "2022-01-24T21:00:00+00:00", + "exit_price": 91.852, + "exit_time": "2022-01-26T21:00:00+00:00", + "pnl": -11.400000000000432, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.81400000000001, + "entry_time": "2022-01-28T21:00:00+00:00", + "exit_price": 91.676, + "exit_time": "2022-01-31T21:00:00+00:00", + "pnl": 86.19999999999948, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.985, + "entry_time": "2022-02-03T21:00:00+00:00", + "exit_price": 91.188, + "exit_time": "2022-02-04T21:00:00+00:00", + "pnl": -79.6999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97, + "entry_time": "2022-02-09T21:00:00+00:00", + "exit_price": 92.17, + "exit_time": "2022-02-10T21:00:00+00:00", + "pnl": 20.000000000000284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.507, + "entry_time": "2022-02-14T21:00:00+00:00", + "exit_price": 91.156, + "exit_time": "2022-02-16T21:00:00+00:00", + "pnl": -35.09999999999991, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.661, + "entry_time": "2022-02-18T21:00:00+00:00", + "exit_price": 92.287, + "exit_time": "2022-02-22T21:00:00+00:00", + "pnl": 62.60000000000048, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.068, + "entry_time": "2022-02-24T21:00:00+00:00", + "exit_price": 91.351, + "exit_time": "2022-02-25T21:00:00+00:00", + "pnl": 28.300000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.09400000000001, + "entry_time": "2022-03-02T21:00:00+00:00", + "exit_price": 91.421, + "exit_time": "2022-03-03T21:00:00+00:00", + "pnl": -67.30000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2022-03-07T21:00:00+00:00", + "exit_price": 91.526, + "exit_time": "2022-03-09T21:00:00+00:00", + "pnl": -48.7000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.012, + "entry_time": "2022-03-11T21:00:00+00:00", + "exit_price": 90.821, + "exit_time": "2022-03-14T20:00:00+00:00", + "pnl": -19.10000000000025, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.925, + "entry_time": "2022-03-17T20:00:00+00:00", + "exit_price": 90.615, + "exit_time": "2022-03-18T20:00:00+00:00", + "pnl": -131.00000000000023, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.965, + "entry_time": "2022-03-23T20:00:00+00:00", + "exit_price": 90.7, + "exit_time": "2022-03-24T20:00:00+00:00", + "pnl": -26.500000000000057, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.683, + "entry_time": "2022-03-28T20:00:00+00:00", + "exit_price": 91.694, + "exit_time": "2022-03-30T20:00:00+00:00", + "pnl": 101.09999999999957, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87, + "entry_time": "2022-04-01T20:00:00+00:00", + "exit_price": 90.055, + "exit_time": "2022-04-04T20:00:00+00:00", + "pnl": -81.49999999999977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.631, + "entry_time": "2022-04-07T20:00:00+00:00", + "exit_price": 89.96000000000001, + "exit_time": "2022-04-08T20:00:00+00:00", + "pnl": -67.09999999999923, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.759, + "entry_time": "2022-04-13T20:00:00+00:00", + "exit_price": 90.97800000000001, + "exit_time": "2022-04-14T20:00:00+00:00", + "pnl": 121.90000000000083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.009, + "entry_time": "2022-04-19T20:00:00+00:00", + "exit_price": 90.97200000000001, + "exit_time": "2022-04-20T20:00:00+00:00", + "pnl": 96.30000000000081, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.449, + "entry_time": "2022-04-22T20:00:00+00:00", + "exit_price": 89.93900000000001, + "exit_time": "2022-04-25T20:00:00+00:00", + "pnl": -50.99999999999909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.137, + "entry_time": "2022-04-28T20:00:00+00:00", + "exit_price": 90.92, + "exit_time": "2022-04-29T20:00:00+00:00", + "pnl": 78.30000000000013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.235, + "entry_time": "2022-05-04T20:00:00+00:00", + "exit_price": 92.161, + "exit_time": "2022-05-05T20:00:00+00:00", + "pnl": 92.6000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.242, + "entry_time": "2022-05-09T20:00:00+00:00", + "exit_price": 91.392, + "exit_time": "2022-05-11T20:00:00+00:00", + "pnl": 114.99999999999915, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.798, + "entry_time": "2022-05-13T20:00:00+00:00", + "exit_price": 91.741, + "exit_time": "2022-05-16T20:00:00+00:00", + "pnl": -5.700000000000216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129, + "entry_time": "2022-05-19T20:00:00+00:00", + "exit_price": 91.294, + "exit_time": "2022-05-20T20:00:00+00:00", + "pnl": 16.499999999999204, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.508, + "entry_time": "2022-05-25T20:00:00+00:00", + "exit_price": 90.206, + "exit_time": "2022-05-26T20:00:00+00:00", + "pnl": -30.19999999999925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.881, + "entry_time": "2022-05-31T20:00:00+00:00", + "exit_price": 90.543, + "exit_time": "2022-06-01T20:00:00+00:00", + "pnl": 66.20000000000061, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.973, + "entry_time": "2022-06-03T20:00:00+00:00", + "exit_price": 90.741, + "exit_time": "2022-06-06T20:00:00+00:00", + "pnl": -23.199999999999932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.848, + "entry_time": "2022-06-09T20:00:00+00:00", + "exit_price": 90.837, + "exit_time": "2022-06-10T20:00:00+00:00", + "pnl": -1.099999999999568, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.825, + "entry_time": "2022-06-15T20:00:00+00:00", + "exit_price": 90.17, + "exit_time": "2022-06-16T20:00:00+00:00", + "pnl": -65.50000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.553, + "entry_time": "2022-06-21T20:00:00+00:00", + "exit_price": 90.601, + "exit_time": "2022-06-22T20:00:00+00:00", + "pnl": 4.800000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.687, + "entry_time": "2022-06-24T20:00:00+00:00", + "exit_price": 90.053, + "exit_time": "2022-06-27T20:00:00+00:00", + "pnl": -63.400000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.794, + "entry_time": "2022-06-30T20:00:00+00:00", + "exit_price": 92.411, + "exit_time": "2022-07-01T20:00:00+00:00", + "pnl": 161.70000000000044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.303, + "entry_time": "2022-07-06T20:00:00+00:00", + "exit_price": 90.141, + "exit_time": "2022-07-07T20:00:00+00:00", + "pnl": -116.19999999999919, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.156, + "entry_time": "2022-07-11T20:00:00+00:00", + "exit_price": 90.998, + "exit_time": "2022-07-13T20:00:00+00:00", + "pnl": -15.800000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.512, + "entry_time": "2022-07-15T20:00:00+00:00", + "exit_price": 91.253, + "exit_time": "2022-07-18T20:00:00+00:00", + "pnl": 74.09999999999997, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.474, + "entry_time": "2022-07-21T20:00:00+00:00", + "exit_price": 89.988, + "exit_time": "2022-07-22T20:00:00+00:00", + "pnl": -148.60000000000042, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.051, + "entry_time": "2022-07-27T20:00:00+00:00", + "exit_price": 91.31400000000001, + "exit_time": "2022-07-28T20:00:00+00:00", + "pnl": 26.300000000000523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.376, + "entry_time": "2022-08-01T20:00:00+00:00", + "exit_price": 91.542, + "exit_time": "2022-08-03T20:00:00+00:00", + "pnl": 16.59999999999968, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.898, + "entry_time": "2022-08-05T20:00:00+00:00", + "exit_price": 92.023, + "exit_time": "2022-08-08T20:00:00+00:00", + "pnl": 12.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.244, + "entry_time": "2022-08-11T20:00:00+00:00", + "exit_price": 92.691, + "exit_time": "2022-08-12T20:00:00+00:00", + "pnl": 44.70000000000027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.181, + "entry_time": "2022-08-17T20:00:00+00:00", + "exit_price": 92.495, + "exit_time": "2022-08-18T20:00:00+00:00", + "pnl": -68.59999999999928, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.024, + "entry_time": "2022-08-22T20:00:00+00:00", + "exit_price": 93.281, + "exit_time": "2022-08-24T20:00:00+00:00", + "pnl": 25.7000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.724, + "entry_time": "2022-08-26T20:00:00+00:00", + "exit_price": 93.027, + "exit_time": "2022-08-29T20:00:00+00:00", + "pnl": -69.70000000000027, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.267, + "entry_time": "2022-09-01T20:00:00+00:00", + "exit_price": 93.319, + "exit_time": "2022-09-02T20:00:00+00:00", + "pnl": 5.200000000000671, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.866, + "entry_time": "2022-09-07T20:00:00+00:00", + "exit_price": 93.548, + "exit_time": "2022-09-08T20:00:00+00:00", + "pnl": 68.20000000000022, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.821, + "entry_time": "2022-09-12T20:00:00+00:00", + "exit_price": 94.111, + "exit_time": "2022-09-14T20:00:00+00:00", + "pnl": 29.000000000000625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.782, + "entry_time": "2022-09-16T20:00:00+00:00", + "exit_price": 94.266, + "exit_time": "2022-09-19T20:00:00+00:00", + "pnl": -51.59999999999911, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.888, + "entry_time": "2022-09-22T20:00:00+00:00", + "exit_price": 94.905, + "exit_time": "2022-09-23T20:00:00+00:00", + "pnl": 1.6999999999995907, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.211, + "entry_time": "2022-09-28T20:00:00+00:00", + "exit_price": 93.622, + "exit_time": "2022-09-29T20:00:00+00:00", + "pnl": -58.899999999999864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.289, + "entry_time": "2022-10-03T20:00:00+00:00", + "exit_price": 95.218, + "exit_time": "2022-10-05T20:00:00+00:00", + "pnl": -7.099999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.625, + "entry_time": "2022-10-07T20:00:00+00:00", + "exit_price": 93.711, + "exit_time": "2022-10-10T20:00:00+00:00", + "pnl": -91.40000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22, + "entry_time": "2022-10-13T20:00:00+00:00", + "exit_price": 95.266, + "exit_time": "2022-10-14T20:00:00+00:00", + "pnl": 104.60000000000065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.369, + "entry_time": "2022-10-19T20:00:00+00:00", + "exit_price": 94.388, + "exit_time": "2022-10-20T20:00:00+00:00", + "pnl": 101.90000000000055, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2022-10-24T20:00:00+00:00", + "exit_price": 94.253, + "exit_time": "2022-10-26T20:00:00+00:00", + "pnl": 21.89999999999941, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.929, + "entry_time": "2022-10-28T20:00:00+00:00", + "exit_price": 95.019, + "exit_time": "2022-10-31T20:00:00+00:00", + "pnl": 9.000000000000341, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.458, + "entry_time": "2022-11-03T20:00:00+00:00", + "exit_price": 95.965, + "exit_time": "2022-11-04T20:00:00+00:00", + "pnl": -49.2999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.23700000000001, + "entry_time": "2022-11-09T21:00:00+00:00", + "exit_price": 94.586, + "exit_time": "2022-11-10T21:00:00+00:00", + "pnl": -65.10000000000105, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.712, + "entry_time": "2022-11-14T21:00:00+00:00", + "exit_price": 94.086, + "exit_time": "2022-11-16T21:00:00+00:00", + "pnl": 37.39999999999952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.205, + "entry_time": "2022-11-18T21:00:00+00:00", + "exit_price": 94.623, + "exit_time": "2022-11-21T21:00:00+00:00", + "pnl": 41.80000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54, + "entry_time": "2022-11-25T18:00:00+00:00", + "exit_price": 92.916, + "exit_time": "2022-12-01T21:00:00+00:00", + "pnl": -62.400000000000944, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.256, + "entry_time": "2022-12-05T21:00:00+00:00", + "exit_price": 93.35900000000001, + "exit_time": "2022-12-07T21:00:00+00:00", + "pnl": 10.300000000000864, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.218, + "entry_time": "2022-12-09T21:00:00+00:00", + "exit_price": 93.916, + "exit_time": "2022-12-12T21:00:00+00:00", + "pnl": 69.79999999999933, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.424, + "entry_time": "2022-12-15T21:00:00+00:00", + "exit_price": 92.996, + "exit_time": "2022-12-16T21:00:00+00:00", + "pnl": -42.80000000000115, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.738, + "entry_time": "2022-12-21T21:00:00+00:00", + "exit_price": 91.786, + "exit_time": "2022-12-22T21:00:00+00:00", + "pnl": 104.80000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.399, + "entry_time": "2022-12-27T21:00:00+00:00", + "exit_price": 92.116, + "exit_time": "2022-12-28T21:00:00+00:00", + "pnl": -28.300000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.771, + "entry_time": "2022-12-30T21:00:00+00:00", + "exit_price": 92.97800000000001, + "exit_time": "2023-01-03T21:00:00+00:00", + "pnl": 20.700000000000784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.82300000000001, + "entry_time": "2023-01-05T21:00:00+00:00", + "exit_price": 92.889, + "exit_time": "2023-01-06T21:00:00+00:00", + "pnl": 6.599999999998829, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.776, + "entry_time": "2023-01-11T21:00:00+00:00", + "exit_price": 92.849, + "exit_time": "2023-01-12T21:00:00+00:00", + "pnl": 7.30000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.165, + "entry_time": "2023-01-17T21:00:00+00:00", + "exit_price": 93.645, + "exit_time": "2023-01-18T21:00:00+00:00", + "pnl": 47.99999999999898, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.349, + "entry_time": "2023-01-20T21:00:00+00:00", + "exit_price": 93.529, + "exit_time": "2023-01-23T21:00:00+00:00", + "pnl": 117.99999999999926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.145, + "entry_time": "2023-01-26T21:00:00+00:00", + "exit_price": 93.092, + "exit_time": "2023-01-27T21:00:00+00:00", + "pnl": -105.29999999999973, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2023-02-01T21:00:00+00:00", + "exit_price": 92.672, + "exit_time": "2023-02-02T21:00:00+00:00", + "pnl": -136.2000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.253, + "entry_time": "2023-02-06T21:00:00+00:00", + "exit_price": 93.168, + "exit_time": "2023-02-08T21:00:00+00:00", + "pnl": -8.499999999999375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2023-02-10T21:00:00+00:00", + "exit_price": 94.092, + "exit_time": "2023-02-13T21:00:00+00:00", + "pnl": 96.20000000000033, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.536, + "entry_time": "2023-02-16T21:00:00+00:00", + "exit_price": 94.21600000000001, + "exit_time": "2023-02-17T21:00:00+00:00", + "pnl": -31.999999999999318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.185, + "entry_time": "2023-02-22T21:00:00+00:00", + "exit_price": 93.989, + "exit_time": "2023-02-23T21:00:00+00:00", + "pnl": -19.599999999999795, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.45400000000001, + "entry_time": "2023-02-27T21:00:00+00:00", + "exit_price": 94.437, + "exit_time": "2023-03-01T21:00:00+00:00", + "pnl": -1.7000000000010118, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.958, + "entry_time": "2023-03-03T21:00:00+00:00", + "exit_price": 93.665, + "exit_time": "2023-03-06T21:00:00+00:00", + "pnl": -29.299999999999216, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35000000000001, + "entry_time": "2023-03-09T21:00:00+00:00", + "exit_price": 93.062, + "exit_time": "2023-03-10T21:00:00+00:00", + "pnl": -28.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.884, + "entry_time": "2023-03-15T20:00:00+00:00", + "exit_price": 94.08200000000001, + "exit_time": "2023-03-16T20:00:00+00:00", + "pnl": 19.80000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.295, + "entry_time": "2023-03-20T20:00:00+00:00", + "exit_price": 92.05, + "exit_time": "2023-03-22T20:00:00+00:00", + "pnl": -24.500000000000455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.845, + "entry_time": "2023-03-24T20:00:00+00:00", + "exit_price": 93.328, + "exit_time": "2023-03-27T20:00:00+00:00", + "pnl": 148.3000000000004, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.949, + "entry_time": "2023-03-30T20:00:00+00:00", + "exit_price": 93.548, + "exit_time": "2023-03-31T20:00:00+00:00", + "pnl": 59.900000000000375, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.73100000000001, + "entry_time": "2023-04-05T20:00:00+00:00", + "exit_price": 92.13, + "exit_time": "2023-04-06T20:00:00+00:00", + "pnl": -60.10000000000133, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.325, + "entry_time": "2023-04-11T20:00:00+00:00", + "exit_price": 92.404, + "exit_time": "2023-04-12T20:00:00+00:00", + "pnl": -92.10000000000065, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56, + "entry_time": "2023-04-14T20:00:00+00:00", + "exit_price": 92.82900000000001, + "exit_time": "2023-04-17T20:00:00+00:00", + "pnl": 26.900000000000546, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-04-20T20:00:00+00:00", + "exit_price": 92.95100000000001, + "exit_time": "2023-04-21T20:00:00+00:00", + "pnl": 15.200000000000102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35900000000001, + "entry_time": "2023-04-26T20:00:00+00:00", + "exit_price": 92.905, + "exit_time": "2023-04-27T20:00:00+00:00", + "pnl": -45.40000000000077, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2023-05-01T20:00:00+00:00", + "exit_price": 92.82900000000001, + "exit_time": "2023-05-03T20:00:00+00:00", + "pnl": 14.800000000001035, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.06700000000001, + "entry_time": "2023-05-05T20:00:00+00:00", + "exit_price": 93.19500000000001, + "exit_time": "2023-05-08T20:00:00+00:00", + "pnl": 12.800000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.877, + "entry_time": "2023-05-11T20:00:00+00:00", + "exit_price": 93.476, + "exit_time": "2023-05-12T20:00:00+00:00", + "pnl": 159.90000000000038, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.775, + "entry_time": "2023-05-17T20:00:00+00:00", + "exit_price": 93.218, + "exit_time": "2023-05-18T20:00:00+00:00", + "pnl": 44.299999999999784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88, + "entry_time": "2023-05-22T20:00:00+00:00", + "exit_price": 93.96900000000001, + "exit_time": "2023-05-24T20:00:00+00:00", + "pnl": 8.900000000001285, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.333, + "entry_time": "2023-05-26T20:00:00+00:00", + "exit_price": 94.059, + "exit_time": "2023-05-30T20:00:00+00:00", + "pnl": -27.40000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.762, + "entry_time": "2023-06-01T20:00:00+00:00", + "exit_price": 94.25, + "exit_time": "2023-06-02T20:00:00+00:00", + "pnl": 148.79999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.294, + "entry_time": "2023-06-07T20:00:00+00:00", + "exit_price": 94.60300000000001, + "exit_time": "2023-06-08T20:00:00+00:00", + "pnl": 30.90000000000117, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.427, + "entry_time": "2023-06-12T20:00:00+00:00", + "exit_price": 94.339, + "exit_time": "2023-06-14T20:00:00+00:00", + "pnl": -8.800000000000807, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2023-06-16T20:00:00+00:00", + "exit_price": 94.163, + "exit_time": "2023-06-20T20:00:00+00:00", + "pnl": -20.700000000000784, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.953, + "entry_time": "2023-06-22T20:00:00+00:00", + "exit_price": 94.374, + "exit_time": "2023-06-23T20:00:00+00:00", + "pnl": -57.90000000000077, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.898, + "entry_time": "2023-06-28T20:00:00+00:00", + "exit_price": 94.566, + "exit_time": "2023-06-29T20:00:00+00:00", + "pnl": 66.80000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.277, + "entry_time": "2023-07-03T17:00:00+00:00", + "exit_price": 94.941, + "exit_time": "2023-07-10T20:00:00+00:00", + "pnl": 66.40000000000015, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493, + "entry_time": "2023-07-13T20:00:00+00:00", + "exit_price": 94.34700000000001, + "exit_time": "2023-07-14T20:00:00+00:00", + "pnl": -14.599999999998658, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.23700000000001, + "entry_time": "2023-07-19T20:00:00+00:00", + "exit_price": 94.334, + "exit_time": "2023-07-20T20:00:00+00:00", + "pnl": 109.69999999999942, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2023-07-24T20:00:00+00:00", + "exit_price": 93.304, + "exit_time": "2023-07-26T20:00:00+00:00", + "pnl": -22.700000000000387, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.055, + "entry_time": "2023-07-28T20:00:00+00:00", + "exit_price": 93.971, + "exit_time": "2023-07-31T20:00:00+00:00", + "pnl": -8.400000000000318, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.498, + "entry_time": "2023-08-03T20:00:00+00:00", + "exit_price": 93.961, + "exit_time": "2023-08-04T20:00:00+00:00", + "pnl": 46.299999999999386, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.21600000000001, + "entry_time": "2023-08-09T20:00:00+00:00", + "exit_price": 93.22800000000001, + "exit_time": "2023-08-10T20:00:00+00:00", + "pnl": -98.79999999999995, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.656, + "entry_time": "2023-08-14T20:00:00+00:00", + "exit_price": 94.398, + "exit_time": "2023-08-16T20:00:00+00:00", + "pnl": 174.19999999999902, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.089, + "entry_time": "2023-08-18T20:00:00+00:00", + "exit_price": 93.399, + "exit_time": "2023-08-21T20:00:00+00:00", + "pnl": -68.99999999999977, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-08-24T20:00:00+00:00", + "exit_price": 93.688, + "exit_time": "2023-08-25T20:00:00+00:00", + "pnl": 88.89999999999958, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.791, + "entry_time": "2023-08-30T20:00:00+00:00", + "exit_price": 92.57300000000001, + "exit_time": "2023-08-31T20:00:00+00:00", + "pnl": -121.79999999999893, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.041, + "entry_time": "2023-09-05T20:00:00+00:00", + "exit_price": 94.468, + "exit_time": "2023-09-06T20:00:00+00:00", + "pnl": 142.70000000000067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.23700000000001, + "entry_time": "2023-09-08T20:00:00+00:00", + "exit_price": 94.095, + "exit_time": "2023-09-11T20:00:00+00:00", + "pnl": -14.200000000001012, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.791, + "entry_time": "2023-09-14T20:00:00+00:00", + "exit_price": 94.029, + "exit_time": "2023-09-15T20:00:00+00:00", + "pnl": -76.20000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.173, + "entry_time": "2023-09-20T20:00:00+00:00", + "exit_price": 93.583, + "exit_time": "2023-09-21T20:00:00+00:00", + "pnl": -59.00000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.115, + "entry_time": "2023-09-25T20:00:00+00:00", + "exit_price": 93.162, + "exit_time": "2023-09-27T20:00:00+00:00", + "pnl": -95.29999999999887, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.496, + "entry_time": "2023-09-29T20:00:00+00:00", + "exit_price": 92.842, + "exit_time": "2023-10-02T20:00:00+00:00", + "pnl": -65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.019, + "entry_time": "2023-10-05T20:00:00+00:00", + "exit_price": 92.773, + "exit_time": "2023-10-06T20:00:00+00:00", + "pnl": -24.600000000000932, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.345, + "entry_time": "2023-10-11T20:00:00+00:00", + "exit_price": 92.322, + "exit_time": "2023-10-12T20:00:00+00:00", + "pnl": -2.2999999999996135, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.994, + "entry_time": "2023-10-16T20:00:00+00:00", + "exit_price": 91.586, + "exit_time": "2023-10-18T20:00:00+00:00", + "pnl": -40.800000000000125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.467, + "entry_time": "2023-10-20T20:00:00+00:00", + "exit_price": 92.361, + "exit_time": "2023-10-23T20:00:00+00:00", + "pnl": 89.40000000000055, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.379, + "entry_time": "2023-10-26T20:00:00+00:00", + "exit_price": 91.412, + "exit_time": "2023-10-27T20:00:00+00:00", + "pnl": -96.69999999999987, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43, + "entry_time": "2023-11-01T20:00:00+00:00", + "exit_price": 91.133, + "exit_time": "2023-11-02T20:00:00+00:00", + "pnl": -29.700000000001125, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.967, + "entry_time": "2023-11-06T21:00:00+00:00", + "exit_price": 91.602, + "exit_time": "2023-11-08T21:00:00+00:00", + "pnl": 63.50000000000051, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.416, + "entry_time": "2023-11-10T21:00:00+00:00", + "exit_price": 92.325, + "exit_time": "2023-11-13T21:00:00+00:00", + "pnl": -9.099999999999397, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.94500000000001, + "entry_time": "2023-11-16T21:00:00+00:00", + "exit_price": 92.019, + "exit_time": "2023-11-17T21:00:00+00:00", + "pnl": -92.6000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.744, + "entry_time": "2023-11-22T21:00:00+00:00", + "exit_price": 93.688, + "exit_time": "2023-11-24T18:00:00+00:00", + "pnl": 94.40000000000026, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.139, + "entry_time": "2023-11-27T21:00:00+00:00", + "exit_price": 92.476, + "exit_time": "2023-11-29T21:00:00+00:00", + "pnl": -166.29999999999967, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76, + "entry_time": "2023-12-01T21:00:00+00:00", + "exit_price": 93.44800000000001, + "exit_time": "2023-12-04T21:00:00+00:00", + "pnl": 68.80000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.583, + "entry_time": "2023-12-07T21:00:00+00:00", + "exit_price": 94.144, + "exit_time": "2023-12-08T21:00:00+00:00", + "pnl": 56.100000000000705, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.056, + "entry_time": "2023-12-13T21:00:00+00:00", + "exit_price": 93.35600000000001, + "exit_time": "2023-12-14T21:00:00+00:00", + "pnl": 130.00000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.194, + "entry_time": "2023-12-18T21:00:00+00:00", + "exit_price": 92.511, + "exit_time": "2023-12-20T21:00:00+00:00", + "pnl": 31.699999999999307, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.914, + "entry_time": "2023-12-22T21:00:00+00:00", + "exit_price": 92.894, + "exit_time": "2023-12-26T21:00:00+00:00", + "pnl": -101.9999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.128, + "entry_time": "2023-12-28T21:00:00+00:00", + "exit_price": 93.66, + "exit_time": "2023-12-29T21:00:00+00:00", + "pnl": 53.19999999999965, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.892, + "entry_time": "2024-01-03T21:00:00+00:00", + "exit_price": 94.589, + "exit_time": "2024-01-04T21:00:00+00:00", + "pnl": -30.299999999999727, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.077, + "entry_time": "2024-01-08T21:00:00+00:00", + "exit_price": 94.764, + "exit_time": "2024-01-10T21:00:00+00:00", + "pnl": -31.30000000000024, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.805, + "entry_time": "2024-01-12T21:00:00+00:00", + "exit_price": 94.409, + "exit_time": "2024-01-16T21:00:00+00:00", + "pnl": -39.60000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.092, + "entry_time": "2024-01-18T21:00:00+00:00", + "exit_price": 94.92, + "exit_time": "2024-01-19T21:00:00+00:00", + "pnl": -17.199999999999704, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2024-01-24T21:00:00+00:00", + "exit_price": 95.417, + "exit_time": "2024-01-25T21:00:00+00:00", + "pnl": 53.10000000000059, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.117, + "entry_time": "2024-01-29T21:00:00+00:00", + "exit_price": 94.586, + "exit_time": "2024-01-31T21:00:00+00:00", + "pnl": 46.89999999999941, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.519, + "entry_time": "2024-02-02T21:00:00+00:00", + "exit_price": 95.646, + "exit_time": "2024-02-05T21:00:00+00:00", + "pnl": 12.699999999999534, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.974, + "entry_time": "2024-02-08T21:00:00+00:00", + "exit_price": 96.257, + "exit_time": "2024-02-09T21:00:00+00:00", + "pnl": 128.30000000000013, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.384, + "entry_time": "2024-02-14T21:00:00+00:00", + "exit_price": 94.768, + "exit_time": "2024-02-15T21:00:00+00:00", + "pnl": 38.400000000000034, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.926, + "entry_time": "2024-02-20T21:00:00+00:00", + "exit_price": 95.284, + "exit_time": "2024-02-21T21:00:00+00:00", + "pnl": 35.80000000000041, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.645, + "entry_time": "2024-02-23T21:00:00+00:00", + "exit_price": 94.632, + "exit_time": "2024-02-26T21:00:00+00:00", + "pnl": -1.2999999999991019, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.994, + "entry_time": "2024-02-29T21:00:00+00:00", + "exit_price": 93.516, + "exit_time": "2024-03-01T21:00:00+00:00", + "pnl": 52.20000000000056, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.208, + "entry_time": "2024-03-06T21:00:00+00:00", + "exit_price": 93.035, + "exit_time": "2024-03-07T21:00:00+00:00", + "pnl": -17.300000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.57900000000001, + "entry_time": "2024-03-11T20:00:00+00:00", + "exit_price": 93.424, + "exit_time": "2024-03-13T20:00:00+00:00", + "pnl": -15.500000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.322, + "entry_time": "2024-03-15T20:00:00+00:00", + "exit_price": 93.745, + "exit_time": "2024-03-18T20:00:00+00:00", + "pnl": 42.30000000000018, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56700000000001, + "entry_time": "2024-03-21T20:00:00+00:00", + "exit_price": 90.994, + "exit_time": "2024-03-22T20:00:00+00:00", + "pnl": -157.30000000000075, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.365, + "entry_time": "2024-03-27T20:00:00+00:00", + "exit_price": 92.886, + "exit_time": "2024-03-28T20:00:00+00:00", + "pnl": 52.10000000000008, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.875, + "entry_time": "2024-04-02T20:00:00+00:00", + "exit_price": 92.605, + "exit_time": "2024-04-03T20:00:00+00:00", + "pnl": -26.999999999999602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.203, + "entry_time": "2024-04-05T20:00:00+00:00", + "exit_price": 92.389, + "exit_time": "2024-04-08T20:00:00+00:00", + "pnl": 18.599999999999284, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.968, + "entry_time": "2024-04-11T20:00:00+00:00", + "exit_price": 91.888, + "exit_time": "2024-04-12T20:00:00+00:00", + "pnl": -7.9999999999998295, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.872, + "entry_time": "2024-04-17T20:00:00+00:00", + "exit_price": 92.005, + "exit_time": "2024-04-18T20:00:00+00:00", + "pnl": -86.70000000000044, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.84700000000001, + "entry_time": "2024-04-22T20:00:00+00:00", + "exit_price": 91.521, + "exit_time": "2024-04-24T20:00:00+00:00", + "pnl": -132.60000000000076, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.615, + "entry_time": "2024-04-26T20:00:00+00:00", + "exit_price": 92.84, + "exit_time": "2024-04-29T20:00:00+00:00", + "pnl": 22.500000000000853, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.018, + "entry_time": "2024-05-02T20:00:00+00:00", + "exit_price": 93.19500000000001, + "exit_time": "2024-05-03T20:00:00+00:00", + "pnl": 117.70000000000067, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.761, + "entry_time": "2024-05-08T20:00:00+00:00", + "exit_price": 93.992, + "exit_time": "2024-05-09T20:00:00+00:00", + "pnl": 23.100000000000875, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.186, + "entry_time": "2024-05-13T20:00:00+00:00", + "exit_price": 93.292, + "exit_time": "2024-05-15T20:00:00+00:00", + "pnl": 10.599999999999454, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.053, + "entry_time": "2024-05-17T20:00:00+00:00", + "exit_price": 92.898, + "exit_time": "2024-05-20T20:00:00+00:00", + "pnl": -15.500000000000114, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.003, + "entry_time": "2024-05-23T20:00:00+00:00", + "exit_price": 93.803, + "exit_time": "2024-05-24T20:00:00+00:00", + "pnl": 79.99999999999972, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2024-05-29T20:00:00+00:00", + "exit_price": 93.551, + "exit_time": "2024-05-30T20:00:00+00:00", + "pnl": 1.999999999999602, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.921, + "entry_time": "2024-06-03T20:00:00+00:00", + "exit_price": 93.378, + "exit_time": "2024-06-05T20:00:00+00:00", + "pnl": -54.30000000000064, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.738, + "entry_time": "2024-06-07T20:00:00+00:00", + "exit_price": 94.058, + "exit_time": "2024-06-10T20:00:00+00:00", + "pnl": 32.00000000000074, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.71600000000001, + "entry_time": "2024-06-13T20:00:00+00:00", + "exit_price": 92.354, + "exit_time": "2024-06-14T20:00:00+00:00", + "pnl": -36.2000000000009, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.20400000000001, + "entry_time": "2024-06-20T20:00:00+00:00", + "exit_price": 93.86, + "exit_time": "2024-06-26T20:00:00+00:00", + "pnl": -34.40000000000083, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.769, + "entry_time": "2024-06-28T20:00:00+00:00", + "exit_price": 94.267, + "exit_time": "2024-07-01T20:00:00+00:00", + "pnl": 149.79999999999905, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.501, + "entry_time": "2024-07-05T20:00:00+00:00", + "exit_price": 92.97200000000001, + "exit_time": "2024-07-11T20:00:00+00:00", + "pnl": -52.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.501, + "entry_time": "2024-07-15T20:00:00+00:00", + "exit_price": 92.553, + "exit_time": "2024-07-17T20:00:00+00:00", + "pnl": 5.19999999999925, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.928, + "entry_time": "2024-07-19T20:00:00+00:00", + "exit_price": 92.018, + "exit_time": "2024-07-22T20:00:00+00:00", + "pnl": 9.000000000000341, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.988, + "entry_time": "2024-07-25T20:00:00+00:00", + "exit_price": 92.135, + "exit_time": "2024-07-26T20:00:00+00:00", + "pnl": 14.700000000000557, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.85600000000001, + "entry_time": "2024-07-31T20:00:00+00:00", + "exit_price": 92.251, + "exit_time": "2024-08-01T20:00:00+00:00", + "pnl": 39.4999999999996, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.903, + "entry_time": "2024-08-05T20:00:00+00:00", + "exit_price": 91.614, + "exit_time": "2024-08-07T20:00:00+00:00", + "pnl": -28.900000000000148, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.266, + "entry_time": "2024-08-09T20:00:00+00:00", + "exit_price": 93.255, + "exit_time": "2024-08-12T20:00:00+00:00", + "pnl": 98.89999999999901, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.888, + "entry_time": "2024-08-15T20:00:00+00:00", + "exit_price": 92.534, + "exit_time": "2024-08-16T20:00:00+00:00", + "pnl": -35.39999999999992, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.352, + "entry_time": "2024-08-21T20:00:00+00:00", + "exit_price": 93.822, + "exit_time": "2024-08-22T20:00:00+00:00", + "pnl": 46.999999999999886, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2024-08-26T20:00:00+00:00", + "exit_price": 93.143, + "exit_time": "2024-08-28T20:00:00+00:00", + "pnl": 112.99999999999955, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.316, + "entry_time": "2024-08-30T20:00:00+00:00", + "exit_price": 92.433, + "exit_time": "2024-09-03T20:00:00+00:00", + "pnl": -188.29999999999956, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.742, + "entry_time": "2024-09-05T20:00:00+00:00", + "exit_price": 93.047, + "exit_time": "2024-09-06T20:00:00+00:00", + "pnl": 30.49999999999926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.668, + "entry_time": "2024-09-11T20:00:00+00:00", + "exit_price": 91.661, + "exit_time": "2024-09-12T20:00:00+00:00", + "pnl": -100.7000000000005, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.179, + "entry_time": "2024-09-16T20:00:00+00:00", + "exit_price": 91.58, + "exit_time": "2024-09-18T20:00:00+00:00", + "pnl": 40.099999999999625, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.285, + "entry_time": "2024-09-20T20:00:00+00:00", + "exit_price": 90.104, + "exit_time": "2024-09-23T20:00:00+00:00", + "pnl": -18.09999999999974, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.052, + "entry_time": "2024-09-26T20:00:00+00:00", + "exit_price": 91.20400000000001, + "exit_time": "2024-09-27T20:00:00+00:00", + "pnl": 15.200000000000102, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.551, + "entry_time": "2024-10-02T20:00:00+00:00", + "exit_price": 90.177, + "exit_time": "2024-10-03T20:00:00+00:00", + "pnl": -137.39999999999952, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83, + "entry_time": "2024-10-07T20:00:00+00:00", + "exit_price": 91.072, + "exit_time": "2024-10-09T20:00:00+00:00", + "pnl": 24.200000000000443, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.139, + "entry_time": "2024-10-11T20:00:00+00:00", + "exit_price": 90.93, + "exit_time": "2024-10-14T20:00:00+00:00", + "pnl": -20.899999999998897, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.494, + "entry_time": "2024-10-17T20:00:00+00:00", + "exit_price": 89.863, + "exit_time": "2024-10-18T20:00:00+00:00", + "pnl": -63.10000000000002, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.811, + "entry_time": "2024-10-23T20:00:00+00:00", + "exit_price": 89.547, + "exit_time": "2024-10-24T20:00:00+00:00", + "pnl": -26.400000000001, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.85600000000001, + "entry_time": "2024-10-28T20:00:00+00:00", + "exit_price": 89.886, + "exit_time": "2024-10-30T20:00:00+00:00", + "pnl": 2.9999999999986926, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52, + "entry_time": "2024-11-01T20:00:00+00:00", + "exit_price": 89.584, + "exit_time": "2024-11-04T21:00:00+00:00", + "pnl": 106.40000000000072, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.328, + "entry_time": "2024-11-07T21:00:00+00:00", + "exit_price": 89.065, + "exit_time": "2024-11-08T21:00:00+00:00", + "pnl": -26.300000000000523, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21000000000001, + "entry_time": "2024-11-13T21:00:00+00:00", + "exit_price": 88.452, + "exit_time": "2024-11-14T21:00:00+00:00", + "pnl": -75.80000000000098, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.85900000000001, + "entry_time": "2024-11-18T21:00:00+00:00", + "exit_price": 88.672, + "exit_time": "2024-11-20T21:00:00+00:00", + "pnl": 81.29999999999882, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.369, + "entry_time": "2024-11-22T21:00:00+00:00", + "exit_price": 89.07000000000001, + "exit_time": "2024-11-25T21:00:00+00:00", + "pnl": -29.89999999999924, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.84400000000001, + "entry_time": "2024-11-29T18:00:00+00:00", + "exit_price": 89.039, + "exit_time": "2024-12-05T21:00:00+00:00", + "pnl": 19.499999999999318, + "size": 100.0 + } + ] + }, + "ml4t_result": { + "capabilities": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "extra": {}, + "fills": [ + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.119, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.032, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.672, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.865, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.745, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.592, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.213, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.933, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.129, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.21, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-01-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.414, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.742, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.153, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.958, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.398, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.714, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.197, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.753, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.67, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.944, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.276, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.614, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.444, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.487, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.394, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.38, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.044, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.006, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 101.073, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.85, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.163, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.598, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.102, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.785, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.284, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.408, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.529, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.654, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.845, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 100.833, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.172, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 100.89, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.671, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.689, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.907, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.789, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.443, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.31, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.913, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.246, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.86, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-06-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.942, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.476, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.222, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.275, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.229, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.98, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.523, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.848, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.079, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.463, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.336, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.695, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.931, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.956, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.857, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.834, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.416, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.923, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.974, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.214, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-08-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.083, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.001, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.313, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.732, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.9, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.12, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.713, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.383, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.584, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 99.318, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.16, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.362, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.91, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.73, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-10-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.608, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 99.216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.491, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.827, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.475, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.101, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.485, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.641, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-11-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.799, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 98.34, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.428, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.619, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 98.386, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.124, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.539, + "quantity": 100.0, + "side": "sell", + "timestamp": "2020-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 97.603, + "quantity": 100.0, + "side": "buy", + "timestamp": "2020-12-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 97.115, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.28, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.533, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.079, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.796, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.248, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.556, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.557, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.251, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.265, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.261, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.948, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.051, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.348, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.318, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.625, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.236, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.403, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.323, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.082, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.588, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.802, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.783, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.004, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.499, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.976, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-03-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.471, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.724, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.199, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.341, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.729, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.256, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.774, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.493, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.685, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-04-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.415, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.364, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.554, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.502, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.556, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.081, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-05-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.147, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-05-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.896, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.577, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.333, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.95, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.166, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.456, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.788, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.941, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.653, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.824, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.78, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.098, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.025, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.238, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.959, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.122, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-07-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.031, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-07-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.16, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.643, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.188, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.342, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.618, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.259, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.98, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.705, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.361, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.802, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.154, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.729, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.158, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.422, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.354, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.986, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.309, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-09-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.074, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.048, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.849, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.093, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.029, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.805, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.249, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.241, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.429, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.51, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.96, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.531, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.196, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.982, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.82, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.736, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.704, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.183, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.131, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.825, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.809, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.226, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.105, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.026, + "quantity": 100.0, + "side": "buy", + "timestamp": "2021-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.011, + "quantity": 100.0, + "side": "sell", + "timestamp": "2021-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.642, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.202, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.813, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.255, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.975, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.763, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.432, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.966, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.852, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.814, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-01-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.676, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.985, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.188, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.97, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.507, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.156, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.661, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.287, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.068, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-02-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.351, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-02-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.094, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.421, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.526, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.012, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.821, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.925, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.615, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.965, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.7, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.683, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.694, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.87, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.055, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.631, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.96, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.759, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.009, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.449, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.939, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.137, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-04-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.235, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.161, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.242, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.392, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.798, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.129, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.294, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.508, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.206, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.881, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-05-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.543, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.973, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.741, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.848, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.837, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.825, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.17, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.553, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.601, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.687, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.053, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-06-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.794, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-06-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.411, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.303, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.141, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.156, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.998, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.512, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.474, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.988, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.051, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-07-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.314, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.376, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.542, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.023, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.244, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.691, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.181, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.495, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.024, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.281, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.724, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.027, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-08-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.267, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.319, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.866, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.821, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.111, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.782, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.211, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-09-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.622, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.289, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.625, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.711, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.22, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.266, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.388, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.253, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.929, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-10-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 96.458, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.965, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.237, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.712, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.086, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.205, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.623, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-11-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.54, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.256, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.359, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.218, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.916, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.424, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.996, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.786, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.399, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.116, + "quantity": 100.0, + "side": "sell", + "timestamp": "2022-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.771, + "quantity": 100.0, + "side": "buy", + "timestamp": "2022-12-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.978, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.823, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.889, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.776, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.849, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.165, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.645, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.349, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.529, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.145, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-01-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-01-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.034, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.253, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.168, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.13, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.092, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.536, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.216, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.185, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.989, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.454, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-02-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.437, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.958, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.665, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.35, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.062, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.884, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.082, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.295, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.05, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.845, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.328, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.949, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-03-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.548, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-03-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.731, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.13, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.325, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.404, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.56, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.829, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.951, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.359, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.905, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-04-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.681, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.829, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.067, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.195, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.877, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.775, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.218, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.88, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.969, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.333, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-05-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.059, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.762, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.25, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.294, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.603, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.427, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.339, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.37, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.163, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.953, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.374, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.898, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.566, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-06-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.277, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.941, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.493, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.347, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.237, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.334, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.304, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.055, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-07-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.971, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.498, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.961, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.216, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.228, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.656, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.398, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.089, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.399, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.799, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.573, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-08-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.041, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.468, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.237, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.095, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.791, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.029, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.173, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.583, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.115, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.162, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.496, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-09-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.842, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.019, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.773, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.345, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.322, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.467, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.361, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.379, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-10-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.412, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-10-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.43, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.133, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.967, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.602, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.416, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.325, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.945, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.019, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.744, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.688, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-11-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.476, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.76, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.448, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.583, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.144, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.056, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.356, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.194, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.511, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.914, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.894, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.128, + "quantity": 100.0, + "side": "buy", + "timestamp": "2023-12-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.66, + "quantity": 100.0, + "side": "sell", + "timestamp": "2023-12-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.892, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.589, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.077, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.764, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.805, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.409, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.092, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.92, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.886, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.417, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.117, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-01-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.586, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-01-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 95.519, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.646, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.974, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 96.257, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.384, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.768, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.926, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 95.284, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.645, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.632, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-02-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.994, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-02-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.516, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.208, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.035, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.579, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.424, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.322, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.745, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.567, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.994, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.365, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-03-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-03-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.875, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.605, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.203, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.389, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.968, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.888, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.872, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.005, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.847, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.521, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.615, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-04-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.84, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-04-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.018, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.195, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.761, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.992, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.186, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.292, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.053, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.898, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.003, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.803, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.531, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-05-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.551, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-05-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.921, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.378, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.738, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.058, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-10T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.716, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.354, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.204, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.86, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-06-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.769, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-06-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 94.267, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.972, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.501, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.553, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.928, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-19T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.018, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.988, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.135, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-07-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.856, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-07-31T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.251, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.903, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.614, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.266, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.255, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.888, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-15T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.534, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 93.352, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-21T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.822, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.013, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.143, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-08-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 94.316, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-08-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 92.433, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.742, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-05T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 93.047, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-06T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 92.668, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.661, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-12T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.179, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-16T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.58, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.285, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.104, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.052, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-09-26T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.204, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-09-27T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.551, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-02T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.177, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-03T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.83, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 91.072, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-09T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 91.139, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-11T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 90.93, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 90.494, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-17T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.863, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.811, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-23T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.547, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-24T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.856, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-10-28T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.886, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-10-30T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.52, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-01T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.584, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-04T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.328, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-07T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.065, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-08T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.21, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-13T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.452, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-14T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 87.859, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-18T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 88.672, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-20T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 89.369, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-22T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.07, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-11-25T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "", + "price": 88.844, + "quantity": 100.0, + "side": "buy", + "timestamp": "2024-11-29T00:00:00" + }, + { + "asset": "TEST", + "commission": 0.0, + "exit_reason": "signal", + "price": 89.039, + "quantity": 100.0, + "side": "sell", + "timestamp": "2024-12-05T00:00:00" + } + ], + "final_value": 100811.00000000025, + "framework": "ml4t.backtest", + "num_trades": 337, + "total_pnl": 811.0000000002474, + "trades": [ + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.119, + "entry_time": "2020-01-03T00:00:00", + "exit_price": 100.032, + "exit_reason": "signal", + "exit_time": "2020-01-06T00:00:00", + "pnl": -108.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.672, + "entry_time": "2020-01-09T00:00:00", + "exit_price": 99.865, + "exit_reason": "signal", + "exit_time": "2020-01-10T00:00:00", + "pnl": 19.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.745, + "entry_time": "2020-01-15T00:00:00", + "exit_price": 99.432, + "exit_reason": "signal", + "exit_time": "2020-01-16T00:00:00", + "pnl": -31.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.592, + "entry_time": "2020-01-21T00:00:00", + "exit_price": 99.213, + "exit_reason": "signal", + "exit_time": "2020-01-22T00:00:00", + "pnl": -37.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.933, + "entry_time": "2020-01-24T00:00:00", + "exit_price": 100.129, + "exit_reason": "signal", + "exit_time": "2020-01-27T00:00:00", + "pnl": 19.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.21, + "entry_time": "2020-01-30T00:00:00", + "exit_price": 99.284, + "exit_reason": "signal", + "exit_time": "2020-01-31T00:00:00", + "pnl": 7.400000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.414, + "entry_time": "2020-02-05T00:00:00", + "exit_price": 99.742, + "exit_reason": "signal", + "exit_time": "2020-02-06T00:00:00", + "pnl": 132.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.153, + "entry_time": "2020-02-10T00:00:00", + "exit_price": 98.958, + "exit_reason": "signal", + "exit_time": "2020-02-12T00:00:00", + "pnl": -19.50000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.398, + "entry_time": "2020-02-14T00:00:00", + "exit_price": 98.714, + "exit_reason": "signal", + "exit_time": "2020-02-18T00:00:00", + "pnl": -68.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.687, + "entry_time": "2020-02-20T00:00:00", + "exit_price": 99.197, + "exit_reason": "signal", + "exit_time": "2020-02-21T00:00:00", + "pnl": 51.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.753, + "entry_time": "2020-02-26T00:00:00", + "exit_price": 98.67, + "exit_reason": "signal", + "exit_time": "2020-02-27T00:00:00", + "pnl": -8.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.944, + "entry_time": "2020-03-02T00:00:00", + "exit_price": 99.276, + "exit_reason": "signal", + "exit_time": "2020-03-04T00:00:00", + "pnl": -66.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.967, + "entry_time": "2020-03-06T00:00:00", + "exit_price": 99.019, + "exit_reason": "signal", + "exit_time": "2020-03-09T00:00:00", + "pnl": -94.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.614, + "entry_time": "2020-03-12T00:00:00", + "exit_price": 99.444, + "exit_reason": "signal", + "exit_time": "2020-03-13T00:00:00", + "pnl": -17.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.487, + "entry_time": "2020-03-18T00:00:00", + "exit_price": 98.539, + "exit_reason": "signal", + "exit_time": "2020-03-19T00:00:00", + "pnl": -94.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.361, + "entry_time": "2020-03-23T00:00:00", + "exit_price": 99.394, + "exit_reason": "signal", + "exit_time": "2020-03-25T00:00:00", + "pnl": 103.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.38, + "entry_time": "2020-03-27T00:00:00", + "exit_price": 99.783, + "exit_reason": "signal", + "exit_time": "2020-03-30T00:00:00", + "pnl": 40.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.044, + "entry_time": "2020-04-02T00:00:00", + "exit_price": 100.006, + "exit_reason": "signal", + "exit_time": "2020-04-03T00:00:00", + "pnl": -3.7999999999992724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 101.073, + "entry_time": "2020-04-08T00:00:00", + "exit_price": 99.85, + "exit_reason": "signal", + "exit_time": "2020-04-09T00:00:00", + "pnl": -122.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.163, + "entry_time": "2020-04-14T00:00:00", + "exit_price": 99.598, + "exit_reason": "signal", + "exit_time": "2020-04-15T00:00:00", + "pnl": -56.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.024, + "entry_time": "2020-04-17T00:00:00", + "exit_price": 100.102, + "exit_reason": "signal", + "exit_time": "2020-04-20T00:00:00", + "pnl": 7.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.475, + "entry_time": "2020-04-23T00:00:00", + "exit_price": 100.785, + "exit_reason": "signal", + "exit_time": "2020-04-24T00:00:00", + "pnl": 31.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.284, + "entry_time": "2020-04-29T00:00:00", + "exit_price": 100.408, + "exit_reason": "signal", + "exit_time": "2020-04-30T00:00:00", + "pnl": 12.399999999997817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.529, + "entry_time": "2020-05-04T00:00:00", + "exit_price": 100.468, + "exit_reason": "signal", + "exit_time": "2020-05-06T00:00:00", + "pnl": -6.099999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.654, + "entry_time": "2020-05-08T00:00:00", + "exit_price": 100.845, + "exit_reason": "signal", + "exit_time": "2020-05-11T00:00:00", + "pnl": 19.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 100.833, + "entry_time": "2020-05-14T00:00:00", + "exit_price": 100.141, + "exit_reason": "signal", + "exit_time": "2020-05-15T00:00:00", + "pnl": -69.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.172, + "entry_time": "2020-05-20T00:00:00", + "exit_price": 100.89, + "exit_reason": "signal", + "exit_time": "2020-05-21T00:00:00", + "pnl": 171.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-05-26T00:00:00", + "exit_price": 99.429, + "exit_reason": "signal", + "exit_time": "2020-05-27T00:00:00", + "pnl": 56.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.671, + "entry_time": "2020-05-29T00:00:00", + "exit_price": 97.998, + "exit_reason": "signal", + "exit_time": "2020-06-01T00:00:00", + "pnl": -67.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.689, + "entry_time": "2020-06-04T00:00:00", + "exit_price": 98.907, + "exit_reason": "signal", + "exit_time": "2020-06-05T00:00:00", + "pnl": 21.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.789, + "entry_time": "2020-06-10T00:00:00", + "exit_price": 99.443, + "exit_reason": "signal", + "exit_time": "2020-06-11T00:00:00", + "pnl": 65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.31, + "entry_time": "2020-06-15T00:00:00", + "exit_price": 98.913, + "exit_reason": "signal", + "exit_time": "2020-06-17T00:00:00", + "pnl": -39.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.359, + "entry_time": "2020-06-19T00:00:00", + "exit_price": 99.246, + "exit_reason": "signal", + "exit_time": "2020-06-22T00:00:00", + "pnl": -11.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.86, + "entry_time": "2020-06-25T00:00:00", + "exit_price": 98.942, + "exit_reason": "signal", + "exit_time": "2020-06-26T00:00:00", + "pnl": 8.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.476, + "entry_time": "2020-07-01T00:00:00", + "exit_price": 98.222, + "exit_reason": "signal", + "exit_time": "2020-07-02T00:00:00", + "pnl": -25.400000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.275, + "entry_time": "2020-07-07T00:00:00", + "exit_price": 99.229, + "exit_reason": "signal", + "exit_time": "2020-07-08T00:00:00", + "pnl": -4.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.847, + "entry_time": "2020-07-10T00:00:00", + "exit_price": 98.98, + "exit_reason": "signal", + "exit_time": "2020-07-13T00:00:00", + "pnl": 13.300000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.523, + "entry_time": "2020-07-16T00:00:00", + "exit_price": 98.848, + "exit_reason": "signal", + "exit_time": "2020-07-17T00:00:00", + "pnl": -67.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.079, + "entry_time": "2020-07-22T00:00:00", + "exit_price": 98.463, + "exit_reason": "signal", + "exit_time": "2020-07-23T00:00:00", + "pnl": 38.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.336, + "entry_time": "2020-07-27T00:00:00", + "exit_price": 97.695, + "exit_reason": "signal", + "exit_time": "2020-07-29T00:00:00", + "pnl": -164.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.931, + "entry_time": "2020-07-31T00:00:00", + "exit_price": 98.053, + "exit_reason": "signal", + "exit_time": "2020-08-03T00:00:00", + "pnl": 12.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.956, + "entry_time": "2020-08-06T00:00:00", + "exit_price": 97.857, + "exit_reason": "signal", + "exit_time": "2020-08-07T00:00:00", + "pnl": -109.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.834, + "entry_time": "2020-08-12T00:00:00", + "exit_price": 97.257, + "exit_reason": "signal", + "exit_time": "2020-08-13T00:00:00", + "pnl": -57.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.16, + "entry_time": "2020-08-17T00:00:00", + "exit_price": 98.416, + "exit_reason": "signal", + "exit_time": "2020-08-19T00:00:00", + "pnl": 25.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.923, + "entry_time": "2020-08-21T00:00:00", + "exit_price": 97.974, + "exit_reason": "signal", + "exit_time": "2020-08-24T00:00:00", + "pnl": 5.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.214, + "entry_time": "2020-08-27T00:00:00", + "exit_price": 98.083, + "exit_reason": "signal", + "exit_time": "2020-08-28T00:00:00", + "pnl": -113.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.001, + "entry_time": "2020-09-02T00:00:00", + "exit_price": 98.653, + "exit_reason": "signal", + "exit_time": "2020-09-03T00:00:00", + "pnl": 65.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.474, + "entry_time": "2020-09-08T00:00:00", + "exit_price": 98.313, + "exit_reason": "signal", + "exit_time": "2020-09-09T00:00:00", + "pnl": -116.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.732, + "entry_time": "2020-09-11T00:00:00", + "exit_price": 98.566, + "exit_reason": "signal", + "exit_time": "2020-09-14T00:00:00", + "pnl": 83.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.9, + "entry_time": "2020-09-17T00:00:00", + "exit_price": 98.388, + "exit_reason": "signal", + "exit_time": "2020-09-18T00:00:00", + "pnl": 148.8000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.12, + "entry_time": "2020-09-23T00:00:00", + "exit_price": 99.257, + "exit_reason": "signal", + "exit_time": "2020-09-24T00:00:00", + "pnl": 13.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.713, + "entry_time": "2020-09-28T00:00:00", + "exit_price": 99.383, + "exit_reason": "signal", + "exit_time": "2020-09-30T00:00:00", + "pnl": 67.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.584, + "entry_time": "2020-10-02T00:00:00", + "exit_price": 99.318, + "exit_reason": "signal", + "exit_time": "2020-10-05T00:00:00", + "pnl": -26.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.115, + "entry_time": "2020-10-08T00:00:00", + "exit_price": 97.468, + "exit_reason": "signal", + "exit_time": "2020-10-09T00:00:00", + "pnl": -64.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.615, + "entry_time": "2020-10-14T00:00:00", + "exit_price": 98.16, + "exit_reason": "signal", + "exit_time": "2020-10-15T00:00:00", + "pnl": 54.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.362, + "entry_time": "2020-10-19T00:00:00", + "exit_price": 98.412, + "exit_reason": "signal", + "exit_time": "2020-10-21T00:00:00", + "pnl": 105.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.782, + "entry_time": "2020-10-23T00:00:00", + "exit_price": 98.91, + "exit_reason": "signal", + "exit_time": "2020-10-26T00:00:00", + "pnl": 12.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.73, + "entry_time": "2020-10-29T00:00:00", + "exit_price": 98.608, + "exit_reason": "signal", + "exit_time": "2020-10-30T00:00:00", + "pnl": -12.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 99.216, + "entry_time": "2020-11-04T00:00:00", + "exit_price": 98.491, + "exit_reason": "signal", + "exit_time": "2020-11-05T00:00:00", + "pnl": -72.49999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.95, + "entry_time": "2020-11-09T00:00:00", + "exit_price": 97.827, + "exit_reason": "signal", + "exit_time": "2020-11-11T00:00:00", + "pnl": -12.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.914, + "entry_time": "2020-11-13T00:00:00", + "exit_price": 98.93, + "exit_reason": "signal", + "exit_time": "2020-11-16T00:00:00", + "pnl": 1.6000000000003638, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.475, + "entry_time": "2020-11-19T00:00:00", + "exit_price": 98.101, + "exit_reason": "signal", + "exit_time": "2020-11-20T00:00:00", + "pnl": -37.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.485, + "entry_time": "2020-11-25T00:00:00", + "exit_price": 98.641, + "exit_reason": "signal", + "exit_time": "2020-11-27T00:00:00", + "pnl": 15.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.76, + "entry_time": "2020-11-30T00:00:00", + "exit_price": 97.799, + "exit_reason": "signal", + "exit_time": "2020-12-02T00:00:00", + "pnl": 3.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.985, + "entry_time": "2020-12-04T00:00:00", + "exit_price": 98.34, + "exit_reason": "signal", + "exit_time": "2020-12-07T00:00:00", + "pnl": 35.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.428, + "entry_time": "2020-12-10T00:00:00", + "exit_price": 96.632, + "exit_reason": "signal", + "exit_time": "2020-12-11T00:00:00", + "pnl": -79.59999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.731, + "entry_time": "2020-12-16T00:00:00", + "exit_price": 97.619, + "exit_reason": "signal", + "exit_time": "2020-12-17T00:00:00", + "pnl": 88.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 98.386, + "entry_time": "2020-12-21T00:00:00", + "exit_price": 96.994, + "exit_reason": "signal", + "exit_time": "2020-12-23T00:00:00", + "pnl": -139.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.124, + "entry_time": "2020-12-28T00:00:00", + "exit_price": 97.539, + "exit_reason": "signal", + "exit_time": "2020-12-29T00:00:00", + "pnl": 41.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 97.603, + "entry_time": "2020-12-31T00:00:00", + "exit_price": 96.822, + "exit_reason": "signal", + "exit_time": "2021-01-04T00:00:00", + "pnl": -78.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.791, + "entry_time": "2021-01-06T00:00:00", + "exit_price": 97.115, + "exit_reason": "signal", + "exit_time": "2021-01-07T00:00:00", + "pnl": 32.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.811, + "entry_time": "2021-01-11T00:00:00", + "exit_price": 96.28, + "exit_reason": "signal", + "exit_time": "2021-01-13T00:00:00", + "pnl": -53.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.533, + "entry_time": "2021-01-15T00:00:00", + "exit_price": 96.079, + "exit_reason": "signal", + "exit_time": "2021-01-19T00:00:00", + "pnl": -45.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.796, + "entry_time": "2021-01-21T00:00:00", + "exit_price": 95.248, + "exit_reason": "signal", + "exit_time": "2021-01-22T00:00:00", + "pnl": -54.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.556, + "entry_time": "2021-01-27T00:00:00", + "exit_price": 96.557, + "exit_reason": "signal", + "exit_time": "2021-01-28T00:00:00", + "pnl": 100.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.251, + "entry_time": "2021-02-01T00:00:00", + "exit_price": 95.837, + "exit_reason": "signal", + "exit_time": "2021-02-03T00:00:00", + "pnl": -41.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.265, + "entry_time": "2021-02-05T00:00:00", + "exit_price": 95.261, + "exit_reason": "signal", + "exit_time": "2021-02-08T00:00:00", + "pnl": -0.3999999999996362, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.948, + "entry_time": "2021-02-11T00:00:00", + "exit_price": 95.051, + "exit_reason": "signal", + "exit_time": "2021-02-12T00:00:00", + "pnl": 10.300000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.97, + "entry_time": "2021-02-17T00:00:00", + "exit_price": 96.348, + "exit_reason": "signal", + "exit_time": "2021-02-18T00:00:00", + "pnl": -62.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.318, + "entry_time": "2021-02-22T00:00:00", + "exit_price": 95.625, + "exit_reason": "signal", + "exit_time": "2021-02-24T00:00:00", + "pnl": -69.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2021-02-26T00:00:00", + "exit_price": 95.236, + "exit_reason": "signal", + "exit_time": "2021-03-01T00:00:00", + "pnl": 35.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.403, + "entry_time": "2021-03-04T00:00:00", + "exit_price": 94.323, + "exit_reason": "signal", + "exit_time": "2021-03-05T00:00:00", + "pnl": -8.000000000001819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.082, + "entry_time": "2021-03-10T00:00:00", + "exit_price": 94.588, + "exit_reason": "signal", + "exit_time": "2021-03-11T00:00:00", + "pnl": -49.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.802, + "entry_time": "2021-03-15T00:00:00", + "exit_price": 94.783, + "exit_reason": "signal", + "exit_time": "2021-03-17T00:00:00", + "pnl": -1.9000000000014552, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.661, + "entry_time": "2021-03-19T00:00:00", + "exit_price": 95.004, + "exit_reason": "signal", + "exit_time": "2021-03-22T00:00:00", + "pnl": 134.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.499, + "entry_time": "2021-03-25T00:00:00", + "exit_price": 93.976, + "exit_reason": "signal", + "exit_time": "2021-03-26T00:00:00", + "pnl": -152.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.019, + "entry_time": "2021-03-31T00:00:00", + "exit_price": 94.256, + "exit_reason": "signal", + "exit_time": "2021-04-01T00:00:00", + "pnl": 23.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.471, + "entry_time": "2021-04-06T00:00:00", + "exit_price": 93.724, + "exit_reason": "signal", + "exit_time": "2021-04-07T00:00:00", + "pnl": 25.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.199, + "entry_time": "2021-04-09T00:00:00", + "exit_price": 93.341, + "exit_reason": "signal", + "exit_time": "2021-04-12T00:00:00", + "pnl": 14.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.729, + "entry_time": "2021-04-15T00:00:00", + "exit_price": 93.256, + "exit_reason": "signal", + "exit_time": "2021-04-16T00:00:00", + "pnl": -47.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.926, + "entry_time": "2021-04-21T00:00:00", + "exit_price": 94.143, + "exit_reason": "signal", + "exit_time": "2021-04-22T00:00:00", + "pnl": 121.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.774, + "entry_time": "2021-04-26T00:00:00", + "exit_price": 93.493, + "exit_reason": "signal", + "exit_time": "2021-04-28T00:00:00", + "pnl": -28.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.685, + "entry_time": "2021-04-30T00:00:00", + "exit_price": 94.267, + "exit_reason": "signal", + "exit_time": "2021-05-03T00:00:00", + "pnl": 58.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.415, + "entry_time": "2021-05-06T00:00:00", + "exit_price": 93.364, + "exit_reason": "signal", + "exit_time": "2021-05-07T00:00:00", + "pnl": -5.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.742, + "entry_time": "2021-05-12T00:00:00", + "exit_price": 94.554, + "exit_reason": "signal", + "exit_time": "2021-05-13T00:00:00", + "pnl": 81.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.502, + "entry_time": "2021-05-17T00:00:00", + "exit_price": 94.556, + "exit_reason": "signal", + "exit_time": "2021-05-19T00:00:00", + "pnl": 105.40000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.081, + "entry_time": "2021-05-21T00:00:00", + "exit_price": 92.813, + "exit_reason": "signal", + "exit_time": "2021-05-24T00:00:00", + "pnl": -26.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.953, + "entry_time": "2021-05-27T00:00:00", + "exit_price": 93.147, + "exit_reason": "signal", + "exit_time": "2021-05-28T00:00:00", + "pnl": 19.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.945, + "entry_time": "2021-06-02T00:00:00", + "exit_price": 92.896, + "exit_reason": "signal", + "exit_time": "2021-06-03T00:00:00", + "pnl": -4.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.577, + "entry_time": "2021-06-07T00:00:00", + "exit_price": 91.284, + "exit_reason": "signal", + "exit_time": "2021-06-09T00:00:00", + "pnl": -129.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2021-06-11T00:00:00", + "exit_price": 92.333, + "exit_reason": "signal", + "exit_time": "2021-06-14T00:00:00", + "pnl": -79.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.95, + "entry_time": "2021-06-17T00:00:00", + "exit_price": 92.166, + "exit_reason": "signal", + "exit_time": "2021-06-18T00:00:00", + "pnl": 21.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.256, + "entry_time": "2021-06-23T00:00:00", + "exit_price": 92.456, + "exit_reason": "signal", + "exit_time": "2021-06-24T00:00:00", + "pnl": 20.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.731, + "entry_time": "2021-06-28T00:00:00", + "exit_price": 91.788, + "exit_reason": "signal", + "exit_time": "2021-06-30T00:00:00", + "pnl": 5.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.941, + "entry_time": "2021-07-02T00:00:00", + "exit_price": 90.653, + "exit_reason": "signal", + "exit_time": "2021-07-06T00:00:00", + "pnl": -28.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.824, + "entry_time": "2021-07-08T00:00:00", + "exit_price": 91.78, + "exit_reason": "signal", + "exit_time": "2021-07-09T00:00:00", + "pnl": -4.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.098, + "entry_time": "2021-07-14T00:00:00", + "exit_price": 91.642, + "exit_reason": "signal", + "exit_time": "2021-07-15T00:00:00", + "pnl": 54.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.333, + "entry_time": "2021-07-19T00:00:00", + "exit_price": 91.025, + "exit_reason": "signal", + "exit_time": "2021-07-21T00:00:00", + "pnl": -30.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.238, + "entry_time": "2021-07-23T00:00:00", + "exit_price": 91.959, + "exit_reason": "signal", + "exit_time": "2021-07-26T00:00:00", + "pnl": 72.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.122, + "entry_time": "2021-07-29T00:00:00", + "exit_price": 93.031, + "exit_reason": "signal", + "exit_time": "2021-07-30T00:00:00", + "pnl": 90.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.16, + "entry_time": "2021-08-04T00:00:00", + "exit_price": 91.643, + "exit_reason": "signal", + "exit_time": "2021-08-05T00:00:00", + "pnl": -51.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.188, + "entry_time": "2021-08-09T00:00:00", + "exit_price": 93.342, + "exit_reason": "signal", + "exit_time": "2021-08-11T00:00:00", + "pnl": 15.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.618, + "entry_time": "2021-08-13T00:00:00", + "exit_price": 94.259, + "exit_reason": "signal", + "exit_time": "2021-08-16T00:00:00", + "pnl": 64.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.98, + "entry_time": "2021-08-19T00:00:00", + "exit_price": 93.988, + "exit_reason": "signal", + "exit_time": "2021-08-20T00:00:00", + "pnl": 100.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2021-08-25T00:00:00", + "exit_price": 92.705, + "exit_reason": "signal", + "exit_time": "2021-08-26T00:00:00", + "pnl": 2.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.361, + "entry_time": "2021-08-30T00:00:00", + "exit_price": 93.802, + "exit_reason": "signal", + "exit_time": "2021-09-01T00:00:00", + "pnl": 144.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.154, + "entry_time": "2021-09-03T00:00:00", + "exit_price": 93.729, + "exit_reason": "signal", + "exit_time": "2021-09-07T00:00:00", + "pnl": 57.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.158, + "entry_time": "2021-09-09T00:00:00", + "exit_price": 93.741, + "exit_reason": "signal", + "exit_time": "2021-09-10T00:00:00", + "pnl": -41.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.019, + "entry_time": "2021-09-15T00:00:00", + "exit_price": 94.422, + "exit_reason": "signal", + "exit_time": "2021-09-16T00:00:00", + "pnl": -59.70000000000255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.354, + "entry_time": "2021-09-20T00:00:00", + "exit_price": 94.986, + "exit_reason": "signal", + "exit_time": "2021-09-22T00:00:00", + "pnl": 63.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.87, + "entry_time": "2021-09-24T00:00:00", + "exit_price": 94.849, + "exit_reason": "signal", + "exit_time": "2021-09-27T00:00:00", + "pnl": 97.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.309, + "entry_time": "2021-09-30T00:00:00", + "exit_price": 93.994, + "exit_reason": "signal", + "exit_time": "2021-10-01T00:00:00", + "pnl": -31.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.074, + "entry_time": "2021-10-06T00:00:00", + "exit_price": 94.048, + "exit_reason": "signal", + "exit_time": "2021-10-07T00:00:00", + "pnl": -2.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.849, + "entry_time": "2021-10-11T00:00:00", + "exit_price": 94.437, + "exit_reason": "signal", + "exit_time": "2021-10-13T00:00:00", + "pnl": 58.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2021-10-15T00:00:00", + "exit_price": 95.093, + "exit_reason": "signal", + "exit_time": "2021-10-18T00:00:00", + "pnl": 72.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.029, + "entry_time": "2021-10-21T00:00:00", + "exit_price": 94.805, + "exit_reason": "signal", + "exit_time": "2021-10-22T00:00:00", + "pnl": 77.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.249, + "entry_time": "2021-10-27T00:00:00", + "exit_price": 93.601, + "exit_reason": "signal", + "exit_time": "2021-10-28T00:00:00", + "pnl": -64.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.241, + "entry_time": "2021-11-01T00:00:00", + "exit_price": 94.429, + "exit_reason": "signal", + "exit_time": "2021-11-03T00:00:00", + "pnl": 118.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.416, + "entry_time": "2021-11-05T00:00:00", + "exit_price": 92.51, + "exit_reason": "signal", + "exit_time": "2021-11-08T00:00:00", + "pnl": -90.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.96, + "entry_time": "2021-11-11T00:00:00", + "exit_price": 93.531, + "exit_reason": "signal", + "exit_time": "2021-11-12T00:00:00", + "pnl": 57.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.427, + "entry_time": "2021-11-17T00:00:00", + "exit_price": 92.196, + "exit_reason": "signal", + "exit_time": "2021-11-18T00:00:00", + "pnl": -23.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.52, + "entry_time": "2021-11-22T00:00:00", + "exit_price": 93.982, + "exit_reason": "signal", + "exit_time": "2021-11-24T00:00:00", + "pnl": 146.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.82, + "entry_time": "2021-12-02T00:00:00", + "exit_price": 91.736, + "exit_reason": "signal", + "exit_time": "2021-12-03T00:00:00", + "pnl": -8.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.704, + "entry_time": "2021-12-08T00:00:00", + "exit_price": 92.183, + "exit_reason": "signal", + "exit_time": "2021-12-09T00:00:00", + "pnl": 47.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.131, + "entry_time": "2021-12-13T00:00:00", + "exit_price": 92.825, + "exit_reason": "signal", + "exit_time": "2021-12-15T00:00:00", + "pnl": 69.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.809, + "entry_time": "2021-12-17T00:00:00", + "exit_price": 93.226, + "exit_reason": "signal", + "exit_time": "2021-12-20T00:00:00", + "pnl": -58.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.067, + "entry_time": "2021-12-23T00:00:00", + "exit_price": 92.105, + "exit_reason": "signal", + "exit_time": "2021-12-27T00:00:00", + "pnl": -96.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.026, + "entry_time": "2021-12-29T00:00:00", + "exit_price": 93.011, + "exit_reason": "signal", + "exit_time": "2021-12-30T00:00:00", + "pnl": 98.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.067, + "entry_time": "2022-01-03T00:00:00", + "exit_price": 91.642, + "exit_reason": "signal", + "exit_time": "2022-01-05T00:00:00", + "pnl": -42.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.202, + "entry_time": "2022-01-07T00:00:00", + "exit_price": 91.813, + "exit_reason": "signal", + "exit_time": "2022-01-10T00:00:00", + "pnl": -38.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.255, + "entry_time": "2022-01-13T00:00:00", + "exit_price": 91.975, + "exit_reason": "signal", + "exit_time": "2022-01-14T00:00:00", + "pnl": -28.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.763, + "entry_time": "2022-01-19T00:00:00", + "exit_price": 91.432, + "exit_reason": "signal", + "exit_time": "2022-01-20T00:00:00", + "pnl": -33.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.966, + "entry_time": "2022-01-24T00:00:00", + "exit_price": 91.852, + "exit_reason": "signal", + "exit_time": "2022-01-26T00:00:00", + "pnl": -11.399999999997817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.814, + "entry_time": "2022-01-28T00:00:00", + "exit_price": 91.676, + "exit_reason": "signal", + "exit_time": "2022-01-31T00:00:00", + "pnl": 86.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.985, + "entry_time": "2022-02-03T00:00:00", + "exit_price": 91.188, + "exit_reason": "signal", + "exit_time": "2022-02-04T00:00:00", + "pnl": -79.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.97, + "entry_time": "2022-02-09T00:00:00", + "exit_price": 92.17, + "exit_reason": "signal", + "exit_time": "2022-02-10T00:00:00", + "pnl": 20.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.507, + "entry_time": "2022-02-14T00:00:00", + "exit_price": 91.156, + "exit_reason": "signal", + "exit_time": "2022-02-16T00:00:00", + "pnl": -35.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.661, + "entry_time": "2022-02-18T00:00:00", + "exit_price": 92.287, + "exit_reason": "signal", + "exit_time": "2022-02-22T00:00:00", + "pnl": 62.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.068, + "entry_time": "2022-02-24T00:00:00", + "exit_price": 91.351, + "exit_reason": "signal", + "exit_time": "2022-02-25T00:00:00", + "pnl": 28.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.094, + "entry_time": "2022-03-02T00:00:00", + "exit_price": 91.421, + "exit_reason": "signal", + "exit_time": "2022-03-03T00:00:00", + "pnl": -67.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2022-03-07T00:00:00", + "exit_price": 91.526, + "exit_reason": "signal", + "exit_time": "2022-03-09T00:00:00", + "pnl": -48.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.012, + "entry_time": "2022-03-11T00:00:00", + "exit_price": 90.821, + "exit_reason": "signal", + "exit_time": "2022-03-14T00:00:00", + "pnl": -19.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.925, + "entry_time": "2022-03-17T00:00:00", + "exit_price": 90.615, + "exit_reason": "signal", + "exit_time": "2022-03-18T00:00:00", + "pnl": -131.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.965, + "entry_time": "2022-03-23T00:00:00", + "exit_price": 90.7, + "exit_reason": "signal", + "exit_time": "2022-03-24T00:00:00", + "pnl": -26.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.683, + "entry_time": "2022-03-28T00:00:00", + "exit_price": 91.694, + "exit_reason": "signal", + "exit_time": "2022-03-30T00:00:00", + "pnl": 101.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.87, + "entry_time": "2022-04-01T00:00:00", + "exit_price": 90.055, + "exit_reason": "signal", + "exit_time": "2022-04-04T00:00:00", + "pnl": -81.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.631, + "entry_time": "2022-04-07T00:00:00", + "exit_price": 89.96, + "exit_reason": "signal", + "exit_time": "2022-04-08T00:00:00", + "pnl": -67.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.759, + "entry_time": "2022-04-13T00:00:00", + "exit_price": 90.978, + "exit_reason": "signal", + "exit_time": "2022-04-14T00:00:00", + "pnl": 121.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.009, + "entry_time": "2022-04-19T00:00:00", + "exit_price": 90.972, + "exit_reason": "signal", + "exit_time": "2022-04-20T00:00:00", + "pnl": 96.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.449, + "entry_time": "2022-04-22T00:00:00", + "exit_price": 89.939, + "exit_reason": "signal", + "exit_time": "2022-04-25T00:00:00", + "pnl": -51.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.137, + "entry_time": "2022-04-28T00:00:00", + "exit_price": 90.92, + "exit_reason": "signal", + "exit_time": "2022-04-29T00:00:00", + "pnl": 78.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.235, + "entry_time": "2022-05-04T00:00:00", + "exit_price": 92.161, + "exit_reason": "signal", + "exit_time": "2022-05-05T00:00:00", + "pnl": 92.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.242, + "entry_time": "2022-05-09T00:00:00", + "exit_price": 91.392, + "exit_reason": "signal", + "exit_time": "2022-05-11T00:00:00", + "pnl": 114.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.798, + "entry_time": "2022-05-13T00:00:00", + "exit_price": 91.741, + "exit_reason": "signal", + "exit_time": "2022-05-16T00:00:00", + "pnl": -5.699999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.129, + "entry_time": "2022-05-19T00:00:00", + "exit_price": 91.294, + "exit_reason": "signal", + "exit_time": "2022-05-20T00:00:00", + "pnl": 16.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.508, + "entry_time": "2022-05-25T00:00:00", + "exit_price": 90.206, + "exit_reason": "signal", + "exit_time": "2022-05-26T00:00:00", + "pnl": -30.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.881, + "entry_time": "2022-05-31T00:00:00", + "exit_price": 90.543, + "exit_reason": "signal", + "exit_time": "2022-06-01T00:00:00", + "pnl": 66.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.973, + "entry_time": "2022-06-03T00:00:00", + "exit_price": 90.741, + "exit_reason": "signal", + "exit_time": "2022-06-06T00:00:00", + "pnl": -23.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.848, + "entry_time": "2022-06-09T00:00:00", + "exit_price": 90.837, + "exit_reason": "signal", + "exit_time": "2022-06-10T00:00:00", + "pnl": -1.0999999999985448, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.825, + "entry_time": "2022-06-15T00:00:00", + "exit_price": 90.17, + "exit_reason": "signal", + "exit_time": "2022-06-16T00:00:00", + "pnl": -65.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.553, + "entry_time": "2022-06-21T00:00:00", + "exit_price": 90.601, + "exit_reason": "signal", + "exit_time": "2022-06-22T00:00:00", + "pnl": 4.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.687, + "entry_time": "2022-06-24T00:00:00", + "exit_price": 90.053, + "exit_reason": "signal", + "exit_time": "2022-06-27T00:00:00", + "pnl": -63.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.794, + "entry_time": "2022-06-30T00:00:00", + "exit_price": 92.411, + "exit_reason": "signal", + "exit_time": "2022-07-01T00:00:00", + "pnl": 161.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.303, + "entry_time": "2022-07-06T00:00:00", + "exit_price": 90.141, + "exit_reason": "signal", + "exit_time": "2022-07-07T00:00:00", + "pnl": -116.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.156, + "entry_time": "2022-07-11T00:00:00", + "exit_price": 90.998, + "exit_reason": "signal", + "exit_time": "2022-07-13T00:00:00", + "pnl": -15.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.512, + "entry_time": "2022-07-15T00:00:00", + "exit_price": 91.253, + "exit_reason": "signal", + "exit_time": "2022-07-18T00:00:00", + "pnl": 74.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.474, + "entry_time": "2022-07-21T00:00:00", + "exit_price": 89.988, + "exit_reason": "signal", + "exit_time": "2022-07-22T00:00:00", + "pnl": -148.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.051, + "entry_time": "2022-07-27T00:00:00", + "exit_price": 91.314, + "exit_reason": "signal", + "exit_time": "2022-07-28T00:00:00", + "pnl": 26.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.376, + "entry_time": "2022-08-01T00:00:00", + "exit_price": 91.542, + "exit_reason": "signal", + "exit_time": "2022-08-03T00:00:00", + "pnl": 16.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.898, + "entry_time": "2022-08-05T00:00:00", + "exit_price": 92.023, + "exit_reason": "signal", + "exit_time": "2022-08-08T00:00:00", + "pnl": 12.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.244, + "entry_time": "2022-08-11T00:00:00", + "exit_price": 92.691, + "exit_reason": "signal", + "exit_time": "2022-08-12T00:00:00", + "pnl": 44.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.181, + "entry_time": "2022-08-17T00:00:00", + "exit_price": 92.495, + "exit_reason": "signal", + "exit_time": "2022-08-18T00:00:00", + "pnl": -68.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.024, + "entry_time": "2022-08-22T00:00:00", + "exit_price": 93.281, + "exit_reason": "signal", + "exit_time": "2022-08-24T00:00:00", + "pnl": 25.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.724, + "entry_time": "2022-08-26T00:00:00", + "exit_price": 93.027, + "exit_reason": "signal", + "exit_time": "2022-08-29T00:00:00", + "pnl": -69.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.267, + "entry_time": "2022-09-01T00:00:00", + "exit_price": 93.319, + "exit_reason": "signal", + "exit_time": "2022-09-02T00:00:00", + "pnl": 5.200000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.866, + "entry_time": "2022-09-07T00:00:00", + "exit_price": 93.548, + "exit_reason": "signal", + "exit_time": "2022-09-08T00:00:00", + "pnl": 68.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.821, + "entry_time": "2022-09-12T00:00:00", + "exit_price": 94.111, + "exit_reason": "signal", + "exit_time": "2022-09-14T00:00:00", + "pnl": 29.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.782, + "entry_time": "2022-09-16T00:00:00", + "exit_price": 94.266, + "exit_reason": "signal", + "exit_time": "2022-09-19T00:00:00", + "pnl": -51.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.888, + "entry_time": "2022-09-22T00:00:00", + "exit_price": 94.905, + "exit_reason": "signal", + "exit_time": "2022-09-23T00:00:00", + "pnl": 1.6999999999989086, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.211, + "entry_time": "2022-09-28T00:00:00", + "exit_price": 93.622, + "exit_reason": "signal", + "exit_time": "2022-09-29T00:00:00", + "pnl": -58.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.289, + "entry_time": "2022-10-03T00:00:00", + "exit_price": 95.218, + "exit_reason": "signal", + "exit_time": "2022-10-05T00:00:00", + "pnl": -7.099999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.625, + "entry_time": "2022-10-07T00:00:00", + "exit_price": 93.711, + "exit_reason": "signal", + "exit_time": "2022-10-10T00:00:00", + "pnl": -91.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.22, + "entry_time": "2022-10-13T00:00:00", + "exit_price": 95.266, + "exit_reason": "signal", + "exit_time": "2022-10-14T00:00:00", + "pnl": 104.60000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.369, + "entry_time": "2022-10-19T00:00:00", + "exit_price": 94.388, + "exit_reason": "signal", + "exit_time": "2022-10-20T00:00:00", + "pnl": 101.90000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2022-10-24T00:00:00", + "exit_price": 94.253, + "exit_reason": "signal", + "exit_time": "2022-10-26T00:00:00", + "pnl": 21.899999999997817, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.929, + "entry_time": "2022-10-28T00:00:00", + "exit_price": 95.019, + "exit_reason": "signal", + "exit_time": "2022-10-31T00:00:00", + "pnl": 9.000000000001819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 96.458, + "entry_time": "2022-11-03T00:00:00", + "exit_price": 95.965, + "exit_reason": "signal", + "exit_time": "2022-11-04T00:00:00", + "pnl": -49.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.237, + "entry_time": "2022-11-09T00:00:00", + "exit_price": 94.586, + "exit_reason": "signal", + "exit_time": "2022-11-10T00:00:00", + "pnl": -65.09999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.712, + "entry_time": "2022-11-14T00:00:00", + "exit_price": 94.086, + "exit_reason": "signal", + "exit_time": "2022-11-16T00:00:00", + "pnl": 37.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.205, + "entry_time": "2022-11-18T00:00:00", + "exit_price": 94.623, + "exit_reason": "signal", + "exit_time": "2022-11-21T00:00:00", + "pnl": 41.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.54, + "entry_time": "2022-11-25T00:00:00", + "exit_price": 92.916, + "exit_reason": "signal", + "exit_time": "2022-12-01T00:00:00", + "pnl": -62.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.256, + "entry_time": "2022-12-05T00:00:00", + "exit_price": 93.359, + "exit_reason": "signal", + "exit_time": "2022-12-07T00:00:00", + "pnl": 10.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.218, + "entry_time": "2022-12-09T00:00:00", + "exit_price": 93.916, + "exit_reason": "signal", + "exit_time": "2022-12-12T00:00:00", + "pnl": 69.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.424, + "entry_time": "2022-12-15T00:00:00", + "exit_price": 92.996, + "exit_reason": "signal", + "exit_time": "2022-12-16T00:00:00", + "pnl": -42.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.738, + "entry_time": "2022-12-21T00:00:00", + "exit_price": 91.786, + "exit_reason": "signal", + "exit_time": "2022-12-22T00:00:00", + "pnl": 104.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.399, + "entry_time": "2022-12-27T00:00:00", + "exit_price": 92.116, + "exit_reason": "signal", + "exit_time": "2022-12-28T00:00:00", + "pnl": -28.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.771, + "entry_time": "2022-12-30T00:00:00", + "exit_price": 92.978, + "exit_reason": "signal", + "exit_time": "2023-01-03T00:00:00", + "pnl": 20.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.823, + "entry_time": "2023-01-05T00:00:00", + "exit_price": 92.889, + "exit_reason": "signal", + "exit_time": "2023-01-06T00:00:00", + "pnl": 6.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.776, + "entry_time": "2023-01-11T00:00:00", + "exit_price": 92.849, + "exit_reason": "signal", + "exit_time": "2023-01-12T00:00:00", + "pnl": 7.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.165, + "entry_time": "2023-01-17T00:00:00", + "exit_price": 93.645, + "exit_reason": "signal", + "exit_time": "2023-01-18T00:00:00", + "pnl": 48.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.349, + "entry_time": "2023-01-20T00:00:00", + "exit_price": 93.529, + "exit_reason": "signal", + "exit_time": "2023-01-23T00:00:00", + "pnl": 118.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.145, + "entry_time": "2023-01-26T00:00:00", + "exit_price": 93.092, + "exit_reason": "signal", + "exit_time": "2023-01-27T00:00:00", + "pnl": -105.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.034, + "entry_time": "2023-02-01T00:00:00", + "exit_price": 92.672, + "exit_reason": "signal", + "exit_time": "2023-02-02T00:00:00", + "pnl": -136.20000000000255, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.253, + "entry_time": "2023-02-06T00:00:00", + "exit_price": 93.168, + "exit_reason": "signal", + "exit_time": "2023-02-08T00:00:00", + "pnl": -8.499999999998181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.13, + "entry_time": "2023-02-10T00:00:00", + "exit_price": 94.092, + "exit_reason": "signal", + "exit_time": "2023-02-13T00:00:00", + "pnl": 96.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.536, + "entry_time": "2023-02-16T00:00:00", + "exit_price": 94.216, + "exit_reason": "signal", + "exit_time": "2023-02-17T00:00:00", + "pnl": -32.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.185, + "entry_time": "2023-02-22T00:00:00", + "exit_price": 93.989, + "exit_reason": "signal", + "exit_time": "2023-02-23T00:00:00", + "pnl": -19.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.454, + "entry_time": "2023-02-27T00:00:00", + "exit_price": 94.437, + "exit_reason": "signal", + "exit_time": "2023-03-01T00:00:00", + "pnl": -1.7000000000007276, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.958, + "entry_time": "2023-03-03T00:00:00", + "exit_price": 93.665, + "exit_reason": "signal", + "exit_time": "2023-03-06T00:00:00", + "pnl": -29.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.35, + "entry_time": "2023-03-09T00:00:00", + "exit_price": 93.062, + "exit_reason": "signal", + "exit_time": "2023-03-10T00:00:00", + "pnl": -28.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.884, + "entry_time": "2023-03-15T00:00:00", + "exit_price": 94.082, + "exit_reason": "signal", + "exit_time": "2023-03-16T00:00:00", + "pnl": 19.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.295, + "entry_time": "2023-03-20T00:00:00", + "exit_price": 92.05, + "exit_reason": "signal", + "exit_time": "2023-03-22T00:00:00", + "pnl": -24.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.845, + "entry_time": "2023-03-24T00:00:00", + "exit_price": 93.328, + "exit_reason": "signal", + "exit_time": "2023-03-27T00:00:00", + "pnl": 148.3000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.949, + "entry_time": "2023-03-30T00:00:00", + "exit_price": 93.548, + "exit_reason": "signal", + "exit_time": "2023-03-31T00:00:00", + "pnl": 59.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.731, + "entry_time": "2023-04-05T00:00:00", + "exit_price": 92.13, + "exit_reason": "signal", + "exit_time": "2023-04-06T00:00:00", + "pnl": -60.099999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.325, + "entry_time": "2023-04-11T00:00:00", + "exit_price": 92.404, + "exit_reason": "signal", + "exit_time": "2023-04-12T00:00:00", + "pnl": -92.10000000000036, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.56, + "entry_time": "2023-04-14T00:00:00", + "exit_price": 92.829, + "exit_reason": "signal", + "exit_time": "2023-04-17T00:00:00", + "pnl": 26.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-04-20T00:00:00", + "exit_price": 92.951, + "exit_reason": "signal", + "exit_time": "2023-04-21T00:00:00", + "pnl": 15.19999999999709, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.359, + "entry_time": "2023-04-26T00:00:00", + "exit_price": 92.905, + "exit_reason": "signal", + "exit_time": "2023-04-27T00:00:00", + "pnl": -45.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.681, + "entry_time": "2023-05-01T00:00:00", + "exit_price": 92.829, + "exit_reason": "signal", + "exit_time": "2023-05-03T00:00:00", + "pnl": 14.799999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.067, + "entry_time": "2023-05-05T00:00:00", + "exit_price": 93.195, + "exit_reason": "signal", + "exit_time": "2023-05-08T00:00:00", + "pnl": 12.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.877, + "entry_time": "2023-05-11T00:00:00", + "exit_price": 93.476, + "exit_reason": "signal", + "exit_time": "2023-05-12T00:00:00", + "pnl": 159.90000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.775, + "entry_time": "2023-05-17T00:00:00", + "exit_price": 93.218, + "exit_reason": "signal", + "exit_time": "2023-05-18T00:00:00", + "pnl": 44.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.88, + "entry_time": "2023-05-22T00:00:00", + "exit_price": 93.969, + "exit_reason": "signal", + "exit_time": "2023-05-24T00:00:00", + "pnl": 8.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.333, + "entry_time": "2023-05-26T00:00:00", + "exit_price": 94.059, + "exit_reason": "signal", + "exit_time": "2023-05-30T00:00:00", + "pnl": -27.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.762, + "entry_time": "2023-06-01T00:00:00", + "exit_price": 94.25, + "exit_reason": "signal", + "exit_time": "2023-06-02T00:00:00", + "pnl": 148.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.294, + "entry_time": "2023-06-07T00:00:00", + "exit_price": 94.603, + "exit_reason": "signal", + "exit_time": "2023-06-08T00:00:00", + "pnl": 30.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.427, + "entry_time": "2023-06-12T00:00:00", + "exit_price": 94.339, + "exit_reason": "signal", + "exit_time": "2023-06-14T00:00:00", + "pnl": -8.800000000001091, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.37, + "entry_time": "2023-06-16T00:00:00", + "exit_price": 94.163, + "exit_reason": "signal", + "exit_time": "2023-06-20T00:00:00", + "pnl": -20.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.953, + "entry_time": "2023-06-22T00:00:00", + "exit_price": 94.374, + "exit_reason": "signal", + "exit_time": "2023-06-23T00:00:00", + "pnl": -57.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.898, + "entry_time": "2023-06-28T00:00:00", + "exit_price": 94.566, + "exit_reason": "signal", + "exit_time": "2023-06-29T00:00:00", + "pnl": 66.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.277, + "entry_time": "2023-07-03T00:00:00", + "exit_price": 94.941, + "exit_reason": "signal", + "exit_time": "2023-07-10T00:00:00", + "pnl": 66.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.493, + "entry_time": "2023-07-13T00:00:00", + "exit_price": 94.347, + "exit_reason": "signal", + "exit_time": "2023-07-14T00:00:00", + "pnl": -14.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.237, + "entry_time": "2023-07-19T00:00:00", + "exit_price": 94.334, + "exit_reason": "signal", + "exit_time": "2023-07-20T00:00:00", + "pnl": 109.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2023-07-24T00:00:00", + "exit_price": 93.304, + "exit_reason": "signal", + "exit_time": "2023-07-26T00:00:00", + "pnl": -22.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.055, + "entry_time": "2023-07-28T00:00:00", + "exit_price": 93.971, + "exit_reason": "signal", + "exit_time": "2023-07-31T00:00:00", + "pnl": -8.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.498, + "entry_time": "2023-08-03T00:00:00", + "exit_price": 93.961, + "exit_reason": "signal", + "exit_time": "2023-08-04T00:00:00", + "pnl": 46.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.216, + "entry_time": "2023-08-09T00:00:00", + "exit_price": 93.228, + "exit_reason": "signal", + "exit_time": "2023-08-10T00:00:00", + "pnl": -98.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.656, + "entry_time": "2023-08-14T00:00:00", + "exit_price": 94.398, + "exit_reason": "signal", + "exit_time": "2023-08-16T00:00:00", + "pnl": 174.1999999999989, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.089, + "entry_time": "2023-08-18T00:00:00", + "exit_price": 93.399, + "exit_reason": "signal", + "exit_time": "2023-08-21T00:00:00", + "pnl": -69.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.799, + "entry_time": "2023-08-24T00:00:00", + "exit_price": 93.688, + "exit_reason": "signal", + "exit_time": "2023-08-25T00:00:00", + "pnl": 88.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.791, + "entry_time": "2023-08-30T00:00:00", + "exit_price": 92.573, + "exit_reason": "signal", + "exit_time": "2023-08-31T00:00:00", + "pnl": -121.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.041, + "entry_time": "2023-09-05T00:00:00", + "exit_price": 94.468, + "exit_reason": "signal", + "exit_time": "2023-09-06T00:00:00", + "pnl": 142.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.237, + "entry_time": "2023-09-08T00:00:00", + "exit_price": 94.095, + "exit_reason": "signal", + "exit_time": "2023-09-11T00:00:00", + "pnl": -14.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.791, + "entry_time": "2023-09-14T00:00:00", + "exit_price": 94.029, + "exit_reason": "signal", + "exit_time": "2023-09-15T00:00:00", + "pnl": -76.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.173, + "entry_time": "2023-09-20T00:00:00", + "exit_price": 93.583, + "exit_reason": "signal", + "exit_time": "2023-09-21T00:00:00", + "pnl": -59.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.115, + "entry_time": "2023-09-25T00:00:00", + "exit_price": 93.162, + "exit_reason": "signal", + "exit_time": "2023-09-27T00:00:00", + "pnl": -95.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.496, + "entry_time": "2023-09-29T00:00:00", + "exit_price": 92.842, + "exit_reason": "signal", + "exit_time": "2023-10-02T00:00:00", + "pnl": -65.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.019, + "entry_time": "2023-10-05T00:00:00", + "exit_price": 92.773, + "exit_reason": "signal", + "exit_time": "2023-10-06T00:00:00", + "pnl": -24.600000000002183, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.345, + "entry_time": "2023-10-11T00:00:00", + "exit_price": 92.322, + "exit_reason": "signal", + "exit_time": "2023-10-12T00:00:00", + "pnl": -2.2999999999992724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.994, + "entry_time": "2023-10-16T00:00:00", + "exit_price": 91.586, + "exit_reason": "signal", + "exit_time": "2023-10-18T00:00:00", + "pnl": -40.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.467, + "entry_time": "2023-10-20T00:00:00", + "exit_price": 92.361, + "exit_reason": "signal", + "exit_time": "2023-10-23T00:00:00", + "pnl": 89.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.379, + "entry_time": "2023-10-26T00:00:00", + "exit_price": 91.412, + "exit_reason": "signal", + "exit_time": "2023-10-27T00:00:00", + "pnl": -96.69999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.43, + "entry_time": "2023-11-01T00:00:00", + "exit_price": 91.133, + "exit_reason": "signal", + "exit_time": "2023-11-02T00:00:00", + "pnl": -29.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.967, + "entry_time": "2023-11-06T00:00:00", + "exit_price": 91.602, + "exit_reason": "signal", + "exit_time": "2023-11-08T00:00:00", + "pnl": 63.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.416, + "entry_time": "2023-11-10T00:00:00", + "exit_price": 92.325, + "exit_reason": "signal", + "exit_time": "2023-11-13T00:00:00", + "pnl": -9.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.945, + "entry_time": "2023-11-16T00:00:00", + "exit_price": 92.019, + "exit_reason": "signal", + "exit_time": "2023-11-17T00:00:00", + "pnl": -92.59999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.744, + "entry_time": "2023-11-22T00:00:00", + "exit_price": 93.688, + "exit_reason": "signal", + "exit_time": "2023-11-24T00:00:00", + "pnl": 94.40000000000146, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.139, + "entry_time": "2023-11-27T00:00:00", + "exit_price": 92.476, + "exit_reason": "signal", + "exit_time": "2023-11-29T00:00:00", + "pnl": -166.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.76, + "entry_time": "2023-12-01T00:00:00", + "exit_price": 93.448, + "exit_reason": "signal", + "exit_time": "2023-12-04T00:00:00", + "pnl": 68.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.583, + "entry_time": "2023-12-07T00:00:00", + "exit_price": 94.144, + "exit_reason": "signal", + "exit_time": "2023-12-08T00:00:00", + "pnl": 56.10000000000218, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.056, + "entry_time": "2023-12-13T00:00:00", + "exit_price": 93.356, + "exit_reason": "signal", + "exit_time": "2023-12-14T00:00:00", + "pnl": 129.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.194, + "entry_time": "2023-12-18T00:00:00", + "exit_price": 92.511, + "exit_reason": "signal", + "exit_time": "2023-12-20T00:00:00", + "pnl": 31.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.914, + "entry_time": "2023-12-22T00:00:00", + "exit_price": 92.894, + "exit_reason": "signal", + "exit_time": "2023-12-26T00:00:00", + "pnl": -101.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.128, + "entry_time": "2023-12-28T00:00:00", + "exit_price": 93.66, + "exit_reason": "signal", + "exit_time": "2023-12-29T00:00:00", + "pnl": 53.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.892, + "entry_time": "2024-01-03T00:00:00", + "exit_price": 94.589, + "exit_reason": "signal", + "exit_time": "2024-01-04T00:00:00", + "pnl": -30.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.077, + "entry_time": "2024-01-08T00:00:00", + "exit_price": 94.764, + "exit_reason": "signal", + "exit_time": "2024-01-10T00:00:00", + "pnl": -31.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.805, + "entry_time": "2024-01-12T00:00:00", + "exit_price": 94.409, + "exit_reason": "signal", + "exit_time": "2024-01-16T00:00:00", + "pnl": -39.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.092, + "entry_time": "2024-01-18T00:00:00", + "exit_price": 94.92, + "exit_reason": "signal", + "exit_time": "2024-01-19T00:00:00", + "pnl": -17.200000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.886, + "entry_time": "2024-01-24T00:00:00", + "exit_price": 95.417, + "exit_reason": "signal", + "exit_time": "2024-01-25T00:00:00", + "pnl": 53.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.117, + "entry_time": "2024-01-29T00:00:00", + "exit_price": 94.586, + "exit_reason": "signal", + "exit_time": "2024-01-31T00:00:00", + "pnl": 46.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 95.519, + "entry_time": "2024-02-02T00:00:00", + "exit_price": 95.646, + "exit_reason": "signal", + "exit_time": "2024-02-05T00:00:00", + "pnl": 12.699999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.974, + "entry_time": "2024-02-08T00:00:00", + "exit_price": 96.257, + "exit_reason": "signal", + "exit_time": "2024-02-09T00:00:00", + "pnl": 128.3000000000011, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.384, + "entry_time": "2024-02-14T00:00:00", + "exit_price": 94.768, + "exit_reason": "signal", + "exit_time": "2024-02-15T00:00:00", + "pnl": 38.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.926, + "entry_time": "2024-02-20T00:00:00", + "exit_price": 95.284, + "exit_reason": "signal", + "exit_time": "2024-02-21T00:00:00", + "pnl": 35.80000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.645, + "entry_time": "2024-02-23T00:00:00", + "exit_price": 94.632, + "exit_reason": "signal", + "exit_time": "2024-02-26T00:00:00", + "pnl": -1.2999999999992724, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.994, + "entry_time": "2024-02-29T00:00:00", + "exit_price": 93.516, + "exit_reason": "signal", + "exit_time": "2024-03-01T00:00:00", + "pnl": 52.20000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.208, + "entry_time": "2024-03-06T00:00:00", + "exit_price": 93.035, + "exit_reason": "signal", + "exit_time": "2024-03-07T00:00:00", + "pnl": -17.299999999999272, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.579, + "entry_time": "2024-03-11T00:00:00", + "exit_price": 93.424, + "exit_reason": "signal", + "exit_time": "2024-03-13T00:00:00", + "pnl": -15.499999999998181, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.322, + "entry_time": "2024-03-15T00:00:00", + "exit_price": 93.745, + "exit_reason": "signal", + "exit_time": "2024-03-18T00:00:00", + "pnl": 42.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.567, + "entry_time": "2024-03-21T00:00:00", + "exit_price": 90.994, + "exit_reason": "signal", + "exit_time": "2024-03-22T00:00:00", + "pnl": -157.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.365, + "entry_time": "2024-03-27T00:00:00", + "exit_price": 92.886, + "exit_reason": "signal", + "exit_time": "2024-03-28T00:00:00", + "pnl": 52.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.875, + "entry_time": "2024-04-02T00:00:00", + "exit_price": 92.605, + "exit_reason": "signal", + "exit_time": "2024-04-03T00:00:00", + "pnl": -27.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.203, + "entry_time": "2024-04-05T00:00:00", + "exit_price": 92.389, + "exit_reason": "signal", + "exit_time": "2024-04-08T00:00:00", + "pnl": 18.599999999998545, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.968, + "entry_time": "2024-04-11T00:00:00", + "exit_price": 91.888, + "exit_reason": "signal", + "exit_time": "2024-04-12T00:00:00", + "pnl": -8.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.872, + "entry_time": "2024-04-17T00:00:00", + "exit_price": 92.005, + "exit_reason": "signal", + "exit_time": "2024-04-18T00:00:00", + "pnl": -86.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.847, + "entry_time": "2024-04-22T00:00:00", + "exit_price": 91.521, + "exit_reason": "signal", + "exit_time": "2024-04-24T00:00:00", + "pnl": -132.59999999999854, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.615, + "entry_time": "2024-04-26T00:00:00", + "exit_price": 92.84, + "exit_reason": "signal", + "exit_time": "2024-04-29T00:00:00", + "pnl": 22.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.018, + "entry_time": "2024-05-02T00:00:00", + "exit_price": 93.195, + "exit_reason": "signal", + "exit_time": "2024-05-03T00:00:00", + "pnl": 117.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.761, + "entry_time": "2024-05-08T00:00:00", + "exit_price": 93.992, + "exit_reason": "signal", + "exit_time": "2024-05-09T00:00:00", + "pnl": 23.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.186, + "entry_time": "2024-05-13T00:00:00", + "exit_price": 93.292, + "exit_reason": "signal", + "exit_time": "2024-05-15T00:00:00", + "pnl": 10.600000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.053, + "entry_time": "2024-05-17T00:00:00", + "exit_price": 92.898, + "exit_reason": "signal", + "exit_time": "2024-05-20T00:00:00", + "pnl": -15.5, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.003, + "entry_time": "2024-05-23T00:00:00", + "exit_price": 93.803, + "exit_reason": "signal", + "exit_time": "2024-05-24T00:00:00", + "pnl": 80.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.531, + "entry_time": "2024-05-29T00:00:00", + "exit_price": 93.551, + "exit_reason": "signal", + "exit_time": "2024-05-30T00:00:00", + "pnl": 2.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.921, + "entry_time": "2024-06-03T00:00:00", + "exit_price": 93.378, + "exit_reason": "signal", + "exit_time": "2024-06-05T00:00:00", + "pnl": -54.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.738, + "entry_time": "2024-06-07T00:00:00", + "exit_price": 94.058, + "exit_reason": "signal", + "exit_time": "2024-06-10T00:00:00", + "pnl": 32.00000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.716, + "entry_time": "2024-06-13T00:00:00", + "exit_price": 92.354, + "exit_reason": "signal", + "exit_time": "2024-06-14T00:00:00", + "pnl": -36.19999999999891, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.204, + "entry_time": "2024-06-20T00:00:00", + "exit_price": 93.86, + "exit_reason": "signal", + "exit_time": "2024-06-26T00:00:00", + "pnl": -34.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.769, + "entry_time": "2024-06-28T00:00:00", + "exit_price": 94.267, + "exit_reason": "signal", + "exit_time": "2024-07-01T00:00:00", + "pnl": 149.79999999999745, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.501, + "entry_time": "2024-07-05T00:00:00", + "exit_price": 92.972, + "exit_reason": "signal", + "exit_time": "2024-07-11T00:00:00", + "pnl": -52.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.501, + "entry_time": "2024-07-15T00:00:00", + "exit_price": 92.553, + "exit_reason": "signal", + "exit_time": "2024-07-17T00:00:00", + "pnl": 5.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.928, + "entry_time": "2024-07-19T00:00:00", + "exit_price": 92.018, + "exit_reason": "signal", + "exit_time": "2024-07-22T00:00:00", + "pnl": 9.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.988, + "entry_time": "2024-07-25T00:00:00", + "exit_price": 92.135, + "exit_reason": "signal", + "exit_time": "2024-07-26T00:00:00", + "pnl": 14.700000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.856, + "entry_time": "2024-07-31T00:00:00", + "exit_price": 92.251, + "exit_reason": "signal", + "exit_time": "2024-08-01T00:00:00", + "pnl": 39.50000000000182, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.903, + "entry_time": "2024-08-05T00:00:00", + "exit_price": 91.614, + "exit_reason": "signal", + "exit_time": "2024-08-07T00:00:00", + "pnl": -28.900000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.266, + "entry_time": "2024-08-09T00:00:00", + "exit_price": 93.255, + "exit_reason": "signal", + "exit_time": "2024-08-12T00:00:00", + "pnl": 98.89999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.888, + "entry_time": "2024-08-15T00:00:00", + "exit_price": 92.534, + "exit_reason": "signal", + "exit_time": "2024-08-16T00:00:00", + "pnl": -35.399999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 93.352, + "entry_time": "2024-08-21T00:00:00", + "exit_price": 93.822, + "exit_reason": "signal", + "exit_time": "2024-08-22T00:00:00", + "pnl": 47.0, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.013, + "entry_time": "2024-08-26T00:00:00", + "exit_price": 93.143, + "exit_reason": "signal", + "exit_time": "2024-08-28T00:00:00", + "pnl": 112.99999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 94.316, + "entry_time": "2024-08-30T00:00:00", + "exit_price": 92.433, + "exit_reason": "signal", + "exit_time": "2024-09-03T00:00:00", + "pnl": -188.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.742, + "entry_time": "2024-09-05T00:00:00", + "exit_price": 93.047, + "exit_reason": "signal", + "exit_time": "2024-09-06T00:00:00", + "pnl": 30.49999999999818, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 92.668, + "entry_time": "2024-09-11T00:00:00", + "exit_price": 91.661, + "exit_reason": "signal", + "exit_time": "2024-09-12T00:00:00", + "pnl": -100.70000000000073, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.179, + "entry_time": "2024-09-16T00:00:00", + "exit_price": 91.58, + "exit_reason": "signal", + "exit_time": "2024-09-18T00:00:00", + "pnl": 40.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.285, + "entry_time": "2024-09-20T00:00:00", + "exit_price": 90.104, + "exit_reason": "signal", + "exit_time": "2024-09-23T00:00:00", + "pnl": -18.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.052, + "entry_time": "2024-09-26T00:00:00", + "exit_price": 91.204, + "exit_reason": "signal", + "exit_time": "2024-09-27T00:00:00", + "pnl": 15.199999999998909, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.551, + "entry_time": "2024-10-02T00:00:00", + "exit_price": 90.177, + "exit_reason": "signal", + "exit_time": "2024-10-03T00:00:00", + "pnl": -137.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.83, + "entry_time": "2024-10-07T00:00:00", + "exit_price": 91.072, + "exit_reason": "signal", + "exit_time": "2024-10-09T00:00:00", + "pnl": 24.200000000000728, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 91.139, + "entry_time": "2024-10-11T00:00:00", + "exit_price": 90.93, + "exit_reason": "signal", + "exit_time": "2024-10-14T00:00:00", + "pnl": -20.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 90.494, + "entry_time": "2024-10-17T00:00:00", + "exit_price": 89.863, + "exit_reason": "signal", + "exit_time": "2024-10-18T00:00:00", + "pnl": -63.100000000000364, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.811, + "entry_time": "2024-10-23T00:00:00", + "exit_price": 89.547, + "exit_reason": "signal", + "exit_time": "2024-10-24T00:00:00", + "pnl": -26.400000000001455, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.856, + "entry_time": "2024-10-28T00:00:00", + "exit_price": 89.886, + "exit_reason": "signal", + "exit_time": "2024-10-30T00:00:00", + "pnl": 3.000000000001819, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.52, + "entry_time": "2024-11-01T00:00:00", + "exit_price": 89.584, + "exit_reason": "signal", + "exit_time": "2024-11-04T00:00:00", + "pnl": 106.39999999999964, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.328, + "entry_time": "2024-11-07T00:00:00", + "exit_price": 89.065, + "exit_reason": "signal", + "exit_time": "2024-11-08T00:00:00", + "pnl": -26.30000000000109, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.21, + "entry_time": "2024-11-13T00:00:00", + "exit_price": 88.452, + "exit_reason": "signal", + "exit_time": "2024-11-14T00:00:00", + "pnl": -75.79999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 87.859, + "entry_time": "2024-11-18T00:00:00", + "exit_price": 88.672, + "exit_reason": "signal", + "exit_time": "2024-11-20T00:00:00", + "pnl": 81.29999999999927, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 89.369, + "entry_time": "2024-11-22T00:00:00", + "exit_price": 89.07, + "exit_reason": "signal", + "exit_time": "2024-11-25T00:00:00", + "pnl": -29.899999999999636, + "size": 100.0 + }, + { + "asset": "TEST", + "commission": 0.0, + "direction": "Long", + "entry_price": 88.844, + "entry_time": "2024-11-29T00:00:00", + "exit_price": 89.039, + "exit_reason": "signal", + "exit_time": "2024-12-05T00:00:00", + "pnl": 19.5, + "size": 100.0 + } + ] + }, + "provenance": { + "adapter": { + "module": "frameworks.zipline", + "path": "validation/frameworks/zipline.py" + }, + "capabilities": { + "framework": { + "cash_flows": "aggregate_only", + "closed_trades": "reconstructed", + "exit_reason": "unavailable", + "fills": "reconstructed", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "native_filled_only", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + }, + "ml4t": { + "cash_flows": "aggregate_only", + "closed_trades": "native", + "exit_reason": "native", + "fills": "native", + "intents": "input_only", + "open_trades": "unavailable", + "orders": "unavailable", + "positions": "unavailable", + "rejections": "unavailable", + "terminal": "native" + } + }, + "comparison_protocol": { + "commission": "explicit scenario model or NoCommission", + "execution": "custom next-session open-price slippage model", + "fills": "native transactions with fees reconstructed from the configured model", + "risk_rules": "none", + "trade_records": "adapter_reconstructed_from_native_transactions" + }, + "digests": { + "adapter": "6e650c04c9604c3cfa40e597e16fa2e792d7e61fe2ebec56b7f46b5e33dde581", + "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", + "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", + "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", + "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", + "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", + "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" + }, + "framework_target": { + "actual_version": "3.1.1", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "version": "3.1.1" + }, + "input_digest": "d8119bff0157cd31258a444fec247040af62a78f46aff8b484ad1b9ef8915516", + "ml4t": { + "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "record_counts": { + "bars": 1241, + "entry_signals": 412, + "exit_signals": 412, + "framework_closed_trades": 337, + "framework_fills": 674, + "framework_intents": 824, + "framework_orders": null, + "ml4t_closed_trades": 337, + "ml4t_fills": 674, + "ml4t_intents": 824, + "ml4t_orders": null + } + }, + "release_blocking": false, + "required": true, + "scenario_id": "17", + "scenario_name": "High Event Count", "status": "pass" } ], "release_gate_passed": true, - "schema_version": 1, + "schema_version": 3, "summary": { "adapter_failure": 0, "adapter_import_failure": 0, @@ -618,7 +294815,7 @@ "malformed_output": 0, "missing_scenario": 0, "ml4t_failure": 0, - "pass": 62, + "pass": 66, "skipped": 0, "subprocess_failure": 0, "timeout": 0, diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index 4047d376..b7660c69 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -323,14 +323,14 @@ part of the retained LEAN equivalence claim. -Scenario claims use the retained release-candidate matrix. "Exact" appears only when every required scenario has zero canonical gap. +Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| -| `vectorbt_strict` | [VectorBT Pro 2025.12.31](https://github.com/polakowo/vectorbt.pro) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 0.28.2](https://pypi.org/project/vectorbt/0.28.2/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | Large-scale claims are published only when a retained workload has zero canonical gap. diff --git a/validation/README.md b/validation/README.md index 6e0a4cb0..d41070be 100644 --- a/validation/README.md +++ b/validation/README.md @@ -21,14 +21,14 @@ environment cannot reproduce the current target set. -Scenario claims use the retained release-candidate matrix. "Exact" appears only when every required scenario has zero canonical gap. +Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| -| `vectorbt_strict` | [VectorBT Pro 2025.12.31](https://github.com/polakowo/vectorbt.pro) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 0.28.2](https://pypi.org/project/vectorbt/0.28.2/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 15/15 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | Large-scale claims are published only when a retained workload has zero canonical gap. diff --git a/validation/generate_parity_claims.py b/validation/generate_parity_claims.py index e06714aa..a697bd6d 100644 --- a/validation/generate_parity_claims.py +++ b/validation/generate_parity_claims.py @@ -94,8 +94,9 @@ def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> s START_MARKER, "", "", - 'Scenario claims use the retained release-candidate matrix. "Exact" appears only when ' - "every required scenario has zero canonical gap.", + 'Scenario claims use the retained release-candidate matrix. "Exact" means terminal ' + "values, ordered closed trades, and ordered fills match after 1e-8 quantization for " + "every retained surface the framework exposes.", "", "| Profile | Pinned framework | Required scenarios | Evidence |", "|---|---|---:|---|", From 90190c1a093d7100c0e31ddf07bb07c3a9a9af40 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 01:27:23 -0400 Subject: [PATCH 11/44] fix(validation): align controlled benchmark event surfaces --- .../test_cross_framework_selected.py | 1 + .../test_exact_validation_comparator.py | 57 ++++++++ validation/benchmark_suite.py | 136 ++++++++++++------ 3 files changed, 153 insertions(+), 41 deletions(-) diff --git a/tests/benchmark/test_cross_framework_selected.py b/tests/benchmark/test_cross_framework_selected.py index 852b8b03..7809b42d 100644 --- a/tests/benchmark/test_cross_framework_selected.py +++ b/tests/benchmark/test_cross_framework_selected.py @@ -68,6 +68,7 @@ def _run_framework_pair(framework: str, runner_name: str, artifact_dir: Path): framework_result, ml4t_result, initial_cash=config.initial_cash, + timestamp_domain="session_date", ) artifact_path = artifact_dir / f"{framework}-exact-comparison.json" suite.write_exact_comparison_artifact(artifact, artifact_path) diff --git a/tests/contracts/test_exact_validation_comparator.py b/tests/contracts/test_exact_validation_comparator.py index 898b532c..e23683b1 100644 --- a/tests/contracts/test_exact_validation_comparator.py +++ b/tests/contracts/test_exact_validation_comparator.py @@ -290,6 +290,63 @@ def test_fixed_point_zero_fill_and_trade_records_are_omitted() -> None: assert suite.canonical_trade_records(dust_trade) == [] +def test_daily_records_normalize_framework_session_timestamp_and_asset_wrapper() -> None: + suite = _load_benchmark_suite() + frame = pd.DataFrame( + [ + { + "dt": pd.Timestamp("2024-01-02 21:00:00", tz="UTC"), + "asset": "Equity(1 [AAPL])", + "amount": 10.0, + "price": 100.0, + "commission": 0.0, + } + ] + ) + + records = suite.canonical_fill_records(frame, timestamp_domain="session_date") + + assert records == [ + { + "timestamp": "2024-01-02", + "asset": "AAPL", + "side": "buy", + "quantity": 10.0, + "price": 100.0, + "commission": 0.0, + } + ] + + +def test_target_trace_excludes_unchanged_targets() -> None: + suite = _load_benchmark_suite() + index = pd.date_range("2024-01-02", periods=3, freq="D") + targets = pd.DataFrame({"AAPL": [10.0, 10.0, 0.0], "MSFT": [0.0, 5.0, 5.0]}, index=index) + + trace = suite.build_canonical_target_trace(targets) + + assert trace[["timestamp", "asset", "prev_target", "target"]].to_dict("records") == [ + { + "timestamp": index[0], + "asset": "AAPL", + "prev_target": 0.0, + "target": 10.0, + }, + { + "timestamp": index[1], + "asset": "MSFT", + "prev_target": 0.0, + "target": 5.0, + }, + { + "timestamp": index[2], + "asset": "AAPL", + "prev_target": 10.0, + "target": 0.0, + }, + ] + + def test_terminal_value_uses_exact_microdollar_representation() -> None: suite = _load_benchmark_suite() expected = _benchmark_result(suite, "Reference") diff --git a/validation/benchmark_suite.py b/validation/benchmark_suite.py index 44ef1bb1..2f5b1aa2 100644 --- a/validation/benchmark_suite.py +++ b/validation/benchmark_suite.py @@ -61,6 +61,9 @@ from ml4t.backtest._validation.backtrader_runner import ( # noqa: E402 run_backtrader_target_shares as shared_run_backtrader_target_shares, ) +from ml4t.backtest._validation.backtrader_runner import ( # noqa: E402 + transactions_to_trade_log as reconstruct_closed_trades, +) from ml4t.backtest._validation.lean_runner import ( # noqa: E402 build_sequential_ticker_map, check_lean_cli, @@ -226,6 +229,7 @@ class BenchmarkConfig: lean_security_leverage: float | None = None lean_force_zero_fee: bool | None = None lean_force_zero_slippage: bool | None = None + end_session: str = "2025-12-31" @property def data_points(self) -> int: @@ -447,7 +451,7 @@ def generate_benchmark_data(config: BenchmarkConfig, seed: int = 42) -> tuple: current += timedelta(days=1) dates = pd.DatetimeIndex(dates) else: - dates = _get_trailing_nyse_sessions(config.n_bars) + dates = _get_trailing_nyse_sessions(config.n_bars, end_date=config.end_session) if len(dates) < config.n_bars: raise ValueError( f"Requested {config.n_bars} bars, but only {len(dates)} NYSE sessions are available" @@ -706,9 +710,9 @@ def build_canonical_target_trace(target_shares: pd.DataFrame) -> pd.DataFrame: delta = target_shares - prev changed = delta != 0.0 - trace_targets = target_shares.where(changed).stack() - trace_prev = prev.where(changed).stack() - trace_delta = delta.where(changed).stack() + trace_targets = target_shares.where(changed).stack().dropna() + trace_prev = prev.where(changed).stack().dropna() + trace_delta = delta.where(changed).stack().dropna() if len(trace_targets) == 0: return pd.DataFrame( @@ -792,15 +796,29 @@ def to_dict(self) -> dict: } -def _timestamp_value(value: object) -> str | None: +def _timestamp_value(value: object, timestamp_domain: str = "timestamp") -> str | None: if value is None or pd.isna(value): return None timestamp = pd.Timestamp(value) if timestamp.tz is not None: timestamp = timestamp.tz_convert("UTC").tz_localize(None) + if timestamp_domain == "session_date": + return timestamp.date().isoformat() + if timestamp_domain != "timestamp": + raise ValueError(f"Unknown timestamp domain: {timestamp_domain}") return timestamp.isoformat() +def _asset_value(value: object) -> str: + symbol = getattr(value, "symbol", None) + if isinstance(symbol, str) and symbol: + return symbol + text = str(value) + if " [" in text and text.endswith("])"): + return text.rsplit(" [", 1)[1][:-2] + return text + + def _canonical_float(value: object, quantum: Decimal = CANONICAL_QUANTUM) -> float: canonical = float(Decimal(str(value)).quantize(quantum, rounding=ROUND_HALF_EVEN)) return 0.0 if canonical == 0.0 else canonical @@ -831,7 +849,11 @@ def _frame_with_index(frame: pd.DataFrame) -> pd.DataFrame: return work -def canonical_fill_records(frame: pd.DataFrame | None) -> list[dict[str, object]] | None: +def canonical_fill_records( + frame: pd.DataFrame | None, + *, + timestamp_domain: str = "timestamp", +) -> list[dict[str, object]] | None: """Normalize a framework fill log without applying numeric tolerances.""" if frame is None: return None @@ -846,9 +868,10 @@ def canonical_fill_records(frame: pd.DataFrame | None) -> list[dict[str, object] records.append( { "timestamp": _timestamp_value( - _row_value(row, ("timestamp", "dt", "date", "index", "filled_at")) + _row_value(row, ("timestamp", "dt", "date", "index", "filled_at")), + timestamp_domain, ), - "asset": str( + "asset": _asset_value( _row_value(row, ("asset", "symbol", "instrument_id", "sid"), "unknown") ), "side": _side_value(_row_value(row, ("side", "order_side"), ""), signed_quantity), @@ -859,10 +882,37 @@ def canonical_fill_records(frame: pd.DataFrame | None) -> list[dict[str, object] ), } ) - return records + return sorted( + records, + key=lambda record: ( + record["timestamp"] or "", + record["asset"], + record["side"], + record["quantity"], + record["price"], + ), + ) -def canonical_trade_records(frame: pd.DataFrame | None) -> list[dict[str, object]] | None: +def closed_trades_from_fills(frame: pd.DataFrame | None) -> pd.DataFrame | None: + """Reconstruct fill-backed closed round trips on a framework-neutral ledger.""" + records = canonical_fill_records(frame) + if not records: + return None + transactions = pd.DataFrame(records) + transactions["amount"] = transactions["quantity"].where( + transactions["side"] == "buy", -transactions["quantity"] + ) + transactions["symbol"] = transactions["asset"] + transactions = transactions.set_index("timestamp") + return reconstruct_closed_trades(transactions[["amount", "price", "symbol"]]) + + +def canonical_trade_records( + frame: pd.DataFrame | None, + *, + timestamp_domain: str = "timestamp", +) -> list[dict[str, object]] | None: """Normalize a framework round-trip trade log without applying numeric tolerances.""" if frame is None: return None @@ -880,10 +930,15 @@ def canonical_trade_records(frame: pd.DataFrame | None) -> list[dict[str, object records.append( { "entry_time": _timestamp_value( - _row_value(row, ("entry_time", "entry_date", "timestamp", "index")) + _row_value(row, ("entry_time", "entry_date", "timestamp", "index")), + timestamp_domain, + ), + "exit_time": _timestamp_value( + _row_value(row, ("exit_time", "exit_date")), timestamp_domain + ), + "asset": _asset_value( + _row_value(row, ("asset", "symbol", "instrument_id"), "unknown") ), - "exit_time": _timestamp_value(_row_value(row, ("exit_time", "exit_date"))), - "asset": str(_row_value(row, ("asset", "symbol", "instrument_id"), "unknown")), "side": side, "quantity": _canonical_float(abs(quantity)), "entry_price": _canonical_float(_row_value(row, ("entry_price",), 0.0)), @@ -981,6 +1036,7 @@ def compare_benchmark_results_exact( actual: BenchmarkResult, *, initial_cash: float, + timestamp_domain: str = "timestamp", ) -> dict[str, object]: """Compare every release-covered benchmark surface using exact equality.""" checks = [ @@ -991,13 +1047,13 @@ def compare_benchmark_results_exact( ), _surface_check( "fills", - canonical_fill_records(expected.fills_df), - canonical_fill_records(actual.fills_df), + canonical_fill_records(expected.fills_df, timestamp_domain=timestamp_domain), + canonical_fill_records(actual.fills_df, timestamp_domain=timestamp_domain), ), _surface_check( "trades", - canonical_trade_records(expected.trades_df), - canonical_trade_records(actual.trades_df), + canonical_trade_records(expected.trades_df, timestamp_domain=timestamp_domain), + canonical_trade_records(actual.trades_df, timestamp_domain=timestamp_domain), ), _scalar_check("trade_count", expected.num_trades, actual.num_trades), _scalar_check( @@ -1011,6 +1067,7 @@ def compare_benchmark_results_exact( "schema_version": 1, "canonical_record_quantum": str(CANONICAL_QUANTUM), "canonical_money_quantum": str(CANONICAL_MONEY_QUANTUM), + "timestamp_domain": timestamp_domain, "scenario": expected.scenario, "expected_framework": expected.framework, "actual_framework": actual.framework, @@ -1234,7 +1291,13 @@ def benchmark_ml4t( # Convert price data to Polars format using vectorized DataFrame ops. price_frames: list[pd.DataFrame] = [] for asset_name, df in price_data.items(): - asset_frame = df.reset_index() + source_frame = df.copy() + if profile_name in {"zipline_strict", "lean"}: + decimals = 3 if profile_name == "zipline_strict" else 4 + source_frame.loc[:, ["open", "high", "low", "close"]] = source_frame[ + ["open", "high", "low", "close"] + ].round(decimals) + asset_frame = source_frame.reset_index() index_col = asset_frame.columns[0] asset_frame = asset_frame.rename(columns={index_col: "timestamp"}) asset_frame["asset"] = asset_name @@ -1422,19 +1485,8 @@ def build_ml4t_config(no_costs: bool) -> BacktestConfig: fills_pl = results.to_fills_dataframe() fills_df = pd.DataFrame(fills_pl.to_dict(as_series=False)) trades_df = None - if profile_name == "lean": - if not fills_df.empty: - trades_df = fills_df.rename( - columns={ - "price": "fill_price", - "commission": "fee", - } - ) - if "quantity" in trades_df.columns: - trades_df["quantity"] = trades_df["quantity"].abs() - if "side" in trades_df.columns: - trades_df["side"] = trades_df["side"].astype(str).str.lower() - trades_df = trades_df.sort_values(["timestamp", "order_id"]).reset_index(drop=True) + if profile_name in {"backtrader_strict", "zipline_strict", "lean"}: + trades_df = closed_trades_from_fills(fills_df) elif results.get("trades"): trade_records = [] for t in results["trades"]: @@ -2170,6 +2222,13 @@ def benchmark_lean( first_date = pd.Timestamp(dates[0]).date() last_date = pd.Timestamp(dates[-1]).date() + following_sessions = _get_nyse_sessions( + pd.Timestamp(last_date) + pd.Timedelta(days=1), + pd.Timestamp(last_date) + pd.Timedelta(days=10), + ) + if len(following_sessions) == 0: + raise RuntimeError(f"Could not resolve the LEAN settlement session after {last_date}") + lean_end_date = pd.Timestamp(following_sessions[0]).date() main_code = f"""# region imports from AlgorithmImports import * # endregion @@ -2181,7 +2240,7 @@ def benchmark_lean( class Ml4tBenchmark(QCAlgorithm): def initialize(self): self.set_start_date({first_date.year}, {first_date.month}, {first_date.day}) - self.set_end_date({last_date.year}, {last_date.month}, {last_date.day}) + self.set_end_date({lean_end_date.year}, {lean_end_date.month}, {lean_end_date.day}) self.set_cash({float(config.initial_cash)}) {lean_account_stmt} self._targets = {{}} @@ -2393,14 +2452,9 @@ def on_order_event(self, order_event: OrderEvent): target_trace_df=target_trace, ) - # Report the decoded fill count as num_trades for an apples-to-apples - # cross-engine comparison. load_lean_artifacts prefers LEAN's - # tradeStatistics.totalNumberOfTrades, which counts closed round-trip - # trades, whereas every other engine in this suite reports individual - # fills via len(trades_df). Using fills here keeps the parity surface - # consistent (LEAN fills == ml4t fills on the canonical benchmark). - if trades_df is not None: - num_trades = int(len(trades_df)) + fills_df = trades_df + trades_df = closed_trades_from_fills(fills_df) + num_trades = 0 if trades_df is None else len(trades_df) return BenchmarkResult( framework="LEAN CLI", @@ -2409,7 +2463,7 @@ def on_order_event(self, order_event: OrderEvent): num_trades=num_trades, final_value=final_value, memory_mb=0.0, - fills_df=trades_df, + fills_df=fills_df, trades_df=trades_df, equity_df=equity_df, order_events_df=order_events_df, From da2bed90490417f5595ed828e097ebc31038fbab Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 01:32:41 -0400 Subject: [PATCH 12/44] feat(validation): add reproducible large-scale evidence runner --- tests/contracts/test_large_scale_evidence.py | 151 +++++ validation/large_scale_evidence.py | 612 +++++++++++++++++++ validation/release_checks.txt | 1 + 3 files changed, 764 insertions(+) create mode 100644 tests/contracts/test_large_scale_evidence.py create mode 100644 validation/large_scale_evidence.py diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py new file mode 100644 index 00000000..efd25827 --- /dev/null +++ b/tests/contracts/test_large_scale_evidence.py @@ -0,0 +1,151 @@ +"""Contracts for reconstructable, capability-qualified large-scale evidence.""" + +from __future__ import annotations + +import copy +import importlib.util +import json +import sys +from pathlib import Path + +import pandas as pd +import pytest + + +def _load_module(): + path = Path(__file__).parents[2] / "validation" / "large_scale_evidence.py" + spec = importlib.util.spec_from_file_location("ml4t_large_scale_evidence", path) + assert spec is not None + assert spec.loader is not None + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +def _small_workload(module): + return module.ScaleWorkload( + name="contract_scale", + seed=7, + bars=20, + assets=3, + top_n=1, + bottom_n=1, + end_session="2024-12-31", + ) + + +def _complete_report(module, monkeypatch: pytest.MonkeyPatch): + workload = _small_workload(module) + monkeypatch.setattr(module, "WORKLOAD", workload) + module._expected_input_digest.cache_clear() + config = workload.benchmark_config() + prices, signals, dates = module.suite.generate_benchmark_data(config, seed=workload.seed) + digest = module.input_digest(prices, signals, dates) + records = [] + manifest = module.load_framework_manifest() + surface_names = ("order_intents", "fills", "trades", "terminal_state") + scalar_names = ("trade_count", "total_pnl", "final_value") + for framework in module.FRAMEWORKS: + target = manifest.targets[framework] + checks = [ + { + "name": name, + "passed": True, + "expected_sha256": "a" * 64, + "actual_sha256": "a" * 64, + } + for name in surface_names + ] + checks.extend( + { + "name": name, + "passed": True, + "canonical_expected": 1.0, + "canonical_actual": 1.0, + } + for name in scalar_names + ) + records.append( + { + "framework": framework, + "target": {**target.evidence_metadata(), "actual_version": target.version}, + "python": {"version": "3.12.11", "implementation": "cpython"}, + "ml4t": {"commit": "a" * 40, "dirty": False}, + "source_digests": module._source_digests(), + "input": { + "raw_sha256": digest, + "effective_sha256": digest, + "conversion": "none", + }, + "capabilities": { + "intents": "canonical strategy trace", + "fills": "native", + "closed_trades": "native", + "terminal_state": "reconstructed", + "fill_order": "canonical", + }, + "comparison": {"passed": True, "checks": checks}, + } + ) + return module.build_report(records, workload) + + +def test_input_digest_is_independent_of_datetime_resolution() -> None: + module = _load_module() + workload = _small_workload(module) + config = workload.benchmark_config() + prices, signals, dates = module.suite.generate_benchmark_data(config, seed=workload.seed) + expected = module.input_digest(prices, signals, dates) + + converted_prices = {asset: frame.copy() for asset, frame in prices.items()} + for frame in converted_prices.values(): + frame.index = pd.DatetimeIndex(frame.index.to_numpy(dtype="datetime64[us]")) + converted_signals = signals.copy() + converted_signals["timestamp"] = converted_signals["timestamp"].to_numpy(dtype="datetime64[us]") + converted_dates = pd.DatetimeIndex(dates.to_numpy(dtype="datetime64[us]")) + + assert module.input_digest(converted_prices, converted_signals, converted_dates) == expected + + +def test_complete_report_reconstructs(monkeypatch: pytest.MonkeyPatch) -> None: + module = _load_module() + report = _complete_report(module, monkeypatch) + + assert module.report_failures(report, reconstruct_input=True) == [] + + +@pytest.mark.parametrize( + "mutation", + ["recipe", "input", "order_intents", "fills", "trades", "terminal_state", "final_value"], +) +def test_large_scale_mutations_fail_closed(mutation: str, monkeypatch: pytest.MonkeyPatch) -> None: + module = _load_module() + report = copy.deepcopy(_complete_report(module, monkeypatch)) + if mutation == "recipe": + report["workload"]["recipe"]["seed"] = 999 + elif mutation == "input": + report["frameworks"][0]["input"]["raw_sha256"] = "0" * 64 + else: + check = next( + check + for check in report["frameworks"][0]["comparison"]["checks"] + if check["name"] == mutation + ) + if mutation == "final_value": + check["canonical_actual"] = 2.0 + else: + check["actual_sha256"] = "0" * 64 + + assert module.report_failures(report, reconstruct_input=True) + + +def test_accepted_write_is_atomic(tmp_path: Path) -> None: + module = _load_module() + target = tmp_path / "accepted.json" + target.write_text("old\n", encoding="utf-8") + + module._write_json_atomic(target, {"value": 1}) + + assert json.loads(target.read_text(encoding="utf-8")) == {"value": 1} + assert list(tmp_path.iterdir()) == [target] diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py new file mode 100644 index 00000000..070e9b5f --- /dev/null +++ b/validation/large_scale_evidence.py @@ -0,0 +1,612 @@ +#!/usr/bin/env python3 +"""Generate and validate reproducible cross-framework large-scale evidence.""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib.metadata +import json +import os +import subprocess +import sys +import tempfile +from dataclasses import asdict, dataclass +from datetime import UTC, datetime +from decimal import ROUND_HALF_EVEN, Decimal +from functools import cache +from pathlib import Path +from typing import Any, cast + +import numpy as np +import pandas as pd + +VALIDATION_DIR = Path(__file__).parent +PROJECT_ROOT = VALIDATION_DIR.parent +sys.path.insert(0, str(PROJECT_ROOT / "src")) +sys.path.insert(0, str(VALIDATION_DIR)) + +import benchmark_suite as suite # noqa: E402 +from common.framework_registry import FrameworkTarget, load_framework_manifest # noqa: E402 + +SCHEMA_VERSION = 1 +MONEY_QUANTUM = Decimal("0.000001") +FRAMEWORKS = ("vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean") +ACCEPTED_PATH = VALIDATION_DIR / "LARGE_SCALE_RESULTS.json" +CANDIDATE_PATH = VALIDATION_DIR / "candidates" / "LARGE_SCALE_RESULTS.candidate.json" + + +@dataclass(frozen=True) +class ScaleWorkload: + """Content-addressed public workload recipe.""" + + name: str = "controlled_250_assets_5040_sessions" + seed: int = 42 + bars: int = 5_040 + assets: int = 250 + top_n: int = 25 + bottom_n: int = 25 + rebalance_frequency: int = 1 + end_session: str = "2025-12-31" + initial_cash: float = 1_000_000.0 + long_target_shares: float = 100.0 + short_target_shares: float = -100.0 + + @property + def data_points(self) -> int: + return self.bars * self.assets + + def benchmark_config(self) -> suite.BenchmarkConfig: + return suite.BenchmarkConfig( + name=self.name, + n_bars=self.bars, + n_assets=self.assets, + frequency="D", + top_n=self.top_n, + bottom_n=self.bottom_n, + rebalance_freq=self.rebalance_frequency, + initial_cash=self.initial_cash, + lean_force_zero_fee=True, + lean_force_zero_slippage=True, + end_session=self.end_session, + ) + + +WORKLOAD = ScaleWorkload() + + +def _sha256_bytes(value: bytes) -> str: + return hashlib.sha256(value).hexdigest() + + +def _json_digest(value: object) -> str: + return _sha256_bytes( + json.dumps(value, sort_keys=True, separators=(",", ":"), default=str).encode() + ) + + +def _update_array(digest: Any, label: str, values: np.ndarray) -> None: + array = np.ascontiguousarray(values) + digest.update(label.encode()) + digest.update(array.dtype.str.encode()) + digest.update(str(array.shape).encode()) + digest.update(array.tobytes()) + + +def _datetime_ns(index: pd.DatetimeIndex) -> np.ndarray: + normalized = index.tz_convert("UTC").tz_localize(None) if index.tz is not None else index + return normalized.to_numpy(dtype="datetime64[ns]").view(" str: + """Hash every generated input value independently of pandas internals.""" + digest = hashlib.sha256() + _update_array(digest, "dates", _datetime_ns(dates)) + for asset in sorted(price_data): + frame = price_data[asset] + digest.update(asset.encode()) + _update_array(digest, "index", _datetime_ns(pd.DatetimeIndex(frame.index))) + for column in ("open", "high", "low", "close", "volume"): + _update_array(digest, column, frame[column].to_numpy()) + signal_dates = pd.DatetimeIndex(pd.to_datetime(signals["timestamp"])) + _update_array(digest, "signal_dates", _datetime_ns(signal_dates)) + digest.update("\0".join(signals["asset"].astype(str)).encode()) + _update_array(digest, "scores", signals["score"].to_numpy()) + return digest.hexdigest() + + +def _effective_prices( + framework: str, price_data: dict[str, pd.DataFrame] +) -> dict[str, pd.DataFrame]: + decimals = 3 if framework == "zipline" else 4 if framework == "lean" else None + if decimals is None: + return price_data + effective: dict[str, pd.DataFrame] = {} + for asset, frame in price_data.items(): + converted = frame.copy() + converted.loc[:, ["open", "high", "low", "close"]] = converted[ + ["open", "high", "low", "close"] + ].round(decimals) + effective[asset] = converted + return effective + + +def _canonical_money(value: float) -> float: + return float(Decimal(str(value)).quantize(MONEY_QUANTUM, rounding=ROUND_HALF_EVEN)) + + +def _float_value(value: object) -> float: + if not isinstance(value, (int, float)) or isinstance(value, bool): + raise TypeError(f"Expected a numeric canonical value, got {type(value).__name__}") + return float(value) + + +def _terminal_state( + result: suite.BenchmarkResult, + effective_prices: dict[str, pd.DataFrame], + initial_cash: float, +) -> dict[str, object]: + fills = suite.canonical_fill_records(result.fills_df, timestamp_domain="session_date") or [] + positions: dict[str, float] = {} + cash = initial_cash + for fill in fills: + quantity = _float_value(fill["quantity"]) + signed = quantity if fill["side"] == "buy" else -quantity + asset = str(fill["asset"]) + positions[asset] = positions.get(asset, 0.0) + signed + cash -= signed * _float_value(fill["price"]) + cash -= _float_value(fill["commission"]) + positions = {asset: quantity for asset, quantity in sorted(positions.items()) if quantity != 0} + holdings = sum( + quantity * float(effective_prices[asset]["close"].iloc[-1]) + for asset, quantity in positions.items() + ) + state = { + "cash_from_fill_ledger": _canonical_money(cash), + "holdings_from_fill_ledger": _canonical_money(holdings), + "positions": {asset: _canonical_money(quantity) for asset, quantity in positions.items()}, + "reported_final_value": _canonical_money(result.final_value), + } + state["sha256"] = _json_digest(state) + return state + + +def _source_digests() -> dict[str, str]: + paths = { + "benchmark_suite": VALIDATION_DIR / "benchmark_suite.py", + "framework_manifest": VALIDATION_DIR / "framework_targets.toml", + "large_scale_runner": Path(__file__), + "profiles": PROJECT_ROOT / "src" / "ml4t" / "backtest" / "profiles.py", + } + return {name: _sha256_bytes(path.read_bytes()) for name, path in paths.items()} + + +def _git_identity() -> dict[str, object]: + commit = subprocess.run( + ["git", "rev-parse", "HEAD"], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.strip() + status = subprocess.run( + ["git", "status", "--porcelain", "--untracked-files=no"], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.strip() + return {"commit": commit, "dirty": bool(status)} + + +def _actual_target(target: FrameworkTarget) -> dict[str, object]: + if target.package == "lean": + actual_version = target.version + else: + actual_version = importlib.metadata.version(target.package) + return {**target.evidence_metadata(), "actual_version": actual_version} + + +def _framework_run( + framework: str, + config: suite.BenchmarkConfig, + price_data: dict[str, pd.DataFrame], + signals: pd.DataFrame, + dates: pd.DatetimeIndex, +) -> tuple[suite.BenchmarkResult, suite.BenchmarkResult]: + if framework == "vectorbt_pro": + external = suite.benchmark_vectorbt_pro(config, price_data, signals, dates) + ml4t = suite.benchmark_ml4t( + config, + price_data, + signals, + dates, + execution_mode="same_bar", + profile_override="vectorbt_strict", + ) + elif framework == "vectorbt_oss": + external = suite.benchmark_vectorbt_oss(config, price_data, signals, dates) + ml4t = suite.benchmark_ml4t( + config, + price_data, + signals, + dates, + execution_mode="same_bar", + profile_override="vectorbt", + ) + elif framework == "backtrader": + external = suite.benchmark_backtrader(config, price_data, signals, dates) + ml4t = suite.benchmark_ml4t( + config, + price_data, + signals, + dates, + execution_mode="next_bar", + profile_override="backtrader_strict", + ) + elif framework == "zipline": + external = suite.benchmark_zipline(config, price_data, signals, dates) + ml4t = suite.benchmark_ml4t( + config, + price_data, + signals, + dates, + execution_mode="next_bar", + profile_override="zipline_strict", + ) + elif framework == "lean": + external = suite.benchmark_lean(config, price_data, signals, dates) + ml4t = suite.benchmark_ml4t( + config, + price_data, + signals, + dates, + execution_mode="next_bar", + profile_override="lean", + ) + else: + raise ValueError(f"Unknown scale framework: {framework}") + return external, ml4t + + +def run_worker(framework: str, workload: ScaleWorkload = WORKLOAD) -> dict[str, Any]: + """Execute one external/ML4T scale pair and retain exact digests.""" + manifest = load_framework_manifest() + target = manifest.targets[framework] + config = workload.benchmark_config() + price_data, signals, dates = suite.generate_benchmark_data(config, seed=workload.seed) + raw_digest = input_digest(price_data, signals, dates) + effective_prices = _effective_prices(framework, price_data) + effective_digest = input_digest(effective_prices, signals, dates) + external, ml4t = _framework_run(framework, config, price_data, signals, dates) + comparison = cast( + dict[str, Any], + suite.compare_benchmark_results_exact( + external, + ml4t, + initial_cash=config.initial_cash, + timestamp_domain="session_date", + ), + ) + expected_terminal = _terminal_state(external, effective_prices, config.initial_cash) + actual_terminal = _terminal_state(ml4t, effective_prices, config.initial_cash) + terminal_check = { + "name": "terminal_state", + "passed": expected_terminal == actual_terminal, + "expected_sha256": expected_terminal["sha256"], + "actual_sha256": actual_terminal["sha256"], + "expected": expected_terminal, + "actual": actual_terminal, + } + comparison["checks"].append(terminal_check) + comparison["passed"] = bool(comparison["passed"] and terminal_check["passed"]) + return { + "framework": framework, + "target": _actual_target(target), + "python": { + "version": sys.version.split()[0], + "implementation": sys.implementation.name, + }, + "ml4t": _git_identity(), + "source_digests": _source_digests(), + "input": { + "raw_sha256": raw_digest, + "effective_sha256": effective_digest, + "conversion": ( + "OHLC rounded to 3 decimals before both engines" + if framework == "zipline" + else "OHLC rounded to 4 decimals before both engines" + if framework == "lean" + else "none" + ), + }, + "capabilities": { + "intents": "canonical strategy trace", + "fills": "native", + "closed_trades": ( + "native" if framework.startswith("vectorbt") else "reconstructed from native fills" + ), + "terminal_state": "reconstructed from native fills and final marks", + "fill_order": "session, asset, side, quantity, price", + }, + "runtime_seconds": { + "framework": external.runtime_sec, + "ml4t": ml4t.runtime_sec, + "not_a_performance_claim": True, + }, + "comparison": comparison, + } + + +def build_report( + records: list[dict[str, Any]], workload: ScaleWorkload = WORKLOAD +) -> dict[str, Any]: + """Build one candidate report from isolated worker records.""" + return { + "schema_version": SCHEMA_VERSION, + "generated_at": datetime.now(UTC).isoformat(), + "workload": { + "recipe": asdict(workload), + "recipe_sha256": _json_digest(asdict(workload)), + "data_points": workload.data_points, + "generator": "validation.benchmark_suite.generate_benchmark_data", + "redistributable": True, + }, + "frameworks": records, + "release_gate_passed": len(records) == len(FRAMEWORKS) + and all(record.get("comparison", {}).get("passed") is True for record in records), + } + + +@cache +def _expected_input_digest(workload: ScaleWorkload) -> str: + config = workload.benchmark_config() + prices, signals, dates = suite.generate_benchmark_data(config, seed=workload.seed) + return input_digest(prices, signals, dates) + + +def report_failures(report: dict[str, Any], *, reconstruct_input: bool = False) -> list[str]: + """Return every reason a large-scale candidate cannot be accepted.""" + failures: list[str] = [] + if report.get("schema_version") != SCHEMA_VERSION: + return [f"Unsupported large-scale schema: {report.get('schema_version')!r}"] + raw_workload_value = report.get("workload") + if not isinstance(raw_workload_value, dict): + raw_workload: dict[str, Any] = {} + else: + raw_workload = cast(dict[str, Any], raw_workload_value) + if raw_workload.get("recipe") != asdict(WORKLOAD): + failures.append("Large-scale workload recipe differs") + elif raw_workload.get("recipe_sha256") != _json_digest(asdict(WORKLOAD)): + failures.append("Large-scale workload recipe digest differs") + raw_records = report.get("frameworks") + if not isinstance(raw_records, list): + return failures + ["Large-scale framework records must be a list"] + records: dict[str, dict[str, Any]] = {} + for raw_record in raw_records: + if not isinstance(raw_record, dict): + continue + record = cast(dict[str, Any], raw_record) + framework_id = record.get("framework") + if isinstance(framework_id, str): + records[framework_id] = record + if set(records) != set(FRAMEWORKS): + failures.append("Large-scale framework coverage differs") + manifest = load_framework_manifest() + expected_sources = _source_digests() + reconstructed = _expected_input_digest(WORKLOAD) if reconstruct_input else None + raw_digests: set[str] = set() + for framework in FRAMEWORKS: + record = records.get(framework) + if not isinstance(record, dict): + continue + target = record.get("target") + expected_target = manifest.targets[framework].evidence_metadata() + if ( + not isinstance(target, dict) + or {key: value for key, value in target.items() if key != "actual_version"} + != expected_target + or target.get("actual_version") != expected_target["version"] + ): + failures.append(f"{framework} target identity differs") + if record.get("source_digests") != expected_sources: + failures.append(f"{framework} source digests differ") + ml4t = record.get("ml4t") + if not isinstance(ml4t, dict) or ml4t.get("dirty") is not False: + failures.append(f"{framework} was not produced from a clean ML4T tree") + elif not isinstance(ml4t.get("commit"), str) or len(str(ml4t["commit"])) != 40: + failures.append(f"{framework} ML4T commit identity is missing") + python = record.get("python") + if not isinstance(python, dict) or not all( + isinstance(python.get(key), str) for key in ("version", "implementation") + ): + failures.append(f"{framework} Python identity is missing") + input_record = record.get("input") + if not isinstance(input_record, dict) or not isinstance( + input_record.get("raw_sha256"), str + ): + failures.append(f"{framework} input evidence is missing") + else: + raw_digest = str(input_record["raw_sha256"]) + raw_digests.add(raw_digest) + if reconstructed is not None and raw_digest != reconstructed: + failures.append(f"{framework} input digest does not reconstruct") + effective_digest = input_record.get("effective_sha256") + if not isinstance(effective_digest, str) or len(effective_digest) != 64: + failures.append(f"{framework} effective-input digest is missing") + capabilities = record.get("capabilities") + if not isinstance(capabilities, dict) or set(capabilities) != { + "intents", + "fills", + "closed_trades", + "terminal_state", + "fill_order", + }: + failures.append(f"{framework} capability declaration is incomplete") + comparison = record.get("comparison") + if not isinstance(comparison, dict) or comparison.get("passed") is not True: + failures.append(f"{framework} exact comparison did not pass") + continue + checks = comparison.get("checks") + if not isinstance(checks, list): + failures.append(f"{framework} comparison checks are missing") + continue + names = {check.get("name") for check in checks if isinstance(check, dict)} + expected_names = { + "order_intents", + "fills", + "trades", + "trade_count", + "total_pnl", + "final_value", + "terminal_state", + } + if names != expected_names or any( + not isinstance(check, dict) or check.get("passed") is not True for check in checks + ): + failures.append(f"{framework} comparison surface is incomplete or failed") + continue + for check in checks: + assert isinstance(check, dict) + name = check["name"] + if name in {"order_intents", "fills", "trades", "terminal_state"}: + expected_hash = check.get("expected_sha256") + actual_hash = check.get("actual_sha256") + if ( + not isinstance(expected_hash, str) + or len(expected_hash) != 64 + or expected_hash != actual_hash + ): + failures.append(f"{framework} {name} digest comparison differs") + elif check.get("canonical_expected") != check.get("canonical_actual"): + failures.append(f"{framework} {name} canonical values differ") + if len(raw_digests) > 1: + failures.append("Large-scale framework inputs differ") + if report.get("release_gate_passed") is not True: + failures.append("Large-scale release gate did not pass") + return failures + + +def _resolve_python(framework: str) -> Path: + target = load_framework_manifest().targets[framework] + override = os.getenv(target.python_env_var or "") + if override: + return Path(override).expanduser().resolve() + if target.environment is None: + raise ValueError(f"{framework} has no environment") + return PROJECT_ROOT / target.environment / "bin" / "python" + + +def run_all() -> dict[str, Any]: + """Run every framework in its isolated environment and return a candidate report.""" + records: list[dict[str, Any]] = [] + for framework in FRAMEWORKS: + interpreter = _resolve_python(framework) + if not interpreter.is_file(): + raise RuntimeError(f"Missing {framework} interpreter: {interpreter}") + with tempfile.TemporaryDirectory(prefix=f"ml4t-scale-{framework}-") as directory: + output = Path(directory) / "record.json" + command = [ + str(interpreter), + str(Path(__file__).resolve()), + "--worker", + framework, + "--output", + str(output), + ] + print(f"Running {framework} large-scale pair...", flush=True) + environment = os.environ.copy() + paths = [ + str(PROJECT_ROOT / "src"), + str(VALIDATION_DIR), + ] + sibling_specs = PROJECT_ROOT.parent / "ml4t-specs" / "src" + if sibling_specs.is_dir(): + paths.append(str(sibling_specs)) + environment["PYTHONPATH"] = os.pathsep.join( + paths + ([environment["PYTHONPATH"]] if environment.get("PYTHONPATH") else []) + ) + completed = subprocess.run( + command, + cwd=PROJECT_ROOT, + env=environment, + capture_output=True, + text=True, + timeout=3_600, + check=False, + ) + if completed.returncode != 0 or not output.is_file(): + details = (completed.stderr or completed.stdout).strip() + raise RuntimeError(f"{framework} scale worker failed: {details[-20_000:]}") + record = json.loads(output.read_text(encoding="utf-8")) + if record.get("comparison", {}).get("passed") is not True: + raise RuntimeError( + f"{framework} large-scale comparison failed: " + + json.dumps(record.get("comparison"), indent=2)[-20_000:] + ) + records.append(record) + print(f"{framework}: PASS", flush=True) + return build_report(records) + + +def _write_json(path: Path, payload: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + +def _write_json_atomic(path: Path, payload: dict[str, Any]) -> None: + """Replace accepted evidence only after a complete temporary write.""" + path.parent.mkdir(parents=True, exist_ok=True) + serialized = json.dumps(payload, indent=2, sort_keys=True) + "\n" + with tempfile.NamedTemporaryFile( + mode="w", + encoding="utf-8", + dir=path.parent, + prefix=f".{path.name}.", + delete=False, + ) as handle: + temporary = Path(handle.name) + handle.write(serialized) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--worker", choices=FRAMEWORKS) + parser.add_argument("--output", type=Path) + parser.add_argument("--check", action="store_true") + parser.add_argument("--verify-input", action="store_true") + args = parser.parse_args() + if args.worker: + if args.output is None: + parser.error("--worker requires --output") + record = run_worker(args.worker) + _write_json(args.output, record) + return 0 if record["comparison"]["passed"] else 1 + if args.check: + report = json.loads(ACCEPTED_PATH.read_text(encoding="utf-8")) + failures = report_failures(report, reconstruct_input=args.verify_input) + for failure in failures: + print(f"- {failure}") + return 1 if failures else 0 + candidate = run_all() + _write_json(CANDIDATE_PATH, candidate) + failures = report_failures(candidate, reconstruct_input=True) + if failures: + print("Accepted evidence unchanged:") + for failure in failures: + print(f"- {failure}") + return 1 + _write_json_atomic(ACCEPTED_PATH, candidate) + print(f"Accepted evidence: {ACCEPTED_PATH}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 269e43f3..5a8686a3 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -18,6 +18,7 @@ validation/common/data_generators.py validation/common/framework_registry.py validation/common/ml4t_runner.py validation/common/provenance.py +validation/large_scale_evidence.py validation/common/types.py validation/native/vectorbt_behavior.py validation/native/backtrader_behavior.py From 488c05d84e74156aba71c4f7ffac28df3881fea9 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 01:33:05 -0400 Subject: [PATCH 13/44] fix(validation): make scale worker directly executable --- validation/large_scale_evidence.py | 1 + 1 file changed, 1 insertion(+) diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index 070e9b5f..3bb542b2 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -23,6 +23,7 @@ VALIDATION_DIR = Path(__file__).parent PROJECT_ROOT = VALIDATION_DIR.parent +sys.path.insert(0, str(PROJECT_ROOT)) sys.path.insert(0, str(PROJECT_ROOT / "src")) sys.path.insert(0, str(VALIDATION_DIR)) From 71019f0019c4e61525c6e8a7d98a17e4ac9246aa Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 01:45:24 -0400 Subject: [PATCH 14/44] fix(validation): restore VectorBT collateral semantics --- src/ml4t/backtest/profiles.py | 5 ++ tests/compatibility/snapshots/v0.1.json | 6 +-- tests/contracts/test_large_scale_evidence.py | 25 ++++++++++ tests/contracts/test_profile_parity_basics.py | 45 +++++++++++++++++- .../test_vectorbt_native_evidence.py | 1 + tests/test_config_wiring.py | 8 ++-- validation/METHODOLOGY.md | 5 +- validation/behavior_coverage.toml | 2 +- validation/large_scale_evidence.py | 2 +- .../native/evidence/vectorbt_oss-1.1.0.json | 45 +++++++++++++++++- .../evidence/vectorbt_pro-2026.6.27.json | 45 +++++++++++++++++- validation/native/vectorbt_behavior.py | 46 ++++++++++++++++++- 12 files changed, 220 insertions(+), 15 deletions(-) diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index 43f90256..f988b100 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -281,6 +281,11 @@ } VECTORBT_STRICT_PROFILE = deepcopy(VECTORBT_PROFILE) +VECTORBT_STRICT_PROFILE["account"]["short_cash_policy"] = "lock_notional" +VECTORBT_STRICT_PROFILE["orders"]["reject_on_insufficient_cash"] = True +VECTORBT_STRICT_PROFILE["orders"]["partial_fills_allowed"] = True +VECTORBT_STRICT_PROFILE["orders"]["fill_ordering"] = "fifo" +VECTORBT_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" BACKTRADER_STRICT_PROFILE = deepcopy(BACKTRADER_PROFILE) BACKTRADER_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index 36a603c4..ff1d72fc 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -1568,7 +1568,7 @@ "account": { "allow_leverage": false, "allow_short_selling": true, - "short_cash_policy": "credit" + "short_cash_policy": "lock_notional" }, "cash": { "buffer_pct": 0.0, @@ -1584,7 +1584,7 @@ }, "orders": { "entry_order_priority": "submission", - "fill_ordering": "exit_first", + "fill_ordering": "fifo", "immediate_fill": true, "late_asset_min_bars": 1, "late_asset_policy": "allow", @@ -1592,7 +1592,7 @@ "partial_fills_allowed": true, "rebalance_headroom_pct": 1.0, "rebalance_mode": "hybrid", - "reject_on_insufficient_cash": false + "reject_on_insufficient_cash": true }, "position_sizing": { "share_type": "fractional" diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py index efd25827..97d5ba81 100644 --- a/tests/contracts/test_large_scale_evidence.py +++ b/tests/contracts/test_large_scale_evidence.py @@ -108,6 +108,31 @@ def test_input_digest_is_independent_of_datetime_resolution() -> None: assert module.input_digest(converted_prices, converted_signals, converted_dates) == expected +@pytest.mark.parametrize("framework", ["vectorbt_pro", "vectorbt_oss"]) +def test_vectorbt_scale_pairs_use_the_collateral_aware_strict_profile( + framework: str, monkeypatch: pytest.MonkeyPatch +) -> None: + module = _load_module() + captured: dict[str, object] = {} + + monkeypatch.setattr( + module.suite, + f"benchmark_{framework}", + lambda *_args: "external", + ) + + def capture_ml4t(*args, **kwargs): + captured.update(kwargs) + return "ml4t" + + monkeypatch.setattr(module.suite, "benchmark_ml4t", capture_ml4t) + + result = module._framework_run(framework, object(), {}, pd.DataFrame(), pd.DatetimeIndex([])) + + assert result == ("external", "ml4t") + assert captured["profile_override"] == "vectorbt_strict" + + def test_complete_report_reconstructs(monkeypatch: pytest.MonkeyPatch) -> None: module = _load_module() report = _complete_report(module, monkeypatch) diff --git a/tests/contracts/test_profile_parity_basics.py b/tests/contracts/test_profile_parity_basics.py index 2a1b7ccb..df65c194 100644 --- a/tests/contracts/test_profile_parity_basics.py +++ b/tests/contracts/test_profile_parity_basics.py @@ -9,7 +9,7 @@ from ml4t.backtest.profiles import list_profiles from ml4t.backtest.risk.position.dynamic import TrailingStop from ml4t.backtest.strategy import Strategy -from ml4t.backtest.types import StopLevelBasis +from ml4t.backtest.types import OrderSide, StopLevelBasis def _prices() -> pl.DataFrame: @@ -47,6 +47,33 @@ def on_data(self, timestamp, data, context, broker) -> None: broker.submit_order("AAPL", 1.0) +class _ExerciseVectorbtShortCollateral(Strategy): + def on_data(self, timestamp, data, context, broker) -> None: + if timestamp.day == 1: + broker.submit_order("B", 5.0, side=OrderSide.SELL) + elif timestamp.day == 2: + broker.submit_order("A", 5.0) + broker.submit_order("B", 5.0, side=OrderSide.SELL) + + +def _flat_two_asset_prices() -> pl.DataFrame: + return pl.DataFrame( + [ + { + "timestamp": datetime(2024, 1, day), + "asset": asset, + "open": 100.0, + "high": 100.0, + "low": 100.0, + "close": 100.0, + "volume": 1_000_000.0, + } + for day in (1, 2, 3) + for asset in ("A", "B") + ] + ) + + def _prices_with_missing_middle() -> pl.DataFrame: return ( _prices() @@ -148,6 +175,22 @@ def test_vectorbt_profile_drops_signal_order_with_missing_close() -> None: assert result.rejected_orders[0].rejection_code == "price_unavailable" +def test_vectorbt_strict_locks_short_collateral_from_new_exposure() -> None: + config = BacktestConfig.from_preset("vectorbt_strict") + config.initial_cash = 1_000.0 + + result = run_backtest( + prices=_flat_two_asset_prices(), + strategy=_ExerciseVectorbtShortCollateral(), + config=config, + ) + + assert [(fill.asset, fill.quantity, fill.side.value) for fill in result.fills] == [ + ("B", 5.0, "sell"), + ("A", 5.0, "buy"), + ] + + def test_zipline_profile_defers_pending_order_across_stale_bar() -> None: result = run_backtest( prices=_prices_with_missing_middle(), diff --git a/tests/contracts/test_vectorbt_native_evidence.py b/tests/contracts/test_vectorbt_native_evidence.py index d9023d36..86b38958 100644 --- a/tests/contracts/test_vectorbt_native_evidence.py +++ b/tests/contracts/test_vectorbt_native_evidence.py @@ -13,6 +13,7 @@ EXPECTED_CHECKS = { "accumulation", "cash_sharing_and_call_sequence", + "cash_sharing_short_collateral", "defaults", "explicit_fill_price", "fees_and_slippage", diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index ea2fd126..af0bf9c2 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -403,12 +403,12 @@ def test_credit_proceeds_policy_allows_short_without_full_notional_cash(self): def test_vectorbt_strict_profile_preserves_native_cash_semantics(self): config = BacktestConfig.from_preset("vectorbt_strict") - assert config.short_cash_policy == ShortCashPolicy.CREDIT - assert config.fill_ordering == FillOrdering.EXIT_FIRST - assert config.reject_on_insufficient_cash is False + assert config.short_cash_policy == ShortCashPolicy.LOCK_NOTIONAL + assert config.fill_ordering == FillOrdering.FIFO + assert config.reject_on_insufficient_cash is True assert config.partial_fills_allowed is True assert config.entry_order_priority == EntryOrderPriority.SUBMISSION - assert get_profile_config("vectorbt_strict") == get_profile_config("vectorbt") + assert get_profile_config("vectorbt_strict") != get_profile_config("vectorbt") def test_zipline_strict_profile_uses_credit(self): config = BacktestConfig.from_preset("zipline_strict") diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index b7660c69..b959351d 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -307,8 +307,9 @@ percentage slippage overrides. ### Comparison profiles -`vectorbt_strict` now resolves to the same settings as `vectorbt`. Native evidence does not support -the prior locked-short-proceeds, rejection, or FIFO overrides. `backtrader` now uses the measured +`vectorbt_strict` uses locked short collateral, partial fills, and FIFO processing to match the +controlled `Portfolio.from_orders` protocol. The retained native check verifies that short-sale +cash is reported in the cash series but cannot fund new exposure. `backtrader` uses the measured framework defaults for costs, leverage, target headroom, missing bars, and late feeds. `backtrader_strict` adds submission-time cash checks to reproduce Backtrader's enabled `checksubmit` path. `zipline_strict` resolves to the same settings as `zipline`; both represent the diff --git a/validation/behavior_coverage.toml b/validation/behavior_coverage.toml index e94db7ab..36505f65 100644 --- a/validation/behavior_coverage.toml +++ b/validation/behavior_coverage.toml @@ -39,7 +39,7 @@ reason = "The scenario matrix submits fixed integer quantities and does not test [[framework.vectorbt]] name = "buying_power" fields = ["account.allow_leverage", "orders.reject_on_insufficient_cash", "orders.partial_fills_allowed"] -native_checks = ["insufficient_cash_partial_fill"] +native_checks = ["cash_sharing_short_collateral", "insufficient_cash_partial_fill"] scenarios = [] published = false reason = "No cross-engine scenario currently reaches an insufficient-cash boundary." diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index 3bb542b2..5f3cd3a3 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -237,7 +237,7 @@ def _framework_run( signals, dates, execution_mode="same_bar", - profile_override="vectorbt", + profile_override="vectorbt_strict", ) elif framework == "backtrader": external = suite.benchmark_backtrader(config, price_data, signals, dates) diff --git a/validation/native/evidence/vectorbt_oss-1.1.0.json b/validation/native/evidence/vectorbt_oss-1.1.0.json index de152999..5bbc0232 100644 --- a/validation/native/evidence/vectorbt_oss-1.1.0.json +++ b/validation/native/evidence/vectorbt_oss-1.1.0.json @@ -111,6 +111,49 @@ "passed": true, "source": "from_orders" }, + { + "actual": { + "cash": [ + 1500.0, + 1000.0, + 1000.0 + ], + "orders": [ + { + "column": "b", + "side": "Sell", + "size": 5.0 + }, + { + "column": "a", + "side": "Buy", + "size": 5.0 + } + ] + }, + "expected": { + "cash": [ + 1500.0, + 1000.0, + 1000.0 + ], + "orders": [ + { + "column": "b", + "side": "Sell", + "size": 5.0 + }, + { + "column": "a", + "side": "Buy", + "size": 5.0 + } + ] + }, + "id": "cash_sharing_short_collateral", + "passed": true, + "source": "from_orders" + }, { "actual": { "default_orders": 1, @@ -297,7 +340,7 @@ } ], "framework": "vectorbt_oss", - "oracle_sha256": "c15716833162f16d82b3efd3059f2b28a3e1c4b816a3bf721a82d97b95711b98", + "oracle_sha256": "47a21499702d7e47761b76c7f7104da8db1e124b27b43957716d175f7b32fd80", "package": "vectorbt", "passed": true, "schema_version": 1, diff --git a/validation/native/evidence/vectorbt_pro-2026.6.27.json b/validation/native/evidence/vectorbt_pro-2026.6.27.json index 2365fdb0..a71d00a8 100644 --- a/validation/native/evidence/vectorbt_pro-2026.6.27.json +++ b/validation/native/evidence/vectorbt_pro-2026.6.27.json @@ -111,6 +111,49 @@ "passed": true, "source": "from_orders" }, + { + "actual": { + "cash": [ + 1500.0, + 1000.0, + 1000.0 + ], + "orders": [ + { + "column": "b", + "side": "Sell", + "size": 5.0 + }, + { + "column": "a", + "side": "Buy", + "size": 5.0 + } + ] + }, + "expected": { + "cash": [ + 1500.0, + 1000.0, + 1000.0 + ], + "orders": [ + { + "column": "b", + "side": "Sell", + "size": 5.0 + }, + { + "column": "a", + "side": "Buy", + "size": 5.0 + } + ] + }, + "id": "cash_sharing_short_collateral", + "passed": true, + "source": "from_orders" + }, { "actual": { "default_orders": 1, @@ -297,7 +340,7 @@ } ], "framework": "vectorbt_pro", - "oracle_sha256": "c15716833162f16d82b3efd3059f2b28a3e1c4b816a3bf721a82d97b95711b98", + "oracle_sha256": "47a21499702d7e47761b76c7f7104da8db1e124b27b43957716d175f7b32fd80", "package": "vectorbtpro", "passed": true, "schema_version": 1, diff --git a/validation/native/vectorbt_behavior.py b/validation/native/vectorbt_behavior.py index b94c62b9..14295600 100644 --- a/validation/native/vectorbt_behavior.py +++ b/validation/native/vectorbt_behavior.py @@ -50,6 +50,18 @@ def _cash(portfolio: Any) -> list[float]: return np.asarray(value, dtype=float).tolist() +def _chronological_order_events(portfolio: Any) -> list[dict[str, Any]]: + orders = _orders(portfolio) + if not orders: + return [] + time_key = next(key for key in ("Fill Index", "Timestamp", "Index") if key in orders[0]) + ordered = sorted(orders, key=lambda order: (str(order[time_key]), str(order["Column"]))) + return [ + {"column": order["Column"], "side": order["Side"], "size": order["Size"]} + for order in ordered + ] + + def _source_location(package: Any, function: Any, target: dict[str, str]) -> dict: source_file = inspect.getsourcefile(function) if source_file is None: @@ -171,6 +183,19 @@ def _behavior_checks(framework: str, vbt: Any) -> list[tuple[str, Any, Any]]: group_by=True, call_seq="reversed", ) + collateral_kwargs = {"lock_cash": True} if framework == "vectorbt_oss" else {} + collateral_pf = vbt.Portfolio.from_orders( + pd.DataFrame(100.0, index=index, columns=pd.Index(["a", "b"])), + size=pd.DataFrame( + [[0.0, -5.0], [5.0, -10.0], [5.0, -10.0]], + index=index, + columns=pd.Index(["a", "b"]), + ), + size_type="targetamount", + init_cash=1_000, + cash_sharing=True, + **collateral_kwargs, + ) accumulate_default = vbt.Portfolio.from_signals( close, entries=_bool([1, 1, 0]), exits=False, size=1, init_cash=1_000 ) @@ -296,6 +321,20 @@ def _behavior_checks(framework: str, vbt: Any) -> list[tuple[str, Any, Any]]: }, {"default": ["a"], "reversed": ["b"]}, ), + ( + "cash_sharing_short_collateral", + { + "cash": _cash(collateral_pf), + "orders": _chronological_order_events(collateral_pf), + }, + { + "cash": [1_500.0, 1_000.0, 1_000.0], + "orders": [ + {"column": "b", "side": "Sell", "size": 5.0}, + {"column": "a", "side": "Buy", "size": 5.0}, + ], + }, + ), ( "accumulation", { @@ -398,7 +437,12 @@ def run(framework: str) -> dict[str, Any]: "expected": expected, "passed": _equal(actual, expected), "source": "from_orders" - if check_id in {"target_percent_sizing", "cash_sharing_and_call_sequence"} + if check_id + in { + "target_percent_sizing", + "cash_sharing_and_call_sequence", + "cash_sharing_short_collateral", + } else "from_signals", } ) From 9902d1cd7da5fc2ef3c5533148c96091898326d2 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 02:21:23 -0400 Subject: [PATCH 15/44] fix: match VectorBT partial-fill arithmetic --- src/ml4t/backtest/accounting/account.py | 1 + src/ml4t/backtest/core/fill_engine.py | 47 +++++++++++++- src/ml4t/backtest/core/shared.py | 11 +++- src/ml4t/backtest/execution/fill_executor.py | 39 ++++++------ tests/test_config_wiring.py | 64 ++++++++++++++++++++ 5 files changed, 142 insertions(+), 20 deletions(-) diff --git a/src/ml4t/backtest/accounting/account.py b/src/ml4t/backtest/accounting/account.py index 01f32e09..89782141 100644 --- a/src/ml4t/backtest/accounting/account.py +++ b/src/ml4t/backtest/accounting/account.py @@ -38,6 +38,7 @@ def __init__(self, initial_cash: float, policy: AccountPolicy): """ self.cash = initial_cash self._lock_notional_free_cash = initial_cash + self._lock_notional_short_basis: dict[str, float] = {} self.positions: dict[str, Position] = {} self.policy = policy diff --git a/src/ml4t/backtest/core/fill_engine.py b/src/ml4t/backtest/core/fill_engine.py index 7012d775..d3cb826a 100644 --- a/src/ml4t/backtest/core/fill_engine.py +++ b/src/ml4t/backtest/core/fill_engine.py @@ -6,8 +6,9 @@ from typing import TYPE_CHECKING from ..config import ExecutionPrice, ShareType +from ..models import calculate_commission from ..types import OrderSide, OrderType -from .shared import CASH_TOLERANCE +from .shared import CASH_TOLERANCE, add_with_zero_cancellation from .state import MarketState, OrderState if TYPE_CHECKING: @@ -62,6 +63,10 @@ def get_max_affordable_quantity(self, order, fill_price: float) -> float: if fill_price <= 0 or order.quantity <= 0: return 0.0 + direct_limit = self._get_lock_notional_zero_cost_limit(order, fill_price) + if direct_limit is not None: + return min(order.quantity, direct_limit) + if self.broker.share_type == ShareType.INTEGER: high_int = int(order.quantity) if high_int <= 0: @@ -97,6 +102,46 @@ def get_max_affordable_quantity(self, order, fill_price: float) -> float: cash_tolerance = 0.0 return max(0.0, low - cash_tolerance / fill_price) + def _get_lock_notional_zero_cost_limit(self, order, fill_price: float) -> float | None: + broker = self.broker + if ( + broker.share_type != ShareType.FRACTIONAL + or broker.short_cash_policy.value != "lock_notional" + or broker.account.policy.allow_leverage + or broker.cash_buffer_pct != 0.0 + or calculate_commission( + broker.commission_model, + order.asset, + order.quantity, + fill_price, + ) + != 0.0 + ): + return None + + free_cash = broker.account._lock_notional_free_cash + current_quantity = broker.account.get_position_quantity(order.asset) + multiplier = broker.get_multiplier(order.asset) + unit_cost = fill_price * multiplier + + if order.side is OrderSide.BUY and current_quantity < 0.0: + short_quantity = abs(current_quantity) + short_basis = broker.account._lock_notional_short_basis.get(order.asset, 0.0) + cover_budget = free_cash + short_basis + short_basis + max_cover = cover_budget / unit_cost + if max_cover < short_quantity: + return max_cover + released = short_basis + short_basis - short_quantity * unit_cost + free_after_cover = add_with_zero_cancellation(free_cash, released) + return short_quantity + max(0.0, free_after_cover / unit_cost) + + if order.side is OrderSide.SELL and current_quantity > 0.0: + sale_proceeds = current_quantity * unit_cost + free_after_close = add_with_zero_cancellation(free_cash, sale_proceeds) + return current_quantity + max(0.0, free_after_close / unit_cost) + + return max(0.0, free_cash / unit_cost) + def try_partial_fill(self, order, fill_price: float) -> bool: max_shares = self.get_max_affordable_quantity(order, fill_price) diff --git a/src/ml4t/backtest/core/shared.py b/src/ml4t/backtest/core/shared.py index 2a9b321e..81fd44a0 100644 --- a/src/ml4t/backtest/core/shared.py +++ b/src/ml4t/backtest/core/shared.py @@ -4,7 +4,7 @@ import re from dataclasses import dataclass -from math import fabs, isfinite, ulp +from math import copysign, fabs, isclose, isfinite, ulp from typing import TYPE_CHECKING from ..types import ExitReason, OrderSide @@ -19,6 +19,15 @@ QUANTITY_ZERO_ULPS: int = 16 +def add_with_zero_cancellation(left: float, right: float) -> float: + """Add values while collapsing tolerance-equivalent opposite amounts to zero.""" + if copysign(1.0, left) != copysign(1.0, right) and isclose( + abs(left), abs(right), rel_tol=1e-9, abs_tol=1e-12 + ): + return 0.0 + return left + right + + def quantity_zero_tolerance(*operands: float) -> float: """Return the larger of the absolute floor and 16 ULP at the operand scale. diff --git a/src/ml4t/backtest/execution/fill_executor.py b/src/ml4t/backtest/execution/fill_executor.py index 8f52d89f..f8d371fe 100644 --- a/src/ml4t/backtest/execution/fill_executor.py +++ b/src/ml4t/backtest/execution/fill_executor.py @@ -14,7 +14,7 @@ from typing import TYPE_CHECKING from ..config import InitialHwmSource, ShareType -from ..core.shared import quantity_zero_tolerance +from ..core.shared import add_with_zero_cancellation, quantity_zero_tolerance from ..core.state import ExecutionJournal, MarketState, OrderState, RiskState from ..models import calculate_commission, calculate_slippage from ..types import ( @@ -62,15 +62,6 @@ def _calculate_position_pnl( return (exit_price * signed_quantity - entry_price * signed_quantity) * multiplier -def _add_with_zero_cancellation(left: float, right: float) -> float: - """Add values while collapsing tolerance-equivalent opposite amounts to zero.""" - if math.copysign(1.0, left) != math.copysign(1.0, right) and math.isclose( - abs(left), abs(right), rel_tol=1e-9, abs_tol=1e-12 - ): - return 0.0 - return left + right - - @dataclass class FillContext: """Context for a single fill execution. @@ -314,7 +305,6 @@ def execute(self, order: Order, base_price: float) -> bool: old_position = self.account.positions.get(order.asset) old_quantity = old_position.quantity if old_position is not None else 0.0 - old_entry_price = old_position.entry_price if old_position is not None else 0.0 # Update position and get actual commission (may change for flips) actual_commission = self._update_position(ctx) @@ -323,7 +313,6 @@ def execute(self, order: Order, base_price: float) -> bool: self._update_lock_notional_free_cash( ctx, old_quantity=old_quantity, - old_entry_price=old_entry_price, commission=actual_commission, ) @@ -357,7 +346,6 @@ def _update_lock_notional_free_cash( ctx: FillContext, *, old_quantity: float, - old_entry_price: float, commission: float, ) -> None: broker = self.broker @@ -368,23 +356,38 @@ def _update_lock_notional_free_cash( remaining = ctx.signed_qty free_cash = self.account._lock_notional_free_cash multiplier = broker.get_multiplier(ctx.order.asset) + asset = ctx.order.asset + short_basis = self.account._lock_notional_short_basis.get(asset, 0.0) if old_quantity < 0.0 and remaining > 0.0: covered = min(remaining, abs(old_quantity)) - released_basis = covered * old_entry_price * multiplier + size_fraction = covered / abs(old_quantity) + released_basis = size_fraction * short_basis required_cash = covered * ctx.fill_price * multiplier - free_cash = _add_with_zero_cancellation(free_cash, 2.0 * released_basis - required_cash) + free_cash = add_with_zero_cancellation( + free_cash, + released_basis + released_basis - required_cash, + ) + new_quantity = old_quantity + covered + if new_quantity < 0.0: + new_fraction = abs(new_quantity) / abs(old_quantity) + self.account._lock_notional_short_basis[asset] = new_fraction * short_basis + else: + self.account._lock_notional_short_basis.pop(asset, None) remaining -= covered elif old_quantity > 0.0 and remaining < 0.0: closed = min(abs(remaining), old_quantity) - free_cash = _add_with_zero_cancellation(free_cash, closed * ctx.fill_price * multiplier) + free_cash = add_with_zero_cancellation(free_cash, closed * ctx.fill_price * multiplier) remaining += closed if remaining != 0.0: required_cash = abs(remaining) * ctx.fill_price * multiplier - free_cash = _add_with_zero_cancellation(free_cash, -required_cash) + free_cash = add_with_zero_cancellation(free_cash, -required_cash) + if remaining < 0.0: + current_basis = self.account._lock_notional_short_basis.get(asset, 0.0) + self.account._lock_notional_short_basis[asset] = current_basis + required_cash - self.account._lock_notional_free_cash = _add_with_zero_cancellation(free_cash, -commission) + self.account._lock_notional_free_cash = add_with_zero_cancellation(free_cash, -commission) @staticmethod def _validate_execution_price(value: float, *, source: str) -> None: diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index af0bf9c2..874711b4 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -503,6 +503,70 @@ def test_lock_notional_long_to_short_reversal_reuses_long_sale_proceeds(self): assert position is not None assert position.quantity == -10.0 + def test_lock_notional_partial_cover_releases_proportional_aggregate_basis(self): + initial_cash = 100_000.0 + first_qty = 13.436424411240122 + second_qty = 84.74337369372327 + first_price = 152.7549237953228 + second_price = 51.01380514788434 + covered = 48.64171682480172 + cover_price = 73.25 + broker = _make_broker( + initial_cash=initial_cash, + allow_short_selling=True, + allow_leverage=False, + short_cash_policy=ShortCashPolicy.LOCK_NOTIONAL, + share_type=ShareType.FRACTIONAL, + reject_on_insufficient_cash=True, + partial_fills_allowed=True, + ) + + _set_prices(broker, {"A": first_price}) + broker.submit_order("A", first_qty, OrderSide.SELL) + broker._process_orders() + _set_prices(broker, {"A": second_price}, ts=datetime(2024, 1, 2)) + broker.submit_order("A", second_qty, OrderSide.SELL) + broker._process_orders() + + aggregate_basis = first_qty * first_price + second_qty * second_price + total_qty = first_qty + second_qty + expected_before_cover = initial_cash - first_qty * first_price - second_qty * second_price + assert broker.account._lock_notional_short_basis["A"] == aggregate_basis + assert broker.account._lock_notional_free_cash == expected_before_cover + + _set_prices(broker, {"A": cover_price}, ts=datetime(2024, 1, 3)) + broker.submit_order("A", covered, OrderSide.BUY) + broker._process_orders() + + released_basis = (covered / total_qty) * aggregate_basis + expected_free_cash = expected_before_cover + ( + released_basis + released_basis - covered * cover_price + ) + remaining_fraction = (total_qty - covered) / total_qty + assert broker.account._lock_notional_free_cash == expected_free_cash + assert broker.account._lock_notional_short_basis["A"] == ( + remaining_fraction * aggregate_basis + ) + + def test_lock_notional_partial_fill_uses_direct_native_cash_quotient(self): + initial_cash = 20_697.596345718113 + price = 680.4559000307344 + broker = _make_broker( + initial_cash=initial_cash, + allow_short_selling=True, + allow_leverage=False, + short_cash_policy=ShortCashPolicy.LOCK_NOTIONAL, + share_type=ShareType.FRACTIONAL, + reject_on_insufficient_cash=True, + partial_fills_allowed=True, + ) + _set_prices(broker, {"A": price}) + + broker.submit_order("A", 100.0, OrderSide.SELL) + broker._process_orders() + + assert broker.fills[0].quantity == initial_cash / price + # --------------------------------------------------------------------------- # partial_fills_allowed From cecf73c3168c83afa738c1d16411a8717cbc3792 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 02:37:39 -0400 Subject: [PATCH 16/44] fix: preserve VectorBT reversal leg quantities --- src/ml4t/backtest/execution/fill_executor.py | 40 ++++++++++++++++++++ tests/test_config_wiring.py | 28 ++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/ml4t/backtest/execution/fill_executor.py b/src/ml4t/backtest/execution/fill_executor.py index f8d371fe..63f959c7 100644 --- a/src/ml4t/backtest/execution/fill_executor.py +++ b/src/ml4t/backtest/execution/fill_executor.py @@ -380,6 +380,14 @@ def _update_lock_notional_free_cash( free_cash = add_with_zero_cancellation(free_cash, closed * ctx.fill_price * multiplier) remaining += closed + new_position = self.account.positions.get(asset) + if ( + new_position is not None + and old_quantity * new_position.quantity < 0.0 + and remaining != 0.0 + ): + remaining = new_position.quantity + if remaining != 0.0: required_cash = abs(remaining) * ctx.fill_price * multiplier free_cash = add_with_zero_cancellation(free_cash, -required_cash) @@ -433,11 +441,43 @@ def _update_position(self, ctx: FillContext) -> float: self._close_position(ctx, pos, old_qty) return ctx.commission elif _is_position_flip(old_qty, new_qty): + new_qty = self._get_lock_notional_flip_quantity(ctx, old_qty, new_qty) return self._flip_position(ctx, pos, old_qty, new_qty) else: self._scale_position(ctx, pos, old_qty, new_qty) return ctx.commission + def _get_lock_notional_flip_quantity( + self, + ctx: FillContext, + old_quantity: float, + fallback: float, + ) -> float: + broker = self.broker + if ( + broker.share_type != ShareType.FRACTIONAL + or broker.short_cash_policy.value != "lock_notional" + or broker.account.policy.allow_leverage + or broker.cash_buffer_pct != 0.0 + or ctx.commission != 0.0 + ): + return fallback + + unit_cost = ctx.fill_price * broker.get_multiplier(ctx.order.asset) + requested_open = abs(ctx.signed_qty) - abs(old_quantity) + free_cash = self.account._lock_notional_free_cash + if old_quantity < 0.0: + short_basis = self.account._lock_notional_short_basis.get(ctx.order.asset, 0.0) + released = short_basis + short_basis - abs(old_quantity) * unit_cost + free_after_close = add_with_zero_cancellation(free_cash, released) + else: + free_after_close = add_with_zero_cancellation( + free_cash, + abs(old_quantity) * unit_cost, + ) + open_quantity = min(requested_open, max(0.0, free_after_close / unit_cost)) + return math.copysign(open_quantity, ctx.signed_qty) + def _get_initial_hwm( self, asset: str, fill_price: float, signal_price: float | None = None ) -> float: diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index 874711b4..eb73471a 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -567,6 +567,34 @@ def test_lock_notional_partial_fill_uses_direct_native_cash_quotient(self): assert broker.fills[0].quantity == initial_cash / price + def test_lock_notional_partial_reversal_retains_native_open_leg_quantity(self): + initial_cash = 10_000.0 + short_price = 100.0 + reversal_price = 73.123456789 + broker = _make_broker( + initial_cash=initial_cash, + allow_short_selling=True, + allow_leverage=False, + short_cash_policy=ShortCashPolicy.LOCK_NOTIONAL, + share_type=ShareType.FRACTIONAL, + reject_on_insufficient_cash=True, + partial_fills_allowed=True, + ) + _set_prices(broker, {"A": short_price}) + broker.submit_order("A", 100.0, OrderSide.SELL) + broker._process_orders() + + _set_prices(broker, {"A": reversal_price}, ts=datetime(2024, 1, 2)) + broker.submit_order("A", 1_000.0, OrderSide.BUY) + broker._process_orders() + + free_after_cover = initial_cash * 2.0 - 100.0 * reversal_price + expected_open_quantity = free_after_cover / reversal_price + position = broker.get_position("A") + assert position is not None + assert position.quantity == expected_open_quantity + assert position.quantity != broker.fills[-1].quantity - 100.0 + # --------------------------------------------------------------------------- # partial_fills_allowed From e2b7c27790d0461cfe0871727cdfbff005dec4c9 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 02:47:07 -0400 Subject: [PATCH 17/44] fix: retain partial reversal open quantity --- src/ml4t/backtest/execution/fill_executor.py | 6 +++++- tests/test_config_wiring.py | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/ml4t/backtest/execution/fill_executor.py b/src/ml4t/backtest/execution/fill_executor.py index 63f959c7..56287bb9 100644 --- a/src/ml4t/backtest/execution/fill_executor.py +++ b/src/ml4t/backtest/execution/fill_executor.py @@ -464,7 +464,11 @@ def _get_lock_notional_flip_quantity( return fallback unit_cost = ctx.fill_price * broker.get_multiplier(ctx.order.asset) - requested_open = abs(ctx.signed_qty) - abs(old_quantity) + if ctx.fill_quantity == ctx.order.quantity: + requested_quantity = ctx.order.requested_quantity or ctx.order.quantity + requested_open = abs(requested_quantity) - abs(old_quantity) + else: + requested_open = abs(ctx.signed_qty) - abs(old_quantity) free_cash = self.account._lock_notional_free_cash if old_quantity < 0.0: short_basis = self.account._lock_notional_short_basis.get(ctx.order.asset, 0.0) diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index eb73471a..53e5a908 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -568,9 +568,9 @@ def test_lock_notional_partial_fill_uses_direct_native_cash_quotient(self): assert broker.fills[0].quantity == initial_cash / price def test_lock_notional_partial_reversal_retains_native_open_leg_quantity(self): - initial_cash = 10_000.0 - short_price = 100.0 - reversal_price = 73.123456789 + initial_cash = 8_837.873808549472 + short_price = 88.37873808549472 + reversal_price = 90.0615227583623 broker = _make_broker( initial_cash=initial_cash, allow_short_selling=True, @@ -585,7 +585,7 @@ def test_lock_notional_partial_reversal_retains_native_open_leg_quantity(self): broker._process_orders() _set_prices(broker, {"A": reversal_price}, ts=datetime(2024, 1, 2)) - broker.submit_order("A", 1_000.0, OrderSide.BUY) + broker.submit_order("A", 200.0, OrderSide.BUY) broker._process_orders() free_after_cover = initial_cash * 2.0 - 100.0 * reversal_price From 1e4c4b9f827a74ee3377048cd23049a8ff7c9ac1 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 02:54:34 -0400 Subject: [PATCH 18/44] fix(validation): derive scale trades from canonical fills --- tests/contracts/test_large_scale_evidence.py | 35 ++++++++++++++++++++ validation/METHODOLOGY.md | 5 +++ validation/large_scale_evidence.py | 15 +++++++-- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py index 97d5ba81..8eb1b072 100644 --- a/tests/contracts/test_large_scale_evidence.py +++ b/tests/contracts/test_large_scale_evidence.py @@ -133,6 +133,41 @@ def capture_ml4t(*args, **kwargs): assert captured["profile_override"] == "vectorbt_strict" +def test_scale_trade_surface_is_reconstructed_from_canonical_fills() -> None: + module = _load_module() + fills = pd.DataFrame( + [ + { + "timestamp": "2024-01-01", + "asset": "A", + "side": "buy", + "quantity": 3.0, + "price": 10.0, + "commission": 0.0, + }, + { + "timestamp": "2024-01-02", + "asset": "A", + "side": "sell", + "quantity": 3.0, + "price": 11.0, + "commission": 0.0, + }, + ] + ) + external = module.suite.BenchmarkResult("external", "scale", 0.0, 999, 0.0, 0.0) + ml4t = module.suite.BenchmarkResult("ml4t", "scale", 0.0, 999, 0.0, 0.0) + external.fills_df = fills + ml4t.fills_df = fills.copy() + + module._use_canonical_fill_backed_trades(external, ml4t) + + assert external.num_trades == ml4t.num_trades == 1 + assert module.suite.canonical_trade_records(external.trades_df) == ( + module.suite.canonical_trade_records(ml4t.trades_df) + ) + + def test_complete_report_reconstructs(monkeypatch: pytest.MonkeyPatch) -> None: module = _load_module() report = _complete_report(module, monkeypatch) diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index b959351d..44f4c26e 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -317,6 +317,11 @@ explicit comparison protocol described above. The native Zipline defaults remain `lean` profile represents only the named daily US-equity protocol above. Its stop settings are not part of the retained LEAN equivalence claim. +Large-scale evidence compares native ordered fills first, then reconstructs closed trades from the +canonical 1e-8 fill records for both engines. This prevents sub-quantum differences in a +framework's post-hoc trade-table arithmetic from changing a trade derived from equivalent fills. +The scenario suite separately compares each framework's native trade records. + --- ## Current Parity Status diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index 5f3cd3a3..de843302 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -274,6 +274,16 @@ def _framework_run( return external, ml4t +def _use_canonical_fill_backed_trades( + external: suite.BenchmarkResult, + ml4t: suite.BenchmarkResult, +) -> None: + for result in (external, ml4t): + result.trades_df = suite.closed_trades_from_fills(result.fills_df) + records = suite.canonical_trade_records(result.trades_df) + result.num_trades = len(records) if records is not None else 0 + + def run_worker(framework: str, workload: ScaleWorkload = WORKLOAD) -> dict[str, Any]: """Execute one external/ML4T scale pair and retain exact digests.""" manifest = load_framework_manifest() @@ -284,6 +294,7 @@ def run_worker(framework: str, workload: ScaleWorkload = WORKLOAD) -> dict[str, effective_prices = _effective_prices(framework, price_data) effective_digest = input_digest(effective_prices, signals, dates) external, ml4t = _framework_run(framework, config, price_data, signals, dates) + _use_canonical_fill_backed_trades(external, ml4t) comparison = cast( dict[str, Any], suite.compare_benchmark_results_exact( @@ -328,9 +339,7 @@ def run_worker(framework: str, workload: ScaleWorkload = WORKLOAD) -> dict[str, "capabilities": { "intents": "canonical strategy trace", "fills": "native", - "closed_trades": ( - "native" if framework.startswith("vectorbt") else "reconstructed from native fills" - ), + "closed_trades": "reconstructed from canonical native fills", "terminal_state": "reconstructed from native fills and final marks", "fill_order": "session, asset, side, quantity, price", }, From 8a7abf8592c71ec97d331c1fc67e50009eac45fd Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 03:11:27 -0400 Subject: [PATCH 19/44] feat(validation): retain historical VectorBT replay --- tests/contracts/test_large_scale_evidence.py | 47 +- .../vectorbt_pro_2025_12_31/pyproject.toml | 14 + .../vectorbt_pro_2025_12_31/uv.lock | 666 ++++++++++++++++++ validation/large_scale_evidence.py | 344 +++++++-- 4 files changed, 1018 insertions(+), 53 deletions(-) create mode 100644 validation/environments/vectorbt_pro_2025_12_31/pyproject.toml create mode 100644 validation/environments/vectorbt_pro_2025_12_31/uv.lock diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py index 8eb1b072..94258cc9 100644 --- a/tests/contracts/test_large_scale_evidence.py +++ b/tests/contracts/test_large_scale_evidence.py @@ -69,7 +69,18 @@ def _complete_report(module, monkeypatch: pytest.MonkeyPatch): records.append( { "framework": framework, - "target": {**target.evidence_metadata(), "actual_version": target.version}, + "target": { + **target.evidence_metadata(), + "actual_version": target.version, + **( + { + "actual_commit": target.source_commit, + "actual_immutable_id": target.immutable_id, + } + if framework == "vectorbt_pro" + else {} + ), + }, "python": {"version": "3.12.11", "implementation": "cpython"}, "ml4t": {"commit": "a" * 40, "dirty": False}, "source_digests": module._source_digests(), @@ -175,6 +186,40 @@ def test_complete_report_reconstructs(monkeypatch: pytest.MonkeyPatch) -> None: assert module.report_failures(report, reconstruct_input=True) == [] +def test_historical_report_requires_exact_identity_and_matching_outputs( + monkeypatch: pytest.MonkeyPatch, +) -> None: + module = _load_module() + current_report = _complete_report(module, monkeypatch) + current = next( + record for record in current_report["frameworks"] if record["framework"] == "vectorbt_pro" + ) + historical = copy.deepcopy(current) + target = module._historical_vectorbt_pro_target() + historical["target"] = { + **target.evidence_metadata(), + "actual_version": target.version, + "actual_commit": target.source_commit, + "actual_immutable_id": target.immutable_id, + } + report = module.build_historical_report(current, historical, module.WORKLOAD) + + assert module.historical_report_failures(report, reconstruct_input=True) == [] + + wrong_identity = copy.deepcopy(report) + wrong_identity["historical"]["target"]["actual_version"] = "2026.6.27" + assert module.historical_report_failures(wrong_identity) + + changed_output = copy.deepcopy(report) + fill_check = next( + check + for check in changed_output["historical"]["comparison"]["checks"] + if check["name"] == "fills" + ) + fill_check["expected_sha256"] = "0" * 64 + assert module.historical_report_failures(changed_output) + + @pytest.mark.parametrize( "mutation", ["recipe", "input", "order_intents", "fills", "trades", "terminal_state", "final_value"], diff --git a/validation/environments/vectorbt_pro_2025_12_31/pyproject.toml b/validation/environments/vectorbt_pro_2025_12_31/pyproject.toml new file mode 100644 index 00000000..813810c6 --- /dev/null +++ b/validation/environments/vectorbt_pro_2025_12_31/pyproject.toml @@ -0,0 +1,14 @@ +[project] +name = "ml4t-backtest-validation-vectorbt-pro-2025-12-31" +version = "0.0.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "ml4t-backtest", + "vectorbtpro @ git+ssh://git@github.com/polakowo/vectorbt.pro.git@1305a1e1974325db9382eaeacc6452e9b075ca71", +] + +[tool.uv] +package = false + +[tool.uv.sources] +ml4t-backtest = { path = "../../..", editable = true } diff --git a/validation/environments/vectorbt_pro_2025_12_31/uv.lock b/validation/environments/vectorbt_pro_2025_12_31/uv.lock new file mode 100644 index 00000000..a2256245 --- /dev/null +++ b/validation/environments/vectorbt_pro_2025_12_31/uv.lock @@ -0,0 +1,666 @@ +version = 1 +revision = 3 +requires-python = "==3.12.*" +resolution-markers = [ + "sys_platform == 'win32'", + "sys_platform == 'emscripten'", + "sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/31/4971872b3ed8715346231fb6eb4da8fcba65a4143c189db151ee28a2812b/charset_normalizer-3.5.0.tar.gz", hash = "sha256:49bd5feb59b0bf3cbf6ebcf4352e371c95b9da9bacd4449f8b64d0ad2c10a26e", size = 169295, upload-time = "2026-08-12T14:35:31.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/3c/045ea64ea5a550870dd8ab60b2242870328d53f17d2be593b4f9f3121474/charset_normalizer-3.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:98820e1ceb25c6df7a80c4fd8efa59cb121f99bc7c4c1693ad94a2caff5b311d", size = 343861, upload-time = "2026-08-12T14:32:27.254Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1b/7502be709db899d5b4801509829188b3a5a10969411da9c846115a5f1b70/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:608553f476fca509537e804c4a71f5eb166ce63b75141f89c2c686ce1aa36956", size = 237550, upload-time = "2026-08-12T14:32:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ce/66392661375148d9455c17bee25509a54e28c39969e34befa48ec8777936/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6753de11eef42f1c321b26d682957d92c7f7bbce6530f34bbe0f9291dd37cc6f", size = 229673, upload-time = "2026-08-12T14:32:29.668Z" }, + { url = "https://files.pythonhosted.org/packages/6a/64/f58c32a8d4ecf55b82ee61ee9aa6a664d4afcd36c72feb4c926fd6fe9af8/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f76dc0a47f94cb9b69d86f01e477f4b0371ca70208b9ccea7e063c41eed9046", size = 260768, upload-time = "2026-08-12T14:32:30.891Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ea/36c90e59a96386174377e855479ec154221ef001e96637e0b23be92489c4/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c387c6bf91b4774e359a48a179e2872b8e8bf741e4fde06ba8d1665eb9a4760a", size = 257880, upload-time = "2026-08-12T14:32:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/23/35/5b85772eb82528ef22ba29487ad544a7049dfd27f35b1a5a55dbc0843048/charset_normalizer-3.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14f6904a3cf870abf044df3a8c4924ac6c8ef77e9896586fd37e73ae96cff2af", size = 247547, upload-time = "2026-08-12T14:32:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/b6/14/ba11a99c2a22ab04c2d5383a700b378cb463a78ab15f36444cabc10cd671/charset_normalizer-3.5.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0cce46dd29d73e135e8087b96eb62a4aca6d69391b7f97808c6588ebed3178f3", size = 243326, upload-time = "2026-08-12T14:32:34.794Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4a/cadba3f2400b45aa1d62a4ae0298bf58a3b30b1158baf15c338c7ce5b601/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b476cdb63df22da2b91837593380be3ddbe406f36c506c1c91d80e7196b66288", size = 238820, upload-time = "2026-08-12T14:32:35.984Z" }, + { url = "https://files.pythonhosted.org/packages/47/41/d5188b9342d75b72c2b05d3ee373f01a691397e770f001ee05e3b37925f5/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1f56ce84b317ef2a59d7d3461891c7597c79247d2192bb8114c68a1a1debfcc0", size = 231661, upload-time = "2026-08-12T14:32:37.191Z" }, + { url = "https://files.pythonhosted.org/packages/13/5f/df38fa972c4e945c3d8cee2bc4e610613af522fd359c7dc7a74c419f0278/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9ce0f885239357379d92fd9a5fddbe20f0e30e0527c29ba69f8e99eeb1304a76", size = 261459, upload-time = "2026-08-12T14:32:38.369Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d7/043ff7720067a3beee05523465ac9c1c846c68b7884930dd483f72ee5ab6/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:96ae7ab5d8155fde927aa0864fbc8ba3cc4fde6d41ab0c7cea9d6012b4978603", size = 242300, upload-time = "2026-08-12T14:32:39.505Z" }, + { url = "https://files.pythonhosted.org/packages/19/f6/33980b7b802a048e546a6d9ad2ea783a6cf6b10a86aaccd10db462d8b913/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf91921009025e96ce57a03ced6d14604fc3baf0530351638e9504a55da6fa3b", size = 259101, upload-time = "2026-08-12T14:32:41.02Z" }, + { url = "https://files.pythonhosted.org/packages/a6/b7/0d19bde844bff9165377c1da9ef3c4792a4c24bd49b5b7094d9e6f6ab58b/charset_normalizer-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0b2e44e6d42d1a4ff78ccc219a93c5449105d10b16198d1aea581080df8073f9", size = 249246, upload-time = "2026-08-12T14:32:42.47Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/2c34fdfaacdf0e96e880ef562cbf80a9b5f8ea97e0dd9e57ba348a9c65cf/charset_normalizer-3.5.0-cp312-cp312-win32.whl", hash = "sha256:deb99535e9bf0bea8e274c6413eb939a21be35a3f492678dba4d5b1f4d70f142", size = 178025, upload-time = "2026-08-12T14:32:43.909Z" }, + { url = "https://files.pythonhosted.org/packages/76/d0/c34dbd1df23bcbdc1b5d2f48256340d72fa747f1eb03924a9d2fa35ed85b/charset_normalizer-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54dd1a66fa4bce0ccaf0db9dde336e49b3eec646dc4c1c0991279369d373a14", size = 200143, upload-time = "2026-08-12T14:32:45.254Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/4e6bf1465d60c3d8f488d5bde140d0cb91cd23ccab0dc2895cc6c6982047/charset_normalizer-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:b8ea208b304587d47931b36481342d20336e0d338ab052f8b4305926482598d6", size = 180046, upload-time = "2026-08-12T14:32:46.545Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f3/7b523d807cb5e73562ef8acf21d39cdb9d704955327362c781bc3478a73d/charset_normalizer-3.5.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5a4ee37248dfac25107c758bda99d545ce73e60b44d2dd39e4a2bb9f2831e9f5", size = 330840, upload-time = "2026-08-12T14:34:45.06Z" }, + { url = "https://files.pythonhosted.org/packages/f0/de/fc68978fe78ca97063c96d764e41ff92ca639948f319271e0ff450e577a2/charset_normalizer-3.5.0-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a864bdcacd8bff58bb4845304e031f821a3ec64b2b7259f2d409cd49c9e59ca3", size = 251862, upload-time = "2026-08-12T14:34:46.58Z" }, + { url = "https://files.pythonhosted.org/packages/a9/cb/82b41a0ab7fb1a88065f1d78ad32696ad88ea3fe8e25b8189d08833938de/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:84b736e3b391601bc47b86da381c749c0f894e9191aaca9f31f30c2632206df3", size = 239484, upload-time = "2026-08-12T14:34:47.869Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0c/19608b631f4538f908098d4a2d56a8f79a665e27cc58e9d90479761a9227/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6abb1f356fb865baeb6ebc3fadd843e9a96fbf49b9adcca55037f3cceccb7438", size = 230602, upload-time = "2026-08-12T14:34:49.265Z" }, + { url = "https://files.pythonhosted.org/packages/29/db/f648eb30e14eba301aed61e11672156f137905c1bdbb530151abe8065943/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d366548d2ee28a8cfdcc4296363978cc644a728333be9824d2de4652e83df0a", size = 259208, upload-time = "2026-08-12T14:34:50.632Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e0/ed2c8bdbac484d69614d6993143aeb6cb0f4dd1561c883402517b623c8ef/charset_normalizer-3.5.0-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d672f329ae504ee240eb39b6effb3318aa8e7e8924c0ce8eee5760b3fad98539", size = 253659, upload-time = "2026-08-12T14:34:52.11Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/b4907cb9ec5b521d9d024ced13611240b86ef065c2eb15b3ad2334dc9940/charset_normalizer-3.5.0-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c54036a518748b6c02e666f6d46c3817561998fb904c3be25b56fb4fe3dc5706", size = 248821, upload-time = "2026-08-12T14:34:53.399Z" }, + { url = "https://files.pythonhosted.org/packages/12/b2/e2d1abcfbc05822f0030869efb4e9f8a3658e13b4821796d4b62da917327/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:22a1889f1c9b752c63c36758a0c2145458e3cadb20fced7a0790002e9dd12b26", size = 240271, upload-time = "2026-08-12T14:34:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f9/4ba127ad610542fa3eabfa41c45bf12d357860a815b3566374ec0188e213/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:b7eb3eab5c646d3de7dcb14a7c9caebace5249c5767da39e1761cb1576e521a3", size = 232155, upload-time = "2026-08-12T14:34:56.543Z" }, + { url = "https://files.pythonhosted.org/packages/01/68/40613182366d00bd6dbd5f6c84a926cbd120960e038a8269e9ae7d782762/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2080aa129a28267984cdc902898993d788c995c384e285d0d19199f56760d52e", size = 259674, upload-time = "2026-08-12T14:34:57.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/53/4574a14fa4c9de4a6c9f31725354bfa40b67f653e6d594ce1654f9a41b32/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:fd68c825548a611158230e2f9222e210ceb2e3391995c0aa5865cbdf3ab4bd49", size = 246122, upload-time = "2026-08-12T14:34:59.337Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/bd8030d13d92c058ca7b2b9615bbb3169569e144db64d65c149cd45abf5e/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_s390x.whl", hash = "sha256:d8a9316f4da85e937242642b537c6d55d7e9287dd38e5634732f8233932aff45", size = 255221, upload-time = "2026-08-12T14:35:00.71Z" }, + { url = "https://files.pythonhosted.org/packages/77/9d/10ecd3bcbe2666b3d4d4026c97b48f73990682815db516052a1e8f4a31c5/charset_normalizer-3.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d90254c8f609338c53ec180fcd4c4f9c16502e238e3fc88ca7fd4c2f38d445b8", size = 253450, upload-time = "2026-08-12T14:35:02.217Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/d044c4872c0938a84f87b5027a698c0e61bacfc5c3551a4e749ca9b7bc5c/charset_normalizer-3.5.0-cp37-abi3-win32.whl", hash = "sha256:8b3e9e29b8b07cc461b9ce7768db7693a93979d0dadf22046f6f3555ded2f516", size = 173594, upload-time = "2026-08-12T14:35:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/10/6b/6046773901f1944b9a89436351529811ee958afc7b774563be9d74a6f0c3/charset_normalizer-3.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:0c8953d9d1617794cfc40d81179571c9ba3805dd029623a15c93f1fb70e60a74", size = 198959, upload-time = "2026-08-12T14:35:05.187Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a6/b57708ac92aefc8e8389d51d5178129b81f03196da61ee2c23e687b8178a/charset_normalizer-3.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:562d24ca7797c1af8852994950c2e623a907b201fc4b0ed29e92af173d3828ca", size = 267055, upload-time = "2026-08-12T14:35:06.533Z" }, + { url = "https://files.pythonhosted.org/packages/22/c7/754d09943a616937df61e4ba367c409ded2a987e872972098d51a6fcf73b/charset_normalizer-3.5.0-py3-none-any.whl", hash = "sha256:993dfcbe75a85a3784abb5084f2c41b915767c90546fcc92803cffa28611baea", size = 67943, upload-time = "2026-08-12T14:35:30.363Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "dateparser" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "regex" }, + { name = "tzlocal" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/6a/9f06999c4f27e9192c5eb38bfffadc2e6752df8178e97e88b10b9eb4c682/dateparser-1.4.2.tar.gz", hash = "sha256:bed2a3fd9bad8f2fb2d72b57748bada260b3a9349a264c22ffc23c3249d7049a", size = 338363, upload-time = "2026-08-04T12:11:03.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/1b/349e07ad184d64e81109e85a3557d7e05631fa3d05344169114ba743c4d3/dateparser-1.4.2-py3-none-any.whl", hash = "sha256:752f3d49d477cf7f60a7a9c8bcb19c882496ede0e377d5a3d80014cdfeca7050", size = 316546, upload-time = "2026-08-04T12:11:01.396Z" }, +] + +[[package]] +name = "exchange-calendars" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "korean-lunar-calendar" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyluach" }, + { name = "toolz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, +] + +[[package]] +name = "humanize" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/ea/13a1ef3c12d12662905801495283530251918b70d62d368f1d2e0272c70d/humanize-4.16.0.tar.gz", hash = "sha256:7dc2244a2f84a4bfb1d36c37bac80cd78e35cdc5c119206d87b018e1445f3a3f", size = 89515, upload-time = "2026-06-30T16:17:29.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/aa/0b7365d30fed43e7a3449aba1fe20a0a7174d9cf13e282af4e69ac825441/humanize-4.16.0-py3-none-any.whl", hash = "sha256:353eb2f34c09d098b2880eee8bef21832eae6d174f48c5762fff7e5fcb74d01d", size = 137209, upload-time = "2026-06-30T16:17:28.36Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/62/aa770a9307508d2a2a2c62d536a49347bffe9e55322db27838d3c93d0b07/imageio-2.37.4.tar.gz", hash = "sha256:e45cbc5e83502047fb138f7f585f7f105a136a57eea5f4b3cfc6ce1b52720bd3", size = 390173, upload-time = "2026-07-20T05:26:11.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/2d/ca050652104bab2cf55e569db2a178b1b61cb041fef28307f2db383f6d9f/imageio-2.37.4-py3-none-any.whl", hash = "sha256:1ab2e22c8debf700f24c3ac43e8f95f3b3a8110c83b93411e97b4b0b2cd1c7e6", size = 318000, upload-time = "2026-07-20T05:26:09.874Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "korean-lunar-calendar" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/9f/6160e95f3934026194dc7a0b5c78fe5c6e74761830ddea3e9cfc38e3f983/korean_lunar_calendar-0.4.0.tar.gz", hash = "sha256:be56f27bc0594fdbbdf7bbe00f504a9f929a31e311bd7d9bb93561b645afade7", size = 13425, upload-time = "2026-06-15T14:19:57.163Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/88/f56033b09fdca5c8c5e5fc2f3513950a05cd62caa9bd8e6d2750a887c86e/korean_lunar_calendar-0.4.0-py3-none-any.whl", hash = "sha256:c042e20de0bb702add6bec8d0f6da1ea8d3b170838e63846f70420cf341fe4e7", size = 11323, upload-time = "2026-06-15T14:19:56.089Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.49.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/27/72ae94ea5c8f7349ec1c229d4cd058feb799cbd0833ad6d1b47c919b37b7/llvmlite-0.49.0.tar.gz", hash = "sha256:00f16db782f4a13c78c5804aedc434e46794a77e89999a168f9401106270e50a", size = 194467, upload-time = "2026-08-11T16:26:00.489Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/ae/3f699ebe3590e15e023a6372dd147526fd8ec398aacf9ceb844e854964a8/llvmlite-0.49.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b541c8fac3450db7574d1f53cf9dff83f285bfed9d69bf81fe71fc2a7d4f97fe", size = 40479231, upload-time = "2026-08-11T16:23:56.773Z" }, + { url = "https://files.pythonhosted.org/packages/be/3c/e97f69c62a2d972066d9a2612ce1f3de313035ac897a5b9f787cad8b55f7/llvmlite-0.49.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6acba646d88abbc87d5c113a3d62c1fbf8b8fee11c6493f516803e30f21ae870", size = 59890658, upload-time = "2026-08-11T16:24:05.451Z" }, + { url = "https://files.pythonhosted.org/packages/69/e6/e942ee08605fc0526ff3854260c384d8315a5830e16c4c2a5aebc14dc9bf/llvmlite-0.49.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ec8ad805e7515cb8440a690eb3cef4d34acb29eef80b705ec4e1c1ad3c43c68", size = 58344481, upload-time = "2026-08-11T16:24:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/84/49/2a44871cac6b5a2fd4aabd68cfdaf6de9a5c7edb36dee5d47b77bda4b50f/llvmlite-0.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a9c9e3af4e214acfefa4f73ebe7bc3fb35854a62b654edb3953f5ae33c08ba3", size = 41865543, upload-time = "2026-08-11T16:24:20.41Z" }, +] + +[[package]] +name = "ml4t-backtest" +source = { editable = "../../../" } +dependencies = [ + { name = "ml4t-specs" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pandas-market-calendars" }, + { name = "polars" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "backtrader", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=1.9.0" }, + { name = "cvxpy", marker = "extra == 'advanced'", specifier = ">=1.3.0" }, + { name = "cvxpy", marker = "extra == 'all'", specifier = ">=1.3.0" }, + { name = "dash", marker = "extra == 'all'", specifier = ">=2.11.0" }, + { name = "dash", marker = "extra == 'viz'", specifier = ">=2.11.0" }, + { name = "hypothesis", marker = "extra == 'all'", specifier = ">=6.80.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.80.0" }, + { name = "matplotlib", marker = "extra == 'all'", specifier = ">=3.7.0" }, + { name = "matplotlib", marker = "extra == 'viz'", specifier = ">=3.7.0" }, + { name = "mkdocs", marker = "extra == 'all'", specifier = ">=1.6,<2" }, + { name = "mkdocs", marker = "extra == 'docs'", specifier = ">=1.6,<2" }, + { name = "mkdocs-material", marker = "extra == 'all'", specifier = ">=9.5.0" }, + { name = "mkdocs-material", marker = "extra == 'docs'", specifier = ">=9.5.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'all'", specifier = ">=0.24.0" }, + { name = "mkdocstrings", extras = ["python"], marker = "extra == 'docs'", specifier = ">=0.24.0" }, + { name = "ml4t-diagnostic", marker = "extra == 'all'", specifier = ">=0.1.0b4" }, + { name = "ml4t-diagnostic", marker = "extra == 'dev'", specifier = ">=0.1.0b4" }, + { name = "ml4t-specs", specifier = ">=0.1.2,<0.2" }, + { name = "networkx", marker = "extra == 'advanced'", specifier = ">=3.0" }, + { name = "networkx", marker = "extra == 'all'", specifier = ">=3.0" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, + { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, + { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, + { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, + { name = "polars", specifier = ">=1.36.1" }, + { name = "pre-commit", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyfolio-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.9.9" }, + { name = "pytest", marker = "extra == 'all'", specifier = ">=7.4.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.4.0" }, + { name = "pytest-asyncio", marker = "extra == 'all'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-benchmark", marker = "extra == 'all'", specifier = ">=4.0.0" }, + { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'all'", specifier = ">=4.1.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1.0" }, + { name = "pytest-timeout", marker = "extra == 'all'", specifier = ">=2.1.0" }, + { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.1.0" }, + { name = "pytest-xdist", marker = "extra == 'all'", specifier = ">=3.3.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.3.0" }, + { name = "pyyaml", specifier = ">=6.0.3" }, + { name = "ruff", marker = "extra == 'all'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, + { name = "ty", marker = "extra == 'all'" }, + { name = "ty", marker = "extra == 'dev'" }, + { name = "vectorbt", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=0.24.0" }, + { name = "zipline-reloaded", marker = "python_full_version < '3.15' and extra == 'comparison'", specifier = ">=2.4.0" }, +] +provides-extras = ["advanced", "all", "comparison", "dev", "docs", "viz"] + +[package.metadata.requires-dev] +dev = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "ml4t-diagnostic", specifier = ">=0.1.0b4" }, + { name = "pre-commit", specifier = ">=3.3.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, + { name = "ruff", specifier = ">=0.8.0" }, + { name = "twine", specifier = ">=6.0.0" }, + { name = "ty" }, +] +test = [ + { name = "hypothesis", specifier = ">=6.80.0" }, + { name = "pytest", specifier = ">=7.4.0" }, + { name = "pytest-benchmark", specifier = ">=4.0.0" }, + { name = "pytest-cov", specifier = ">=4.1.0" }, + { name = "pytest-timeout", specifier = ">=2.1.0" }, + { name = "pytest-xdist", specifier = ">=3.3.0" }, +] + +[[package]] +name = "ml4t-backtest-validation-vectorbt-pro-2025-12-31" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "ml4t-backtest" }, + { name = "vectorbtpro" }, +] + +[package.metadata] +requires-dist = [ + { name = "ml4t-backtest", editable = "../../../" }, + { name = "vectorbtpro", git = "ssh://git@github.com/polakowo/vectorbt.pro.git?rev=1305a1e1974325db9382eaeacc6452e9b075ca71" }, +] + +[[package]] +name = "ml4t-specs" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/ca/aba7ea1f4e9a1da0b4f465dea03d3e4320d63db348245a2a9976096407ac/ml4t_specs-0.1.3.tar.gz", hash = "sha256:9578038af96d59cd50317e78f8781772833b308076da13ad24c0b304bb20961d", size = 50758, upload-time = "2026-08-12T02:27:14.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/6c/0a35ee16313441a68a14d811ffa8b79eb63a013d548b6bbb50dfd208c6b1/ml4t_specs-0.1.3-py3-none-any.whl", hash = "sha256:2b9302d27746f5859b62c6748bf217ca4eae76d4842c783575c58f4880d1568f", size = 33860, upload-time = "2026-08-12T02:27:12.929Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "narwhals" +version = "2.24.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/1d/58946e5aab18393e793bd4add6985b95d0e01c3a2d832f38f54468b10dcd/narwhals-2.24.0.tar.gz", hash = "sha256:b5c0f684ccd9d7475b564111e319a4964abcf2baf79d3cf6b1003d06ac9b828d", size = 661143, upload-time = "2026-07-13T10:49:19.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/85/a5bfaebfd305ac18b57b0854d74e37e586809061a91fda62f0bd50c8518e/narwhals-2.24.0-py3-none-any.whl", hash = "sha256:42fdedf44e5b2ca7505630d45b4ac3058f38d8485cba9fe1652ca23152df7489", size = 461030, upload-time = "2026-07-13T10:49:17.571Z" }, +] + +[[package]] +name = "numba" +version = "0.67.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/90/2544f4e3a61e501d6c9a5418fd4b905323222693d54a02cab0106a0af865/numba-0.67.0.tar.gz", hash = "sha256:cd75aa535b33fa05d9d930b1ae8af9f97a2881e96d72dfb38ec9b78284d9f851", size = 2836515, upload-time = "2026-08-11T23:04:00.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/58/915cddba90010348ed0444451132fdde9b000bcbaff1582029b5bf115d11/numba-0.67.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:6004d8d5f28d4028687fb2d972d629295b13685943bd2ed5cd8810c3b848e219", size = 2745050, upload-time = "2026-08-11T23:03:25.607Z" }, + { url = "https://files.pythonhosted.org/packages/bb/38/926757caaac18a66f057d7544a63620bf360a07d281c9f7ecadd2aa83963/numba-0.67.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f63d43db06b4756424d6d2484737c902e0ae944a0eec3e8b0b4de2c695b15caa", size = 3884596, upload-time = "2026-08-11T23:03:27.688Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6d/58291dc58da39d98b32db7f044729f6d8d4920cd9622fbab3179b54ff4c4/numba-0.67.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76d3335aaeffb9dc88309420890e73497a00be08a7530441bc2b58ffe025bfa5", size = 3585290, upload-time = "2026-08-11T23:03:29.684Z" }, + { url = "https://files.pythonhosted.org/packages/6e/63/ab21828b4056afed71f9ecb40f4de26c2c19de731cc001961aca74b79464/numba-0.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:50e2b72406c18cda5dd7431b0082cb85ea94e06c64c33607248fc8bef92cfb81", size = 2815645, upload-time = "2026-08-11T23:03:31.732Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" }, + { url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" }, + { url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" }, + { url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" }, + { url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" }, + { url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" }, + { url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/54/1dc810ea558d1320b597aa140a514f2fdf1d2ea09c38cf556f13ea712ec9/pandas-3.0.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa290c16964d4963fbfbc358928239cf3bd755b20e988ce944877def2f44471d", size = 10411717, upload-time = "2026-07-22T22:18:08.307Z" }, + { url = "https://files.pythonhosted.org/packages/68/56/fbe81c09195924d8b7b8d4461a20458fe80a6a5ed6b24f0314da684277e1/pandas-3.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2e26bb46934b8a2ca0c3de1d3d606fc5f6746584791b2db264d58cf370e08dc", size = 9957095, upload-time = "2026-07-22T22:18:10.6Z" }, + { url = "https://files.pythonhosted.org/packages/e0/51/fac252f4a913ed5eabf3c11b880a9e8d5a6c10f0b2129d0462212d238b4d/pandas-3.0.5-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73fa87b08a7ef706f8aafda39ddaccf2a99047bea62d8c88a0361bcafb2237bc", size = 10485458, upload-time = "2026-07-22T22:18:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/12/98/e976540c1addf70442be7842a18cf70884a964abbf69442504f4d2939989/pandas-3.0.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d373ce03ffd84010ed9839fa73672a9c8256990532e158440c0085db7d914b34", size = 10998091, upload-time = "2026-07-22T22:18:15.209Z" }, + { url = "https://files.pythonhosted.org/packages/a4/8c/1f29b5be8d3fc47dd7567eb167fabba2085879b31e0287ce7cba6d3d2ff4/pandas-3.0.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a29c53d85ea98c5e792c59ef82ee9fbe6ca902c0d0adb6b23f45ef894cd7bf6", size = 11499501, upload-time = "2026-07-22T22:18:17.689Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e2/bd9c98ad2df7b38bde002adde4cdf353519da51881634323b126c55997f9/pandas-3.0.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5ad3b02ed6bc7d7ae9b70804b2c6aa31827489d150f8e623ce82491b82085d7", size = 12060559, upload-time = "2026-07-22T22:18:20.147Z" }, + { url = "https://files.pythonhosted.org/packages/f3/9a/ffbd852d58bd74a617fe2f8ee6a58a96982271ce41cf981eab22190b4a4b/pandas-3.0.5-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:b2acb4650527eec6822c3dadb2b771277b65e7dae7a267d4bccf65fd1bb3fbce", size = 7197652, upload-time = "2026-07-22T22:18:22.502Z" }, + { url = "https://files.pythonhosted.org/packages/70/b5/d2d3e9ae73362ba4229651b0ee1455cf78073a1ce585f6ff693782ce263e/pandas-3.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:80a611068e8a3ac23f7398c6c14eb46dc974e5cc9997f653e2dcfd1da74edd41", size = 9831691, upload-time = "2026-07-22T22:18:24.534Z" }, + { url = "https://files.pythonhosted.org/packages/52/51/dea1e89d6a6796b9c43f85a09b484ee03edb8a4c4842e73e200a8c11301c/pandas-3.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:25ff585b972a18ef1fe9ffa3ac6544d9950508aa76832e5147640b6022821e49", size = 9105796, upload-time = "2026-07-22T22:18:27.064Z" }, +] + +[[package]] +name = "pandas-market-calendars" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exchange-calendars" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, +] + +[[package]] +name = "polars" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/13/3873f213304bcbaaf39e63c8b905ceb460a0524448d57f86a829f6d4d0fd/polars-1.43.2.tar.gz", hash = "sha256:c699671b99eb71ff53334d237917aaa3db5ad4dda480abcb6c80e0eaee7b677b", size = 750312, upload-time = "2026-08-01T06:28:30.872Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/fe/0888040a24e4504098b85d8ad486b14cb01cf6b030bbe479dfc2dcffc2ac/polars-1.43.2-py3-none-any.whl", hash = "sha256:22aa0cb92a1ee2d60d6a15a638b2e8e0dd99aea21ac0cd8fb29da8e382e075a9", size = 847150, upload-time = "2026-08-01T06:27:15.543Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.43.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/06/11b578eeef05f867e3ee31b2a2fdd8e7684c2aa47822c49935d1be789c38/polars_runtime_32-1.43.2.tar.gz", hash = "sha256:d7b7c486bccee75a6af0158b87077da3d054657e3c60036b28644f4e1c7fdbf7", size = 3095669, upload-time = "2026-08-01T06:28:32.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/fc/12e6d4ca34d820297651134cfa35f86c33e898539fc6629cbb35d0089697/polars_runtime_32-1.43.2-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:91abf205d4ec93f92ba95386b7f8776559ae3dfce425ed2e527efa75d117d04a", size = 53088908, upload-time = "2026-08-01T06:27:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/32/81/833b0853551deb810854f96b43dea342b6e6c9b0ea1afcccf774157d519d/polars_runtime_32-1.43.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2cc3ff96fd44789b02eb5c15b98dfcb000101636b177d3034fae2feec19b118f", size = 47540529, upload-time = "2026-08-01T06:27:21.391Z" }, + { url = "https://files.pythonhosted.org/packages/83/55/7b2a75af14c9294d97f3bec132dd3018ddcd988bef32b5d28322150b8c11/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10ed36e615ab362feb7406e6d084e124b445ad284caa73bd93ae7e65745ed894", size = 51366340, upload-time = "2026-08-01T06:27:24.776Z" }, + { url = "https://files.pythonhosted.org/packages/62/60/64deacb3abc70c52e2d88a808a052d1621c86a48fe9194f2c065579ab1cd/polars_runtime_32-1.43.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5a7ae004a2723ebf4427f6d6a639f30f86af4cf077075f6b35d04711154fc3", size = 57304599, upload-time = "2026-08-01T06:27:27.875Z" }, + { url = "https://files.pythonhosted.org/packages/52/95/d6e3a236d7630e17c40d0ddee839bf2be9acf548fdc0e5ad65ed9ff0cac6/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:09339eacc6d392206e78aabbaaa37d7276eb969b798f46cb1f367fd718798c60", size = 51520580, upload-time = "2026-08-01T06:27:30.913Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/2deb8eac70e9a2ac26d88a66ae7cf52612865026f4f4a5e7ab11ad9d52bf/polars_runtime_32-1.43.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:452b400e59e7f56e4c6437f435e796903272a9388feee12de2bea049ae87025e", size = 55204471, upload-time = "2026-08-01T06:27:33.886Z" }, + { url = "https://files.pythonhosted.org/packages/29/9e/647401ae8a607bc0cc40ed7b8592d5b1be90ded0dc9b9d6d3aeb03f9524b/polars_runtime_32-1.43.2-cp310-abi3-win_amd64.whl", hash = "sha256:00e33c28e321410c8d66e814a90043101e3bdd9ed2c6dabda07565aa8adbbdf1", size = 52572176, upload-time = "2026-08-01T06:27:37.048Z" }, + { url = "https://files.pythonhosted.org/packages/96/8d/60a50c3f36c85218a7ffcb48c6fe2ce1f7bec799152d68b8658ebed2179c/polars_runtime_32-1.43.2-cp310-abi3-win_arm64.whl", hash = "sha256:350a4868cae85bf8b3f81b33ba47927c15256bd9264dfc8c0753f1b927eac9d3", size = 46582513, upload-time = "2026-08-01T06:27:40.025Z" }, +] + +[[package]] +name = "pyluach" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/11/42568c1568a75f8803c59f26d29af01a0890352b7a8e03d41ecda8bfb5dd/pyluach-2.3.0.tar.gz", hash = "sha256:ec6e30669d1df50c9ca160486da44a8195bb4c7a5d3d533990d0c5b03accd281", size = 26910, upload-time = "2025-09-09T20:24:39.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c8/f96208ade3ca4c23b372497d0788bcf0f2e0ff4310e5ee693366bc33fdf0/pyluach-2.3.0-py3-none-any.whl", hash = "sha256:4497b731aef59508b079dbf5f00bc5bf4329ac45090a6cd37b5a83756f0e69ab", size = 25914, upload-time = "2025-09-09T20:24:37.831Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pytz" +version = "2026.3.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/48/fb042503b6ca6cd271261dc559fd6432f7d8c713153e9ec5c591af4dfc1c/pytz-2026.3.post1.tar.gz", hash = "sha256:2211d3fcf9a797d3405cac96ac7f61d80e6a644f72a3309607282fe8a2010c5d", size = 319745, upload-time = "2026-07-25T15:12:07.385Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/7b/39c34ca613b0b198cb866466651b26b045e2009864c5183c979a3b83f383/pytz-2026.3.post1-py2.py3-none-any.whl", hash = "sha256:dd95840dd199baea12d9cc096a1d452caa6596a1c1e4b5f3dbd1541855d5e815", size = 508283, upload-time = "2026-07-25T15:12:05.782Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "regex" +version = "2026.7.19" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/98/04b13f1ddfb63158025291c02e03eb42fbb7acb51d091d541050eb4e35e8/regex-2026.7.19.tar.gz", hash = "sha256:7e77b324909c1617cbb4c668677e2c6ae13f44d7c1de0d4f15f2e3c10f3315b5", size = 416440, upload-time = "2026-07-19T00:19:48.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/b9/d11d7e501ac8fd7d617684423ebb9561e0b998481c1e4cbc0cb212c5d74a/regex-2026.7.19-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2cc3460cedf7579948486eab03bc9ad7089df4d7281c0f47f4afe03e8d13f02d", size = 496778, upload-time = "2026-07-19T00:17:05.677Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a9/a5ab6f312f24318019170dc485d5421fe4f89e43a98640da50d95a8a7041/regex-2026.7.19-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0e9554c8785eac5cffe6300f69a91f58ba72bc88a5f8d661235ad7c6aa5b8ccd", size = 297122, upload-time = "2026-07-19T00:17:07.59Z" }, + { url = "https://files.pythonhosted.org/packages/b3/63/4cab4d7f2d384a144d420b763d97674cb70619c878ea6fcd7640d0e62143/regex-2026.7.19-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d7da47a0f248977f08e2cb659ff3c17ddc13a4d39b3a7baa0a81bf5b415430f6", size = 292009, upload-time = "2026-07-19T00:17:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/22/85/102a81b218298957d4ea7d2f084fae537a71add9d6ff93c8e67284c5f45e/regex-2026.7.19-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93db40c8de0815baab96a06e08a984bac71f989d13bab789e382158c5d426797", size = 796708, upload-time = "2026-07-19T00:17:11.542Z" }, + { url = "https://files.pythonhosted.org/packages/78/b5/dc136af5629938a037cd2b304c12240e132ec92f38be8ff9cc89af2a1f2d/regex-2026.7.19-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:66bd62c59a5427746e8c44becae1d9b99d22fb13f30f492083dfb9ad7c45cc18", size = 865651, upload-time = "2026-07-19T00:17:13.312Z" }, + { url = "https://files.pythonhosted.org/packages/e0/75/67402ae3cd9c8c988a4c805d15ee3eef015e7ca4cb112cf3e640fc1f4153/regex-2026.7.19-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1649eb39fcc9ea80c4d2f110fde2b8ab2aef3877b98f02ab9b14e961f418c511", size = 911756, upload-time = "2026-07-19T00:17:15.015Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8e/096d00c7c480ef2ff4265349b14e2261d4ab787ba1f74e2e80d1c58079c3/regex-2026.7.19-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9dce8ec9695f531a1b8a6f314fd4b393adcccf2ea861db480cdf97a301d01a68", size = 801798, upload-time = "2026-07-19T00:17:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f0/41/e7ecac6edb5722417f85cc67eaf386322fbe8acf6918ec2fdc37c20dd9d0/regex-2026.7.19-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3080a7fd38ef049bd489e01c970c97dd84ff446a885b0f1f6b26d9b1ad13ce11", size = 776933, upload-time = "2026-07-19T00:17:19.347Z" }, + { url = "https://files.pythonhosted.org/packages/6f/69/03c9b3f058d66403e0ca2c938696e81d51cd4c6d47ec5265f02f96948d9a/regex-2026.7.19-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d793a7988e04fcb1e2e135567443d82173225d657419ec09414a9b5a145b986", size = 784338, upload-time = "2026-07-19T00:17:21.057Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f7/b38ab3d43f284afbb618fcd15d0e77eb786ae461ce1f6bc7494619ddc0f2/regex-2026.7.19-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e8b0abe7d870f53ca5143895fef7d1041a0c831a140d3dc2c760dd7ba25d4a8b", size = 860452, upload-time = "2026-07-19T00:17:23.119Z" }, + { url = "https://files.pythonhosted.org/packages/15/5c/ff60ef0571121714f3cf9920bc183071e384a10b556d042e0fdb06cc07a5/regex-2026.7.19-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4e5413bd5f13d3a4e3539ca98f70f75e7fca92518dd7f117f030ebedd10b60cb", size = 765958, upload-time = "2026-07-19T00:17:24.81Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0f/bd34021162c0ab47f9a315bd56cd5642e920c8e5668a75ef6c6a6fca590d/regex-2026.7.19-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:73b133a9e6fb512858e7f065e96f1180aa46646bc74a83aea62f1d314f3dd035", size = 851765, upload-time = "2026-07-19T00:17:26.993Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/a2ca43edade0595cccfdc98636739f536d9e26898e7dbddc2b9e98898953/regex-2026.7.19-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbe6493fbd27321b1d1f2dd4f5c7e5bd4d8b1d7cab7f32fd67db3d0b2ed8248a", size = 789714, upload-time = "2026-07-19T00:17:28.699Z" }, + { url = "https://files.pythonhosted.org/packages/5d/47/e02db4015d424fc83c00ea0ac8c5e5ec14397943de9abf909d5ce3a25931/regex-2026.7.19-cp312-cp312-win32.whl", hash = "sha256:ddd67571c10869f65a5d7dde536d1e066e306cc90de57d7de4d5f34802428bb5", size = 267157, upload-time = "2026-07-19T00:17:31.051Z" }, + { url = "https://files.pythonhosted.org/packages/08/8e/c780c131f79b42ed22d1bd7da4096c2c35f813e835acd02ef0f018bd892c/regex-2026.7.19-cp312-cp312-win_amd64.whl", hash = "sha256:e30d40268a28d54ce0437031750497004c22602b8e3ab891f759b795a003b312", size = 277777, upload-time = "2026-07-19T00:17:32.848Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4c/e4d7e086449bdf379d89774bf1f89dc4a41943f3c5a6125a03905b34b5fb/regex-2026.7.19-cp312-cp312-win_arm64.whl", hash = "sha256:de9208bb427130c82a5dbfd104f92c8876fc9559278c880b3002755bbbe9c83d", size = 277136, upload-time = "2026-07-19T00:17:34.803Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "schedule" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/91/b525790063015759f34447d4cf9d2ccb52cdee0f1dd6ff8764e863bcb74c/schedule-1.2.2.tar.gz", hash = "sha256:15fe9c75fe5fd9b9627f3f19cc0ef1420508f9f9a46f45cd0769ef75ede5f0b7", size = 26452, upload-time = "2024-06-18T20:03:14.633Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/a7/84c96b61fd13205f2cafbe263cdb2745965974bdf3e0078f121dfeca5f02/schedule-1.2.2-py3-none-any.whl", hash = "sha256:5bef4a2a0183abf44046ae0d164cadcac21b1db011bdd8102e4a0c1e91e06a7d", size = 12220, upload-time = "2024-05-25T18:41:59.121Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "narwhals" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac", size = 8741122, upload-time = "2026-06-02T11:53:24.08Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/83/a4/c8e67227c680e2259c8864ae72ff48b06e16a6f51253a22167aa02a8aa4e/scikit_learn-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4306775fad04cc4b472a1b15af1ae9cede1540fbfcc17fbce3767cd8dc7ae283", size = 8211173, upload-time = "2026-06-02T11:53:36.602Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fd/3c0863792e98e67e9184aa4029288a175935eb65443afcd30d4f143450cf/scikit_learn-1.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:26e22435f63bcdcf396b574273f29f13dd531f5ea035801f5be10ba1540a4e60", size = 7867451, upload-time = "2026-06-02T11:53:39.075Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a", size = 31056519, upload-time = "2026-06-19T14:59:45.203Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1e6442a00cd2924d361aa1b642ab6373ec35c6fabf311a760be9f76e0f13/scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b", size = 28681889, upload-time = "2026-06-19T14:59:48.103Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2d/11dd93d21e147a73ba22bd75c0b9208d3a2e0ec76d53170ce7d9029b1015/scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9", size = 20423580, upload-time = "2026-06-19T14:59:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/93552f75e0d2a7dd115a45e59209c51e8d514daff02fc887d2623be06fe1/scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8", size = 23054441, upload-time = "2026-06-19T14:59:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/21f5e703643d66f21faa6b4c73195bfcad70c55efcb4f1ab327cd7c4101a/scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab", size = 33968720, upload-time = "2026-06-19T14:59:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2", size = 35287115, upload-time = "2026-06-19T14:59:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ff/eec46be7e9234208f801062b53e1983085eddebd693f6c9bfb03b459830d/scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11", size = 35577989, upload-time = "2026-06-19T15:00:02.235Z" }, + { url = "https://files.pythonhosted.org/packages/84/ca/210d4759c7210bb7d269437421959b39a33434e2776b60c5cb8a763bb30a/scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de", size = 37421717, upload-time = "2026-06-19T15:00:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/9a9edb45345bd6744da5ddfb6628e5d5185920494c6a67ec45b6381004cb/scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132", size = 36597428, upload-time = "2026-06-19T15:00:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/99/0e/33f32a2a58987e26aec0f7df252cbbad1e90ae77bdbc76f40dd4ed0cf0ea/scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76", size = 24351481, upload-time = "2026-06-19T15:00:11.103Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/3b/6c24bec5be5e743ffd99576daa5cc077722fc7d5bbc00bd133fa0c698dc6/tqdm-4.70.0.tar.gz", hash = "sha256:55b0b0dbd97462d06ebee91e4dac24ed4d4702be82b24f07e6c1d27e08cea220", size = 795438, upload-time = "2026-07-27T11:33:15.271Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/1c/01bfd571a64e7f270e6bab5e33777debe0edc56759233ce84f27dec92d14/tqdm-4.70.0-py3-none-any.whl", hash = "sha256:7f585706bfddbdebf89daac705b2dfcc16890130727d3197ca62c732b4310953", size = 80184, upload-time = "2026-07-27T11:33:13.167Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170, upload-time = "2026-06-29T08:03:40.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115, upload-time = "2026-06-29T08:03:38.666Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "vectorbtpro" +version = "2025.12.31" +source = { git = "ssh://git@github.com/polakowo/vectorbt.pro.git?rev=1305a1e1974325db9382eaeacc6452e9b075ca71#1305a1e1974325db9382eaeacc6452e9b075ca71" } +dependencies = [ + { name = "attrs" }, + { name = "dateparser" }, + { name = "humanize" }, + { name = "imageio" }, + { name = "mypy-extensions" }, + { name = "numba" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "schedule" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "tqdm" }, + { name = "typing-extensions" }, + { name = "websocket-client" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index de843302..6ec9e16a 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -11,7 +11,7 @@ import subprocess import sys import tempfile -from dataclasses import asdict, dataclass +from dataclasses import asdict, dataclass, replace from datetime import UTC, datetime from decimal import ROUND_HALF_EVEN, Decimal from functools import cache @@ -35,6 +35,12 @@ FRAMEWORKS = ("vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean") ACCEPTED_PATH = VALIDATION_DIR / "LARGE_SCALE_RESULTS.json" CANDIDATE_PATH = VALIDATION_DIR / "candidates" / "LARGE_SCALE_RESULTS.candidate.json" +HISTORICAL_ACCEPTED_PATH = VALIDATION_DIR / "vectorbt_pro" / "controlled_replay-2025.12.31.json" +HISTORICAL_CANDIDATE_PATH = VALIDATION_DIR / "candidates" / "vectorbt_pro-2025.12.31.candidate.json" +HISTORICAL_VECTORBT_PRO_VERSION = "2025.12.31" +HISTORICAL_VECTORBT_PRO_COMMIT = "1305a1e1974325db9382eaeacc6452e9b075ca71" +HISTORICAL_VECTORBT_PRO_ENV = ".venv-vectorbt-pro-312" +HISTORICAL_VECTORBT_PRO_PYTHON_ENV_VAR = "ML4T_VECTORBT_PRO_HISTORICAL_PYTHON" @dataclass(frozen=True) @@ -209,7 +215,27 @@ def _actual_target(target: FrameworkTarget) -> dict[str, object]: actual_version = target.version else: actual_version = importlib.metadata.version(target.package) - return {**target.evidence_metadata(), "actual_version": actual_version} + metadata = {**target.evidence_metadata(), "actual_version": actual_version} + if target.package == "vectorbtpro": + distribution = importlib.metadata.distribution(target.package) + direct_url_text = distribution.read_text("direct_url.json") + if direct_url_text is None: + raise RuntimeError("Installed vectorbtpro lacks direct_url.json source provenance") + direct_url = json.loads(direct_url_text) + vcs_info = direct_url.get("vcs_info", {}) + actual_commit = vcs_info.get("commit_id") + if actual_commit != target.source_commit: + raise RuntimeError( + f"Installed vectorbtpro commit {actual_commit!r} does not match declared target " + f"{target.source_commit!r}" + ) + metadata["actual_commit"] = actual_commit + metadata["actual_immutable_id"] = f"git:{actual_commit}" + return metadata + + +def _declared_target_metadata(target: dict[str, Any]) -> dict[str, Any]: + return {key: value for key, value in target.items() if not key.startswith("actual_")} def _framework_run( @@ -284,10 +310,35 @@ def _use_canonical_fill_backed_trades( result.num_trades = len(records) if records is not None else 0 -def run_worker(framework: str, workload: ScaleWorkload = WORKLOAD) -> dict[str, Any]: +def _historical_vectorbt_pro_target() -> FrameworkTarget: + current = load_framework_manifest().targets["vectorbt_pro"] + return replace( + current, + version=HISTORICAL_VECTORBT_PRO_VERSION, + source_commit=HISTORICAL_VECTORBT_PRO_COMMIT, + immutable_id=f"git:{HISTORICAL_VECTORBT_PRO_COMMIT}", + environment=HISTORICAL_VECTORBT_PRO_ENV, + python_env_var=HISTORICAL_VECTORBT_PRO_PYTHON_ENV_VAR, + ) + + +def run_worker( + framework: str, + workload: ScaleWorkload = WORKLOAD, + *, + target_override: FrameworkTarget | None = None, +) -> dict[str, Any]: """Execute one external/ML4T scale pair and retain exact digests.""" manifest = load_framework_manifest() - target = manifest.targets[framework] + target = target_override or manifest.targets[framework] + if target.framework_id != framework: + raise ValueError(f"Target {target.framework_id!r} cannot identify framework {framework!r}") + actual_target = _actual_target(target) + if actual_target["actual_version"] != target.version: + raise RuntimeError( + f"Installed {target.package} version {actual_target['actual_version']} does not match " + f"declared target {target.version}" + ) config = workload.benchmark_config() price_data, signals, dates = suite.generate_benchmark_data(config, seed=workload.seed) raw_digest = input_digest(price_data, signals, dates) @@ -318,7 +369,7 @@ def run_worker(framework: str, workload: ScaleWorkload = WORKLOAD) -> dict[str, comparison["passed"] = bool(comparison["passed"] and terminal_check["passed"]) return { "framework": framework, - "target": _actual_target(target), + "target": actual_target, "python": { "version": sys.version.split()[0], "implementation": sys.implementation.name, @@ -372,6 +423,60 @@ def build_report( } +def _comparison_signature(record: dict[str, Any]) -> dict[str, Any]: + comparison = cast(dict[str, Any], record["comparison"]) + checks = cast(list[dict[str, Any]], comparison["checks"]) + signature: dict[str, Any] = {} + for check in checks: + name = str(check["name"]) + if "expected_sha256" in check: + signature[name] = { + "count": check.get("expected_count"), + "sha256": check["expected_sha256"], + } + else: + signature[name] = check["canonical_expected"] + return signature + + +def build_historical_report( + current_record: dict[str, Any], + historical_record: dict[str, Any], + workload: ScaleWorkload = WORKLOAD, +) -> dict[str, Any]: + """Build evidence that one historical target matches the accepted current target.""" + current_signature = _comparison_signature(current_record) + historical_signature = _comparison_signature(historical_record) + return { + "schema_version": SCHEMA_VERSION, + "generated_at": datetime.now(UTC).isoformat(), + "audit_trigger": { + "ml4t_commit": "488c05d84e74156aba71c4f7ffac28df3881fea9", + "cause": "vectorbt collateral semantics missing from the ML4T comparison profile", + "external_fill_count": 390_369, + "ml4t_fill_count": 418_825, + "external_final_value": 716_785.408089, + "ml4t_final_value": 1_162_222.354417, + }, + "workload": { + "recipe": asdict(workload), + "recipe_sha256": _json_digest(asdict(workload)), + "data_points": workload.data_points, + "generator": "validation.benchmark_suite.generate_benchmark_data", + "redistributable": True, + }, + "current": current_record, + "historical": historical_record, + "framework_output_comparison": { + "current": current_signature, + "historical": historical_signature, + "passed": current_signature == historical_signature, + }, + "release_gate_passed": historical_record.get("comparison", {}).get("passed") is True + and current_signature == historical_signature, + } + + @cache def _expected_input_digest(workload: ScaleWorkload) -> str: config = workload.benchmark_config() @@ -418,11 +523,15 @@ def report_failures(report: dict[str, Any], *, reconstruct_input: bool = False) expected_target = manifest.targets[framework].evidence_metadata() if ( not isinstance(target, dict) - or {key: value for key, value in target.items() if key != "actual_version"} - != expected_target + or _declared_target_metadata(target) != expected_target or target.get("actual_version") != expected_target["version"] ): failures.append(f"{framework} target identity differs") + elif framework == "vectorbt_pro" and ( + target.get("actual_commit") != expected_target["commit"] + or target.get("actual_immutable_id") != expected_target["immutable_id"] + ): + failures.append(f"{framework} installed source identity differs") if record.get("source_digests") != expected_sources: failures.append(f"{framework} source digests differ") ml4t = record.get("ml4t") @@ -501,6 +610,75 @@ def report_failures(report: dict[str, Any], *, reconstruct_input: bool = False) return failures +def historical_report_failures( + report: dict[str, Any], *, reconstruct_input: bool = False +) -> list[str]: + """Return every reason a historical replay candidate cannot be accepted.""" + failures: list[str] = [] + if report.get("schema_version") != SCHEMA_VERSION: + return [f"Unsupported historical replay schema: {report.get('schema_version')!r}"] + workload = report.get("workload") + if not isinstance(workload, dict) or workload.get("recipe") != asdict(WORKLOAD): + failures.append("Historical replay workload recipe differs") + elif workload.get("recipe_sha256") != _json_digest(asdict(WORKLOAD)): + failures.append("Historical replay workload recipe digest differs") + current = report.get("current") + historical = report.get("historical") + if not isinstance(current, dict) or not isinstance(historical, dict): + return failures + ["Historical replay records are missing"] + manifest = load_framework_manifest() + current_target = manifest.targets["vectorbt_pro"].evidence_metadata() + historical_target = _historical_vectorbt_pro_target().evidence_metadata() + for label, record, expected_target in ( + ("current", current, current_target), + ("historical", historical, historical_target), + ): + target = record.get("target") + if ( + not isinstance(target, dict) + or _declared_target_metadata(target) != expected_target + or target.get("actual_version") != expected_target["version"] + ): + failures.append(f"VectorBT Pro {label} target identity differs") + elif ( + target.get("actual_commit") != expected_target["commit"] + or target.get("actual_immutable_id") != expected_target["immutable_id"] + ): + failures.append(f"VectorBT Pro {label} installed source identity differs") + if record.get("source_digests") != _source_digests(): + failures.append(f"VectorBT Pro {label} source digests differ") + ml4t = record.get("ml4t") + if not isinstance(ml4t, dict) or ml4t.get("dirty") is not False: + failures.append(f"VectorBT Pro {label} run used a dirty ML4T tree") + comparison = record.get("comparison") + if not isinstance(comparison, dict) or comparison.get("passed") is not True: + failures.append(f"VectorBT Pro {label} exact comparison did not pass") + input_record = record.get("input") + if not isinstance(input_record, dict): + failures.append(f"VectorBT Pro {label} input evidence is missing") + elif reconstruct_input and input_record.get("raw_sha256") != _expected_input_digest( + WORKLOAD + ): + failures.append(f"VectorBT Pro {label} input digest does not reconstruct") + if current.get("ml4t") != historical.get("ml4t"): + failures.append("Historical replay runs used different ML4T revisions") + if current.get("source_digests") != historical.get("source_digests"): + failures.append("Historical replay runs used different comparison sources") + if current.get("input") != historical.get("input"): + failures.append("Historical replay inputs differ") + output_comparison = report.get("framework_output_comparison") + expected_output_comparison = { + "current": _comparison_signature(current), + "historical": _comparison_signature(historical), + "passed": _comparison_signature(current) == _comparison_signature(historical), + } + if output_comparison != expected_output_comparison or not expected_output_comparison["passed"]: + failures.append("Historical and current VectorBT Pro outputs differ") + if report.get("release_gate_passed") is not True: + failures.append("Historical replay release gate did not pass") + return failures + + def _resolve_python(framework: str) -> Path: target = load_framework_manifest().targets[framework] override = os.getenv(target.python_env_var or "") @@ -511,58 +689,94 @@ def _resolve_python(framework: str) -> Path: return PROJECT_ROOT / target.environment / "bin" / "python" +def _resolve_historical_vectorbt_pro_python() -> Path: + override = os.getenv(HISTORICAL_VECTORBT_PRO_PYTHON_ENV_VAR) + if override: + return Path(override).expanduser().resolve() + return PROJECT_ROOT / HISTORICAL_VECTORBT_PRO_ENV / "bin" / "python" + + +def _run_isolated_worker( + framework: str, + interpreter: Path, + *, + historical_target: bool = False, +) -> dict[str, Any]: + if not interpreter.is_file(): + raise RuntimeError(f"Missing {framework} interpreter: {interpreter}") + with tempfile.TemporaryDirectory(prefix=f"ml4t-scale-{framework}-") as directory: + output = Path(directory) / "record.json" + command = [ + str(interpreter), + str(Path(__file__).resolve()), + "--worker", + framework, + "--output", + str(output), + ] + if historical_target: + command.append("--historical-target") + environment = os.environ.copy() + paths = [str(PROJECT_ROOT / "src"), str(VALIDATION_DIR)] + sibling_specs = PROJECT_ROOT.parent / "ml4t-specs" / "src" + if sibling_specs.is_dir(): + paths.append(str(sibling_specs)) + environment["PYTHONPATH"] = os.pathsep.join( + paths + ([environment["PYTHONPATH"]] if environment.get("PYTHONPATH") else []) + ) + completed = subprocess.run( + command, + cwd=PROJECT_ROOT, + env=environment, + capture_output=True, + text=True, + timeout=3_600, + check=False, + ) + if completed.returncode != 0 or not output.is_file(): + details = (completed.stderr or completed.stdout).strip() + raise RuntimeError(f"{framework} scale worker failed: {details[-20_000:]}") + record = cast(dict[str, Any], json.loads(output.read_text(encoding="utf-8"))) + if record.get("comparison", {}).get("passed") is not True: + raise RuntimeError( + f"{framework} large-scale comparison failed: " + + json.dumps(record.get("comparison"), indent=2)[-20_000:] + ) + return record + + def run_all() -> dict[str, Any]: """Run every framework in its isolated environment and return a candidate report.""" records: list[dict[str, Any]] = [] for framework in FRAMEWORKS: interpreter = _resolve_python(framework) - if not interpreter.is_file(): - raise RuntimeError(f"Missing {framework} interpreter: {interpreter}") - with tempfile.TemporaryDirectory(prefix=f"ml4t-scale-{framework}-") as directory: - output = Path(directory) / "record.json" - command = [ - str(interpreter), - str(Path(__file__).resolve()), - "--worker", - framework, - "--output", - str(output), - ] - print(f"Running {framework} large-scale pair...", flush=True) - environment = os.environ.copy() - paths = [ - str(PROJECT_ROOT / "src"), - str(VALIDATION_DIR), - ] - sibling_specs = PROJECT_ROOT.parent / "ml4t-specs" / "src" - if sibling_specs.is_dir(): - paths.append(str(sibling_specs)) - environment["PYTHONPATH"] = os.pathsep.join( - paths + ([environment["PYTHONPATH"]] if environment.get("PYTHONPATH") else []) - ) - completed = subprocess.run( - command, - cwd=PROJECT_ROOT, - env=environment, - capture_output=True, - text=True, - timeout=3_600, - check=False, - ) - if completed.returncode != 0 or not output.is_file(): - details = (completed.stderr or completed.stdout).strip() - raise RuntimeError(f"{framework} scale worker failed: {details[-20_000:]}") - record = json.loads(output.read_text(encoding="utf-8")) - if record.get("comparison", {}).get("passed") is not True: - raise RuntimeError( - f"{framework} large-scale comparison failed: " - + json.dumps(record.get("comparison"), indent=2)[-20_000:] - ) - records.append(record) - print(f"{framework}: PASS", flush=True) + print(f"Running {framework} large-scale pair...", flush=True) + records.append(_run_isolated_worker(framework, interpreter)) + print(f"{framework}: PASS", flush=True) return build_report(records) +def run_historical_vectorbt_pro() -> dict[str, Any]: + """Replay the historical Pro target and compare it with accepted current evidence.""" + current_report = cast(dict[str, Any], json.loads(ACCEPTED_PATH.read_text(encoding="utf-8"))) + current_failures = report_failures(current_report, reconstruct_input=True) + if current_failures: + raise RuntimeError( + "Current large-scale evidence is not valid: " + "; ".join(current_failures) + ) + current_record = next( + record + for record in cast(list[dict[str, Any]], current_report["frameworks"]) + if record["framework"] == "vectorbt_pro" + ) + historical_record = _run_isolated_worker( + "vectorbt_pro", + _resolve_historical_vectorbt_pro_python(), + historical_target=True, + ) + return build_historical_report(current_record, historical_record) + + def _write_json(path: Path, payload: dict[str, Any]) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8") @@ -592,13 +806,39 @@ def main() -> int: parser.add_argument("--output", type=Path) parser.add_argument("--check", action="store_true") parser.add_argument("--verify-input", action="store_true") + parser.add_argument("--historical-target", action="store_true", help=argparse.SUPPRESS) + parser.add_argument("--historical-vectorbt-pro", action="store_true") + parser.add_argument("--check-historical-vectorbt-pro", action="store_true") args = parser.parse_args() if args.worker: if args.output is None: parser.error("--worker requires --output") - record = run_worker(args.worker) + if args.historical_target and args.worker != "vectorbt_pro": + parser.error("--historical-target requires --worker vectorbt_pro") + target = _historical_vectorbt_pro_target() if args.historical_target else None + record = run_worker(args.worker, target_override=target) _write_json(args.output, record) return 0 if record["comparison"]["passed"] else 1 + if args.historical_target: + parser.error("--historical-target requires --worker vectorbt_pro") + if args.check_historical_vectorbt_pro: + report = json.loads(HISTORICAL_ACCEPTED_PATH.read_text(encoding="utf-8")) + failures = historical_report_failures(report, reconstruct_input=args.verify_input) + for failure in failures: + print(f"- {failure}") + return 1 if failures else 0 + if args.historical_vectorbt_pro: + candidate = run_historical_vectorbt_pro() + _write_json(HISTORICAL_CANDIDATE_PATH, candidate) + failures = historical_report_failures(candidate, reconstruct_input=True) + if failures: + print("Accepted historical evidence unchanged:") + for failure in failures: + print(f"- {failure}") + return 1 + _write_json_atomic(HISTORICAL_ACCEPTED_PATH, candidate) + print(f"Accepted historical evidence: {HISTORICAL_ACCEPTED_PATH}") + return 0 if args.check: report = json.loads(ACCEPTED_PATH.read_text(encoding="utf-8")) failures = report_failures(report, reconstruct_input=args.verify_input) From 9a8122006bd0709066ff1eae2883fe02a9c199e1 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 03:21:51 -0400 Subject: [PATCH 20/44] fix(validation): report scale worker exit status --- validation/large_scale_evidence.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index 6ec9e16a..131f323e 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -734,8 +734,12 @@ def _run_isolated_worker( check=False, ) if completed.returncode != 0 or not output.is_file(): - details = (completed.stderr or completed.stdout).strip() - raise RuntimeError(f"{framework} scale worker failed: {details[-20_000:]}") + details = "\n".join( + stream.strip() for stream in (completed.stdout, completed.stderr) if stream.strip() + ) + raise RuntimeError( + f"{framework} scale worker exited {completed.returncode}: {details[-20_000:]}" + ) record = cast(dict[str, Any], json.loads(output.read_text(encoding="utf-8"))) if record.get("comparison", {}).get("passed") is not True: raise RuntimeError( From 6bec257f2ff5b1f39ebbc24e279b174c65d34300 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 03:43:42 -0400 Subject: [PATCH 21/44] fix(validation): match VectorBT OSS cash arithmetic --- src/ml4t/backtest/broker.py | 4 ++ src/ml4t/backtest/config.py | 20 ++++++ src/ml4t/backtest/core/fill_engine.py | 35 ++++++++- src/ml4t/backtest/execution/fill_executor.py | 60 +++++++++++++++- src/ml4t/backtest/profiles.py | 6 ++ tests/compatibility/snapshots/v0.1.json | 71 ++++++++++++++++++- tests/contracts/test_large_scale_evidence.py | 11 +-- .../test_vectorbt_native_evidence.py | 1 + tests/test_config_wiring.py | 36 ++++++++++ validation/behavior_coverage.toml | 4 +- validation/framework_targets.toml | 2 +- validation/large_scale_evidence.py | 2 +- .../native/evidence/vectorbt_oss-1.1.0.json | 9 ++- .../evidence/vectorbt_pro-2026.6.27.json | 9 ++- validation/native/vectorbt_behavior.py | 16 +++++ 15 files changed, 273 insertions(+), 13 deletions(-) diff --git a/src/ml4t/backtest/broker.py b/src/ml4t/backtest/broker.py index 51f1a328..5ec0b753 100644 --- a/src/ml4t/backtest/broker.py +++ b/src/ml4t/backtest/broker.py @@ -15,6 +15,7 @@ FillOrdering, InitialHwmSource, LateAssetPolicy, + LockNotionalUpdateMode, MissingPricePolicy, ShareType, ShortCashPolicy, @@ -103,6 +104,7 @@ def __init__( fixed_margin_schedule: dict[str, tuple[float, float]] | None = None, margin_pct_schedule: dict[str, tuple[float, float]] | None = None, short_cash_policy: ShortCashPolicy = ShortCashPolicy.CREDIT, + lock_notional_update_mode: LockNotionalUpdateMode = LockNotionalUpdateMode.POSITION_LEGS, execution_limits: ExecutionLimits | None = None, market_impact_model: MarketImpactModel | None = None, contract_specs: dict[str, ContractSpec] | None = None, @@ -214,6 +216,7 @@ def __init__( self.fixed_margin_schedule = effective_margin_schedule self.margin_pct_schedule = effective_margin_pct_schedule self.short_cash_policy = short_cash_policy + self.lock_notional_update_mode = lock_notional_update_mode # Create Gatekeeper for order validation self.gatekeeper = Gatekeeper( @@ -409,6 +412,7 @@ def from_config( fixed_margin_schedule=config.fixed_margin_schedule, margin_pct_schedule=config.margin_pct_schedule, short_cash_policy=config.short_cash_policy, + lock_notional_update_mode=config.lock_notional_update_mode, execution_limits=execution_limits, market_impact_model=market_impact_model, contract_specs=contract_specs, diff --git a/src/ml4t/backtest/config.py b/src/ml4t/backtest/config.py index 6b1b239a..4e97eb47 100644 --- a/src/ml4t/backtest/config.py +++ b/src/ml4t/backtest/config.py @@ -153,6 +153,20 @@ class ShortCashPolicy(str, Enum): LOCK_NOTIONAL = "lock_notional" +class LockNotionalUpdateMode(str, Enum): + """Floating-point operation order for locked-notional cash updates. + + POSITION_LEGS: + Settle closing and opening position legs separately. + + COMBINED_ORDER: + Settle the gross cash and short-debt effects as one order. + """ + + POSITION_LEGS = "position_legs" + COMBINED_ORDER = "combined_order" + + class RebalanceMode(str, Enum): """How portfolio value is computed during multi-asset rebalancing. @@ -504,6 +518,7 @@ class BacktestConfig: fixed_margin_schedule: dict[str, tuple[float, float]] | None = None # For futures margin_pct_schedule: dict[str, tuple[float, float]] | None = None # Price-aware futures margin short_cash_policy: ShortCashPolicy = ShortCashPolicy.CREDIT + lock_notional_update_mode: LockNotionalUpdateMode = LockNotionalUpdateMode.POSITION_LEGS # === Execution Timing === execution_price: ExecutionPrice = ExecutionPrice.OPEN @@ -879,6 +894,7 @@ def to_dict(self) -> dict: "fixed_margin_schedule": _margin_schedule_to_dict(self.fixed_margin_schedule), "margin_pct_schedule": _margin_schedule_to_dict(self.margin_pct_schedule), "short_cash_policy": self.short_cash_policy.value, + "lock_notional_update_mode": self.lock_notional_update_mode.value, }, "execution": { "execution_price": self.execution_price.value, @@ -995,6 +1011,7 @@ def from_dict( "fixed_margin_schedule", "margin_pct_schedule", "short_cash_policy", + "lock_notional_update_mode", }, "execution": {"execution_price", "mark_price", "execution_mode"}, "stops": { @@ -1119,6 +1136,9 @@ def from_dict( fixed_margin_schedule=acct_cfg.get("fixed_margin_schedule"), margin_pct_schedule=acct_cfg.get("margin_pct_schedule"), short_cash_policy=ShortCashPolicy(acct_cfg.get("short_cash_policy", "credit")), + lock_notional_update_mode=LockNotionalUpdateMode( + acct_cfg.get("lock_notional_update_mode", "position_legs") + ), # Execution execution_price=ExecutionPrice( exec_cfg.get("execution_price", ExecutionPrice.OPEN.value) diff --git a/src/ml4t/backtest/core/fill_engine.py b/src/ml4t/backtest/core/fill_engine.py index d3cb826a..a29b440b 100644 --- a/src/ml4t/backtest/core/fill_engine.py +++ b/src/ml4t/backtest/core/fill_engine.py @@ -5,7 +5,7 @@ from dataclasses import replace from typing import TYPE_CHECKING -from ..config import ExecutionPrice, ShareType +from ..config import ExecutionPrice, LockNotionalUpdateMode, ShareType from ..models import calculate_commission from ..types import OrderSide, OrderType from .shared import CASH_TOLERANCE, add_with_zero_cancellation @@ -124,6 +124,39 @@ def _get_lock_notional_zero_cost_limit(self, order, fill_price: float) -> float multiplier = broker.get_multiplier(order.asset) unit_cost = fill_price * multiplier + if broker.lock_notional_update_mode is LockNotionalUpdateMode.COMBINED_ORDER: + if order.side is OrderSide.BUY and current_quantity < 0.0: + short_quantity = abs(current_quantity) + short_basis = broker.account._lock_notional_short_basis.get(order.asset, 0.0) + cover_required = short_quantity * unit_cost + cover_free_cash = add_with_zero_cancellation( + free_cash + 2 * short_basis, + -cover_required, + ) + if cover_free_cash > 0.0: + cash_limit = free_cash + 2 * short_basis + elif cover_free_cash < 0.0: + average_entry = short_basis / short_quantity + denominator = unit_cost - 2 * average_entry + if denominator == 0.0: + return 0.0 + max_short_size = free_cash / denominator + cash_limit = max_short_size * unit_cost + else: + cash_limit = broker.cash + return max(0.0, min(cash_limit, broker.cash) / unit_cost) + + if order.side is OrderSide.SELL: + long_quantity = max(current_quantity, 0.0) + long_cash = long_quantity * unit_cost + total_free_cash = add_with_zero_cancellation(free_cash, long_cash) + if total_free_cash <= 0.0: + return long_quantity if current_quantity > 0.0 else 0.0 + max_short_size = total_free_cash / unit_cost + return add_with_zero_cancellation(long_quantity, max_short_size) + + return max(0.0, free_cash / unit_cost) + if order.side is OrderSide.BUY and current_quantity < 0.0: short_quantity = abs(current_quantity) short_basis = broker.account._lock_notional_short_basis.get(order.asset, 0.0) diff --git a/src/ml4t/backtest/execution/fill_executor.py b/src/ml4t/backtest/execution/fill_executor.py index 56287bb9..27d0ebca 100644 --- a/src/ml4t/backtest/execution/fill_executor.py +++ b/src/ml4t/backtest/execution/fill_executor.py @@ -13,7 +13,7 @@ from datetime import datetime from typing import TYPE_CHECKING -from ..config import InitialHwmSource, ShareType +from ..config import InitialHwmSource, LockNotionalUpdateMode, ShareType from ..core.shared import add_with_zero_cancellation, quantity_zero_tolerance from ..core.state import ExecutionJournal, MarketState, OrderState, RiskState from ..models import calculate_commission, calculate_slippage @@ -353,6 +353,14 @@ def _update_lock_notional_free_cash( if policy.allow_leverage or policy.short_cash_policy != "lock_notional": return + if broker.lock_notional_update_mode is LockNotionalUpdateMode.COMBINED_ORDER: + self._update_combined_lock_notional_cash( + ctx, + old_quantity=old_quantity, + commission=commission, + ) + return + remaining = ctx.signed_qty free_cash = self.account._lock_notional_free_cash multiplier = broker.get_multiplier(ctx.order.asset) @@ -397,6 +405,55 @@ def _update_lock_notional_free_cash( self.account._lock_notional_free_cash = add_with_zero_cancellation(free_cash, -commission) + def _update_combined_lock_notional_cash( + self, + ctx: FillContext, + *, + old_quantity: float, + commission: float, + ) -> None: + """Settle locked collateral in VectorBT OSS combined-order operation order.""" + broker = self.broker + asset = ctx.order.asset + free_cash = self.account._lock_notional_free_cash + short_basis = self.account._lock_notional_short_basis.get(asset, 0.0) + unit_cost = ctx.fill_price * broker.get_multiplier(asset) + fill_quantity = abs(ctx.signed_qty) + + if ctx.signed_qty > 0.0: + required_cash = add_with_zero_cancellation(fill_quantity * unit_cost, commission) + if old_quantity < 0.0: + covered = min(fill_quantity, abs(old_quantity)) + average_entry = short_basis / abs(old_quantity) + released_basis = covered * average_entry + free_cash = add_with_zero_cancellation( + free_cash + 2 * released_basis, + -required_cash, + ) + new_basis = add_with_zero_cancellation(short_basis, -released_basis) + if old_quantity + covered < 0.0: + self.account._lock_notional_short_basis[asset] = new_basis + else: + self.account._lock_notional_short_basis.pop(asset, None) + else: + free_cash = add_with_zero_cancellation(free_cash, -required_cash) + else: + acquired_cash = add_with_zero_cancellation(fill_quantity * unit_cost, -commission) + new_quantity = old_quantity - fill_quantity + if new_quantity < 0.0: + short_quantity = fill_quantity if old_quantity < 0.0 else abs(new_quantity) + short_value = short_quantity * unit_cost + self.account._lock_notional_short_basis[asset] = short_basis + short_value + free_cash_difference = add_with_zero_cancellation( + acquired_cash, + -2 * short_value, + ) + free_cash = add_with_zero_cancellation(free_cash, free_cash_difference) + else: + free_cash = free_cash + acquired_cash + + self.account._lock_notional_free_cash = free_cash + @staticmethod def _validate_execution_price(value: float, *, source: str) -> None: if not math.isfinite(value) or value <= 0.0: @@ -460,6 +517,7 @@ def _get_lock_notional_flip_quantity( or broker.account.policy.allow_leverage or broker.cash_buffer_pct != 0.0 or ctx.commission != 0.0 + or broker.lock_notional_update_mode is LockNotionalUpdateMode.COMBINED_ORDER ): return fallback diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index f988b100..ae9da55d 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -100,6 +100,7 @@ "allow_short_selling": True, "allow_leverage": False, "short_cash_policy": "credit", + "lock_notional_update_mode": "position_legs", }, "execution": { "execution_price": "close", @@ -287,6 +288,9 @@ VECTORBT_STRICT_PROFILE["orders"]["fill_ordering"] = "fifo" VECTORBT_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" +VECTORBT_OSS_STRICT_PROFILE = deepcopy(VECTORBT_STRICT_PROFILE) +VECTORBT_OSS_STRICT_PROFILE["account"]["lock_notional_update_mode"] = "combined_order" + BACKTRADER_STRICT_PROFILE = deepcopy(BACKTRADER_PROFILE) BACKTRADER_STRICT_PROFILE["orders"]["entry_order_priority"] = "submission" BACKTRADER_STRICT_PROFILE["orders"]["next_bar_submission_precheck"] = True @@ -399,6 +403,7 @@ "realistic": REALISTIC_PROFILE, "ibkr_us_stocks_fixed": IBKR_US_STOCKS_FIXED_PROFILE, "vectorbt_strict": VECTORBT_STRICT_PROFILE, + "vectorbt_oss_strict": VECTORBT_OSS_STRICT_PROFILE, "backtrader_strict": BACKTRADER_STRICT_PROFILE, "zipline_strict": ZIPLINE_STRICT_PROFILE, } @@ -409,6 +414,7 @@ "quantconnect": "lean", "ibkr:us:stocks:fixed": "ibkr_us_stocks_fixed", "vectorbt_compare": "vectorbt_strict", + "vectorbt_oss_compare": "vectorbt_oss_strict", "backtrader_compare": "backtrader_strict", "zipline_compare": "zipline_strict", "lean_compare": "lean", diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index ff1d72fc..485ea71e 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -71,6 +71,15 @@ "keyword_only": false, "name": "short_cash_policy" }, + { + "annotation": "LockNotionalUpdateMode", + "default": { + "enum": "ml4t.backtest.config.LockNotionalUpdateMode.POSITION_LEGS", + "value": "position_legs" + }, + "keyword_only": false, + "name": "lock_notional_update_mode" + }, { "annotation": "ExecutionPrice", "default": { @@ -458,6 +467,7 @@ "allow_short_selling": false, "fixed_margin_schedule": null, "initial_margin": 0.5, + "lock_notional_update_mode": "position_legs", "long_maintenance_margin": 0.25, "margin_pct_schedule": null, "short_cash_policy": "credit", @@ -777,6 +787,16 @@ "value": "require_history" } ], + "ml4t.backtest.config.LockNotionalUpdateMode": [ + { + "name": "POSITION_LEGS", + "value": "position_legs" + }, + { + "name": "COMBINED_ORDER", + "value": "combined_order" + } + ], "ml4t.backtest.config.MissingPricePolicy": [ { "name": "SKIP", @@ -1198,6 +1218,7 @@ "quantconnect": "lean", "vectorbt_compare": "vectorbt_strict", "vectorbt_oss": "vectorbt", + "vectorbt_oss_compare": "vectorbt_oss_strict", "vectorbt_pro": "vectorbt", "zipline_compare": "zipline_strict" }, @@ -1523,6 +1544,7 @@ "account": { "allow_leverage": false, "allow_short_selling": true, + "lock_notional_update_mode": "position_legs", "short_cash_policy": "credit" }, "cash": { @@ -1564,10 +1586,57 @@ "trail_stop_timing": "intrabar" } }, + "vectorbt_oss_strict": { + "account": { + "allow_leverage": false, + "allow_short_selling": true, + "lock_notional_update_mode": "combined_order", + "short_cash_policy": "lock_notional" + }, + "cash": { + "buffer_pct": 0.0, + "initial": 100000.0 + }, + "commission": { + "model": "none", + "rate": 0.0 + }, + "execution": { + "execution_mode": "same_bar", + "execution_price": "close" + }, + "orders": { + "entry_order_priority": "submission", + "fill_ordering": "fifo", + "immediate_fill": true, + "late_asset_min_bars": 1, + "late_asset_policy": "allow", + "missing_price_policy": "skip", + "partial_fills_allowed": true, + "rebalance_headroom_pct": 1.0, + "rebalance_mode": "hybrid", + "reject_on_insufficient_cash": true + }, + "position_sizing": { + "share_type": "fractional" + }, + "slippage": { + "model": "none", + "rate": 0.0 + }, + "stops": { + "initial_hwm_source": "bar_high", + "stop_fill_mode": "stop_price", + "stop_level_basis": "fill_price", + "trail_hwm_source": "bar_extreme", + "trail_stop_timing": "intrabar" + } + }, "vectorbt_strict": { "account": { "allow_leverage": false, "allow_short_selling": true, + "lock_notional_update_mode": "position_legs", "short_cash_policy": "lock_notional" }, "cash": { @@ -3622,7 +3691,7 @@ }, "module": "ml4t.backtest.broker", "qualname": "Broker", - "signature": "(initial_cash: 'float' = 100000.0, commission_model: 'CommissionModel | None' = None, slippage_model: 'SlippageModel | None' = None, stop_slippage_rate: 'float' = 0.0, execution_mode: 'ExecutionMode' = , execution_price: 'ExecutionPrice' = , mark_price: 'ExecutionPrice' = , stop_fill_mode: 'StopFillMode' = , stop_level_basis: 'StopLevelBasis' = , trail_hwm_source: 'WaterMarkSource' = , trail_include_entry_bar_extremes: 'bool' = False, initial_hwm_source: 'InitialHwmSource' = , trail_stop_timing: 'TrailStopTiming' = , allow_short_selling: 'bool' = False, allow_leverage: 'bool' = False, initial_margin: 'float' = 0.5, long_maintenance_margin: 'float' = 0.25, short_maintenance_margin: 'float' = 0.3, fixed_margin_schedule: 'dict[str, tuple[float, float]] | None' = None, margin_pct_schedule: 'dict[str, tuple[float, float]] | None' = None, short_cash_policy: 'ShortCashPolicy' = , execution_limits: 'ExecutionLimits | None' = None, market_impact_model: 'MarketImpactModel | None' = None, contract_specs: 'dict[str, ContractSpec] | None' = None, share_type: 'ShareType' = , fill_ordering: 'FillOrdering' = , entry_order_priority: 'EntryOrderPriority' = , next_bar_submission_precheck: 'bool' = False, next_bar_simple_cash_check: 'bool' = False, buying_power_reservation: 'bool' = False, next_bar_queue_shadow_validation: 'bool' = False, immediate_fill: 'bool' = False, reject_on_insufficient_cash: 'bool' = True, skip_cash_validation: 'bool' = False, cash_buffer_pct: 'float' = 0.0, partial_fills_allowed: 'bool' = False, rebalance_headroom_pct: 'float' = 1.0, missing_price_policy: 'MissingPricePolicy' = , late_asset_policy: 'LateAssetPolicy' = , late_asset_min_bars: 'int' = 1, settlement_delay: 'int' = 0, settlement_reduces_buying_power: 'bool' = True)" + "signature": "(initial_cash: 'float' = 100000.0, commission_model: 'CommissionModel | None' = None, slippage_model: 'SlippageModel | None' = None, stop_slippage_rate: 'float' = 0.0, execution_mode: 'ExecutionMode' = , execution_price: 'ExecutionPrice' = , mark_price: 'ExecutionPrice' = , stop_fill_mode: 'StopFillMode' = , stop_level_basis: 'StopLevelBasis' = , trail_hwm_source: 'WaterMarkSource' = , trail_include_entry_bar_extremes: 'bool' = False, initial_hwm_source: 'InitialHwmSource' = , trail_stop_timing: 'TrailStopTiming' = , allow_short_selling: 'bool' = False, allow_leverage: 'bool' = False, initial_margin: 'float' = 0.5, long_maintenance_margin: 'float' = 0.25, short_maintenance_margin: 'float' = 0.3, fixed_margin_schedule: 'dict[str, tuple[float, float]] | None' = None, margin_pct_schedule: 'dict[str, tuple[float, float]] | None' = None, short_cash_policy: 'ShortCashPolicy' = , lock_notional_update_mode: 'LockNotionalUpdateMode' = , execution_limits: 'ExecutionLimits | None' = None, market_impact_model: 'MarketImpactModel | None' = None, contract_specs: 'dict[str, ContractSpec] | None' = None, share_type: 'ShareType' = , fill_ordering: 'FillOrdering' = , entry_order_priority: 'EntryOrderPriority' = , next_bar_submission_precheck: 'bool' = False, next_bar_simple_cash_check: 'bool' = False, buying_power_reservation: 'bool' = False, next_bar_queue_shadow_validation: 'bool' = False, immediate_fill: 'bool' = False, reject_on_insufficient_cash: 'bool' = True, skip_cash_validation: 'bool' = False, cash_buffer_pct: 'float' = 0.0, partial_fills_allowed: 'bool' = False, rebalance_headroom_pct: 'float' = 1.0, missing_price_policy: 'MissingPricePolicy' = , late_asset_policy: 'LateAssetPolicy' = , late_asset_min_bars: 'int' = 1, settlement_delay: 'int' = 0, settlement_reduces_buying_power: 'bool' = True)" }, "ml4t.backtest:CommissionType": { "kind": "class", diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py index 94258cc9..6f7d21f4 100644 --- a/tests/contracts/test_large_scale_evidence.py +++ b/tests/contracts/test_large_scale_evidence.py @@ -119,9 +119,12 @@ def test_input_digest_is_independent_of_datetime_resolution() -> None: assert module.input_digest(converted_prices, converted_signals, converted_dates) == expected -@pytest.mark.parametrize("framework", ["vectorbt_pro", "vectorbt_oss"]) -def test_vectorbt_scale_pairs_use_the_collateral_aware_strict_profile( - framework: str, monkeypatch: pytest.MonkeyPatch +@pytest.mark.parametrize( + ("framework", "expected_profile"), + [("vectorbt_pro", "vectorbt_strict"), ("vectorbt_oss", "vectorbt_oss_strict")], +) +def test_vectorbt_scale_pairs_use_version_specific_collateral_profiles( + framework: str, expected_profile: str, monkeypatch: pytest.MonkeyPatch ) -> None: module = _load_module() captured: dict[str, object] = {} @@ -141,7 +144,7 @@ def capture_ml4t(*args, **kwargs): result = module._framework_run(framework, object(), {}, pd.DataFrame(), pd.DatetimeIndex([])) assert result == ("external", "ml4t") - assert captured["profile_override"] == "vectorbt_strict" + assert captured["profile_override"] == expected_profile def test_scale_trade_surface_is_reconstructed_from_canonical_fills() -> None: diff --git a/tests/contracts/test_vectorbt_native_evidence.py b/tests/contracts/test_vectorbt_native_evidence.py index 86b38958..314a2183 100644 --- a/tests/contracts/test_vectorbt_native_evidence.py +++ b/tests/contracts/test_vectorbt_native_evidence.py @@ -19,6 +19,7 @@ "fees_and_slippage", "insufficient_cash_partial_fill", "integer_signal_dtype", + "lock_notional_update_arithmetic", "long_signal_conflict", "missing_order_price", "record_construction", diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index 53e5a908..6b68cf73 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -26,6 +26,7 @@ ExecutionPrice, FillOrdering, LateAssetPolicy, + LockNotionalUpdateMode, MissingPricePolicy, ShareType, ShortCashPolicy, @@ -410,6 +411,41 @@ def test_vectorbt_strict_profile_preserves_native_cash_semantics(self): assert config.entry_order_priority == EntryOrderPriority.SUBMISSION assert get_profile_config("vectorbt_strict") != get_profile_config("vectorbt") + def test_vectorbt_oss_strict_uses_combined_order_cash_updates(self): + pro = BacktestConfig.from_preset("vectorbt_strict") + oss = BacktestConfig.from_preset("vectorbt_oss_strict") + + assert pro.lock_notional_update_mode is LockNotionalUpdateMode.POSITION_LEGS + assert oss.lock_notional_update_mode is LockNotionalUpdateMode.COMBINED_ORDER + + def test_lock_notional_update_modes_reproduce_native_cover_arithmetic(self): + initial_cash = 800_928.6801081297 + entry_price = 445.1764349947099 + short_quantity = 935.6511349828165 + cover_quantity = 822.3137995772428 + cover_price = 98.35685542114634 + + results = {} + for mode in LockNotionalUpdateMode: + broker = _make_broker( + initial_cash=initial_cash, + short_cash_policy=ShortCashPolicy.LOCK_NOTIONAL, + lock_notional_update_mode=mode, + share_type=ShareType.FRACTIONAL, + reject_on_insufficient_cash=True, + partial_fills_allowed=True, + ) + _set_prices(broker, {"A": entry_price}) + broker.submit_order("A", short_quantity, OrderSide.SELL) + broker._process_orders() + _set_prices(broker, {"A": cover_price}, ts=datetime(2024, 1, 2)) + broker.submit_order("A", cover_quantity, OrderSide.BUY) + broker._process_orders() + results[mode] = broker.account._lock_notional_free_cash + + assert results[LockNotionalUpdateMode.POSITION_LEGS] == 1_035_668.0954273958 + assert results[LockNotionalUpdateMode.COMBINED_ORDER] == 1_035_668.0954273955 + def test_zipline_strict_profile_uses_credit(self): config = BacktestConfig.from_preset("zipline_strict") assert config.short_cash_policy == ShortCashPolicy.CREDIT diff --git a/validation/behavior_coverage.toml b/validation/behavior_coverage.toml index 36505f65..3467f190 100644 --- a/validation/behavior_coverage.toml +++ b/validation/behavior_coverage.toml @@ -9,8 +9,8 @@ published = true [[framework.vectorbt]] name = "direction" -fields = ["account.allow_short_selling", "account.short_cash_policy"] -native_checks = ["short_cash"] +fields = ["account.allow_short_selling", "account.short_cash_policy", "account.lock_notional_update_mode"] +native_checks = ["short_cash", "lock_notional_update_arithmetic"] scenarios = ["02", "11", "12"] published = true diff --git a/validation/framework_targets.toml b/validation/framework_targets.toml index 18b813c2..8bc16c42 100644 --- a/validation/framework_targets.toml +++ b/validation/framework_targets.toml @@ -24,7 +24,7 @@ unsupported_scenarios = 0 display_name = "VectorBT OSS" package = "vectorbt" version = "1.1.0" -profile = "vectorbt" +profile = "vectorbt_oss_strict" python = ">=3.11,<3.15" license = "Apache-2.0 WITH Commons-Clause" access = "public" diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index 131f323e..abfee72b 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -263,7 +263,7 @@ def _framework_run( signals, dates, execution_mode="same_bar", - profile_override="vectorbt_strict", + profile_override="vectorbt_oss_strict", ) elif framework == "backtrader": external = suite.benchmark_backtrader(config, price_data, signals, dates) diff --git a/validation/native/evidence/vectorbt_oss-1.1.0.json b/validation/native/evidence/vectorbt_oss-1.1.0.json index 5bbc0232..b45cca60 100644 --- a/validation/native/evidence/vectorbt_oss-1.1.0.json +++ b/validation/native/evidence/vectorbt_oss-1.1.0.json @@ -154,6 +154,13 @@ "passed": true, "source": "from_orders" }, + { + "actual": 1035668.0954273955, + "expected": 1035668.0954273955, + "id": "lock_notional_update_arithmetic", + "passed": true, + "source": "from_orders" + }, { "actual": { "default_orders": 1, @@ -340,7 +347,7 @@ } ], "framework": "vectorbt_oss", - "oracle_sha256": "47a21499702d7e47761b76c7f7104da8db1e124b27b43957716d175f7b32fd80", + "oracle_sha256": "e3a002a1924a371cdf5b9f61eae13942ac371ad13d6f55125dd545c243a88bc8", "package": "vectorbt", "passed": true, "schema_version": 1, diff --git a/validation/native/evidence/vectorbt_pro-2026.6.27.json b/validation/native/evidence/vectorbt_pro-2026.6.27.json index a71d00a8..7e6d20f2 100644 --- a/validation/native/evidence/vectorbt_pro-2026.6.27.json +++ b/validation/native/evidence/vectorbt_pro-2026.6.27.json @@ -154,6 +154,13 @@ "passed": true, "source": "from_orders" }, + { + "actual": 1035668.0954273958, + "expected": 1035668.0954273958, + "id": "lock_notional_update_arithmetic", + "passed": true, + "source": "from_orders" + }, { "actual": { "default_orders": 1, @@ -340,7 +347,7 @@ } ], "framework": "vectorbt_pro", - "oracle_sha256": "47a21499702d7e47761b76c7f7104da8db1e124b27b43957716d175f7b32fd80", + "oracle_sha256": "e3a002a1924a371cdf5b9f61eae13942ac371ad13d6f55125dd545c243a88bc8", "package": "vectorbtpro", "passed": true, "schema_version": 1, diff --git a/validation/native/vectorbt_behavior.py b/validation/native/vectorbt_behavior.py index 14295600..918a27d2 100644 --- a/validation/native/vectorbt_behavior.py +++ b/validation/native/vectorbt_behavior.py @@ -196,6 +196,16 @@ def _behavior_checks(framework: str, vbt: Any) -> list[tuple[str, Any, Any]]: cash_sharing=True, **collateral_kwargs, ) + arithmetic_pf = vbt.Portfolio.from_orders( + np.asarray([445.1764349947099, 98.35685542114634]), + size=np.asarray([-935.6511349828165, 822.3137995772428]), + size_type="amount", + init_cash=800_928.6801081297, + log=True, + **collateral_kwargs, + ) + arithmetic_logs = arithmetic_pf.logs.records_readable.to_dict("records") + new_free_cash_key = "[ST1] Free Cash" if framework == "vectorbt_pro" else "New Free Cash" accumulate_default = vbt.Portfolio.from_signals( close, entries=_bool([1, 1, 0]), exits=False, size=1, init_cash=1_000 ) @@ -335,6 +345,11 @@ def _behavior_checks(framework: str, vbt: Any) -> list[tuple[str, Any, Any]]: ], }, ), + ( + "lock_notional_update_arithmetic", + arithmetic_logs[-1][new_free_cash_key], + 1_035_668.0954273958 if framework == "vectorbt_pro" else 1_035_668.0954273955, + ), ( "accumulation", { @@ -442,6 +457,7 @@ def run(framework: str) -> dict[str, Any]: "target_percent_sizing", "cash_sharing_and_call_sequence", "cash_sharing_short_collateral", + "lock_notional_update_arithmetic", } else "from_signals", } From 2966cd56e62e01a24affb6ef665e41f780d71024 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 04:13:19 -0400 Subject: [PATCH 22/44] fix(validation): retain failed scale diagnostics --- tests/contracts/test_large_scale_evidence.py | 27 ++++++++++++++++++++ validation/large_scale_evidence.py | 27 ++++++++++++++------ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py index 6f7d21f4..5179d79a 100644 --- a/tests/contracts/test_large_scale_evidence.py +++ b/tests/contracts/test_large_scale_evidence.py @@ -5,6 +5,7 @@ import copy import importlib.util import json +import subprocess import sys from pathlib import Path @@ -257,3 +258,29 @@ def test_accepted_write_is_atomic(tmp_path: Path) -> None: assert json.loads(target.read_text(encoding="utf-8")) == {"value": 1} assert list(tmp_path.iterdir()) == [target] + + +def test_failed_worker_comparison_is_retained( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch +) -> None: + module = _load_module() + interpreter = tmp_path / "python" + interpreter.touch() + monkeypatch.setattr(module, "CANDIDATE_DIR", tmp_path / "candidates") + record = { + "framework": "backtrader", + "comparison": {"passed": False, "first_difference": {"name": "fills"}}, + } + + def failed_run(command, **_kwargs): + output = Path(command[command.index("--output") + 1]) + output.write_text(json.dumps(record), encoding="utf-8") + return subprocess.CompletedProcess(command, 1, stdout="", stderr="") + + monkeypatch.setattr(module.subprocess, "run", failed_run) + + with pytest.raises(RuntimeError, match="diagnostic retained"): + module._run_isolated_worker("backtrader", interpreter) + + retained = tmp_path / "candidates" / "backtrader.large_scale.candidate.json" + assert json.loads(retained.read_text(encoding="utf-8")) == record diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index abfee72b..b075443a 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -34,7 +34,8 @@ MONEY_QUANTUM = Decimal("0.000001") FRAMEWORKS = ("vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean") ACCEPTED_PATH = VALIDATION_DIR / "LARGE_SCALE_RESULTS.json" -CANDIDATE_PATH = VALIDATION_DIR / "candidates" / "LARGE_SCALE_RESULTS.candidate.json" +CANDIDATE_DIR = VALIDATION_DIR / "candidates" +CANDIDATE_PATH = CANDIDATE_DIR / "LARGE_SCALE_RESULTS.candidate.json" HISTORICAL_ACCEPTED_PATH = VALIDATION_DIR / "vectorbt_pro" / "controlled_replay-2025.12.31.json" HISTORICAL_CANDIDATE_PATH = VALIDATION_DIR / "candidates" / "vectorbt_pro-2025.12.31.candidate.json" HISTORICAL_VECTORBT_PRO_VERSION = "2025.12.31" @@ -733,19 +734,29 @@ def _run_isolated_worker( timeout=3_600, check=False, ) - if completed.returncode != 0 or not output.is_file(): + record: dict[str, Any] | None = None + if output.is_file(): + try: + loaded = json.loads(output.read_text(encoding="utf-8")) + record = cast(dict[str, Any], loaded) if isinstance(loaded, dict) else None + except json.JSONDecodeError: + record = None + if record is not None and ( + completed.returncode != 0 or record.get("comparison", {}).get("passed") is not True + ): + diagnostic_path = CANDIDATE_DIR / f"{framework}.large_scale.candidate.json" + _write_json_atomic(diagnostic_path, record) + raise RuntimeError( + f"{framework} large-scale comparison failed; diagnostic retained at " + f"{diagnostic_path}: " + json.dumps(record.get("comparison"), indent=2)[-20_000:] + ) + if completed.returncode != 0 or record is None: details = "\n".join( stream.strip() for stream in (completed.stdout, completed.stderr) if stream.strip() ) raise RuntimeError( f"{framework} scale worker exited {completed.returncode}: {details[-20_000:]}" ) - record = cast(dict[str, Any], json.loads(output.read_text(encoding="utf-8"))) - if record.get("comparison", {}).get("passed") is not True: - raise RuntimeError( - f"{framework} large-scale comparison failed: " - + json.dumps(record.get("comparison"), indent=2)[-20_000:] - ) return record From 03cdd57bc955dc2b761fe25ac86d1920dc6647d9 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 04:47:47 -0400 Subject: [PATCH 23/44] fix(validation): match Backtrader gap reversals --- src/ml4t/backtest/core/execution_engine.py | 10 +- .../test_backtrader_native_evidence.py | 2 + tests/test_config_wiring.py | 78 ++++++++++++++ validation/behavior_coverage.toml | 4 +- validation/native/backtrader_behavior.py | 101 ++++++++++++++++++ .../evidence/backtrader-1.9.78.123.json | 78 +++++++++++++- 6 files changed, 269 insertions(+), 4 deletions(-) diff --git a/src/ml4t/backtest/core/execution_engine.py b/src/ml4t/backtest/core/execution_engine.py index 4a8893e4..bac3e097 100644 --- a/src/ml4t/backtest/core/execution_engine.py +++ b/src/ml4t/backtest/core/execution_engine.py @@ -683,7 +683,15 @@ def _passes_simple_cash_check(self, order, fill_price: float) -> bool: broker.commission_model, order.asset, order.quantity, fill_price ) projected_cash = broker.cash - signed_qty * fill_price - commission - return projected_cash >= 0.0 + if projected_cash >= 0.0: + return True + + # Backtrader executes the closing leg of a reversal after an + # opening-price gap, even when that close leaves cash negative. + if is_opposite and order.quantity > abs(current_qty): + order.quantity = abs(current_qty) + return True + return False def _cleanup_filled_orders(self, filled_orders: list) -> None: filled_ids = {o.order_id for o in filled_orders} diff --git a/tests/contracts/test_backtrader_native_evidence.py b/tests/contracts/test_backtrader_native_evidence.py index 1116aaf4..28c236a4 100644 --- a/tests/contracts/test_backtrader_native_evidence.py +++ b/tests/contracts/test_backtrader_native_evidence.py @@ -16,8 +16,10 @@ "commission_headroom", "defaults", "final_bar_market_order", + "gap_reversal_executes_close_leg_despite_margin", "integer_target_percent", "late_feed_start", + "losing_short_cover_submission_rejection", "missing_bar_uses_last_value", "next_bar_open_and_gap", "short_cash", diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index 6b68cf73..dd92f8f3 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -262,6 +262,84 @@ def test_next_bar_submission_precheck_uses_sequential_shadow_cash(self): assert first.status.value != "rejected" assert second.status.value == "rejected" + def test_backtrader_precheck_rejects_unaffordable_short_cover(self): + broker = _make_broker( + initial_cash=100.0, + execution_mode=ExecutionMode.NEXT_BAR, + next_bar_submission_precheck=True, + next_bar_simple_cash_check=True, + share_type=ShareType.INTEGER, + reject_on_insufficient_cash=True, + ) + ts = datetime(2024, 1, 2) + _set_prices(broker, {"AAPL": 250.0}, ts=ts) + broker.cash = 200.0 + broker.positions["AAPL"] = Position( + asset="AAPL", + quantity=-1.0, + entry_price=100.0, + entry_time=ts, + current_price=250.0, + ) + + order = broker.submit_order("AAPL", 1, OrderSide.BUY) + + assert order is not None + assert order.status.value == "rejected" + assert order.rejection_code == "insufficient_cash" + + def test_backtrader_gap_reversal_executes_only_the_close_leg(self): + broker = _make_broker( + initial_cash=100.0, + execution_mode=ExecutionMode.NEXT_BAR, + next_bar_submission_precheck=True, + next_bar_simple_cash_check=True, + share_type=ShareType.INTEGER, + fill_ordering=FillOrdering.FIFO, + reject_on_insufficient_cash=True, + ) + broker._update_time( + timestamp=datetime(2024, 1, 1), + prices={"AAPL": 100.0}, + opens={"AAPL": 100.0}, + volumes={"AAPL": 1_000.0}, + highs={"AAPL": 100.0}, + lows={"AAPL": 100.0}, + signals={}, + ) + short_order = broker.submit_order("AAPL", 1, OrderSide.SELL) + + broker._update_time( + timestamp=datetime(2024, 1, 2), + prices={"AAPL": 90.0}, + opens={"AAPL": 100.0}, + volumes={"AAPL": 1_000.0}, + highs={"AAPL": 100.0}, + lows={"AAPL": 90.0}, + signals={}, + ) + broker._process_orders(use_open=True) + reversal = broker.submit_order("AAPL", 2, OrderSide.BUY) + + broker._update_time( + timestamp=datetime(2024, 1, 3), + prices={"AAPL": 250.0}, + opens={"AAPL": 250.0}, + volumes={"AAPL": 1_000.0}, + highs={"AAPL": 250.0}, + lows={"AAPL": 250.0}, + signals={}, + ) + broker._process_orders(use_open=True) + + assert short_order is not None + assert reversal is not None + assert [fill.quantity for fill in broker.fills] == [1.0, 1.0] + assert broker.get_position("AAPL") is None + assert broker.cash == -50.0 + assert reversal.requested_quantity == 2.0 + assert reversal.filled_quantity == 1.0 + def test_margin_submission_precheck_allows_reversal_after_close_proceeds(self): broker = _make_broker( initial_cash=1_000_000.0, diff --git a/validation/behavior_coverage.toml b/validation/behavior_coverage.toml index 3467f190..4cfe59fe 100644 --- a/validation/behavior_coverage.toml +++ b/validation/behavior_coverage.toml @@ -107,10 +107,10 @@ reason = "The scenario matrix submits fixed integer quantities and does not test [[framework.backtrader]] name = "buying_power" fields = ["account.allow_leverage", "orders.reject_on_insufficient_cash", "orders.partial_fills_allowed"] -native_checks = ["cash_rejection_and_configured_leverage"] +native_checks = ["cash_rejection_and_configured_leverage", "losing_short_cover_submission_rejection", "gap_reversal_executes_close_leg_despite_margin"] scenarios = [] published = false -reason = "No cross-engine scenario currently reaches an insufficient-cash boundary." +reason = "Native checks cover submission and gap boundaries, but the scenario matrix does not reach an insufficient-cash boundary." [[framework.backtrader]] name = "order_processing" diff --git a/validation/native/backtrader_behavior.py b/validation/native/backtrader_behavior.py index f44549a5..b4bbba3d 100644 --- a/validation/native/backtrader_behavior.py +++ b/validation/native/backtrader_behavior.py @@ -215,6 +215,73 @@ def notify_order(self, order: Any) -> None: ] +def _losing_short_cover() -> dict[str, Any]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.sell(size=1) + elif len(self) == 2: + self.buy(size=1) + + def notify_order(self, order: Any) -> None: + if _terminal(order): + self.events.append( + { + "status": order.getstatusname(), + "size": order.executed.size, + "price": order.executed.price, + } + ) + + cerebro, strategy = _run( + Strategy, + ("asset", _frame([100.0, 100.0, 250.0], closes=[100.0, 250.0, 250.0])), + cash=100.0, + ) + return { + "events": strategy.events, + "cash": cerebro.broker.getcash(), + "position": strategy.getposition().size, + } + + +def _gap_reversal() -> dict[str, Any]: + class Strategy(bt.Strategy): + def __init__(self) -> None: + self.events: list[dict[str, Any]] = [] + + def next(self) -> None: + if len(self) == 1: + self.sell(size=1) + elif len(self) == 2: + self.buy(size=2) + + def notify_order(self, order: Any) -> None: + if _terminal(order): + self.events.append( + { + "status": order.getstatusname(), + "created_size": order.created.size, + "executed_size": order.executed.size, + "price": order.executed.price, + } + ) + + cerebro, strategy = _run( + Strategy, + ("asset", _frame([100.0, 100.0, 250.0], closes=[100.0, 90.0, 250.0])), + cash=100.0, + ) + return { + "events": strategy.events, + "cash": cerebro.broker.getcash(), + "position": strategy.getposition().size, + } + + def _signal_price_stop() -> list[dict[str, Any]]: class Strategy(bt.Strategy): def __init__(self) -> None: @@ -560,6 +627,40 @@ def run() -> dict[str, Any]: ], }, ), + ( + "losing_short_cover_submission_rejection", + _losing_short_cover(), + { + "events": [ + {"status": "Completed", "size": -1, "price": 100.0}, + {"status": "Margin", "size": 0, "price": 0.0}, + ], + "cash": 200.0, + "position": -1, + }, + ), + ( + "gap_reversal_executes_close_leg_despite_margin", + _gap_reversal(), + { + "events": [ + { + "status": "Completed", + "created_size": -1, + "executed_size": -1, + "price": 100.0, + }, + { + "status": "Margin", + "created_size": 2, + "executed_size": 1, + "price": 250.0, + }, + ], + "cash": -50.0, + "position": 0, + }, + ), ( "signal_price_stop_basis", _signal_price_stop(), diff --git a/validation/native/evidence/backtrader-1.9.78.123.json b/validation/native/evidence/backtrader-1.9.78.123.json index c09e54f5..fc28d7a1 100644 --- a/validation/native/evidence/backtrader-1.9.78.123.json +++ b/validation/native/evidence/backtrader-1.9.78.123.json @@ -218,6 +218,82 @@ "id": "submission_sequence", "passed": true }, + { + "actual": { + "cash": 200.0, + "events": [ + { + "price": 100.0, + "size": -1, + "status": "Completed" + }, + { + "price": 0.0, + "size": 0, + "status": "Margin" + } + ], + "position": -1 + }, + "expected": { + "cash": 200.0, + "events": [ + { + "price": 100.0, + "size": -1, + "status": "Completed" + }, + { + "price": 0.0, + "size": 0, + "status": "Margin" + } + ], + "position": -1 + }, + "id": "losing_short_cover_submission_rejection", + "passed": true + }, + { + "actual": { + "cash": -50.0, + "events": [ + { + "created_size": -1, + "executed_size": -1, + "price": 100.0, + "status": "Completed" + }, + { + "created_size": 2, + "executed_size": 1, + "price": 250.0, + "status": "Margin" + } + ], + "position": 0 + }, + "expected": { + "cash": -50.0, + "events": [ + { + "created_size": -1, + "executed_size": -1, + "price": 100.0, + "status": "Completed" + }, + { + "created_size": 2, + "executed_size": 1, + "price": 250.0, + "status": "Margin" + } + ], + "position": 0 + }, + "id": "gap_reversal_executes_close_leg_despite_margin", + "passed": true + }, { "actual": [ { @@ -468,7 +544,7 @@ } ], "framework": "backtrader", - "oracle_sha256": "02dddf9eca15abc25dcfa51a362505220de4dbc2608deb520e126904e4399f51", + "oracle_sha256": "f516fb0bfb3b2cbebc076b092ce86f12cca502aec81735f240063512edbbf8df", "package": "backtrader", "passed": true, "schema_version": 1, From e1bf3602b5fba83c1ada88675fed86e0e0c4afe8 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 06:37:44 -0400 Subject: [PATCH 24/44] fix(validation): match LEAN two-stage buying power --- docs/user-guide/configuration.md | 1 + src/ml4t/backtest/config.py | 7 ++- src/ml4t/backtest/core/execution_engine.py | 7 +-- src/ml4t/backtest/core/order_book.py | 21 +++++++-- src/ml4t/backtest/profiles.py | 3 +- tests/compatibility/snapshots/v0.1.json | 5 +- tests/test_config_wiring.py | 54 ++++++++++++++++++++++ validation/behavior_coverage.toml | 2 +- 8 files changed, 82 insertions(+), 18 deletions(-) diff --git a/docs/user-guide/configuration.md b/docs/user-guide/configuration.md index 34cfa200..9e5b76dc 100644 --- a/docs/user-guide/configuration.md +++ b/docs/user-guide/configuration.md @@ -128,6 +128,7 @@ separate assumption layer. | `fixed_margin_schedule` | dict \| None | None | Per-asset `(initial, maintenance)` fixed dollar margin per contract | | `margin_pct_schedule` | dict \| None | None | Per-asset `(initial, maintenance)` fractions of notional; cannot overlap the fixed schedule | | `short_cash_policy` | ShortCashPolicy | CREDIT | How short proceeds affect cash | +| `lock_notional_update_mode` | LockNotionalUpdateMode | POSITION_LEGS | Whether locked short collateral updates by closing/opening legs or by the combined order | Account type is determined by the flag combination: diff --git a/src/ml4t/backtest/config.py b/src/ml4t/backtest/config.py index 4e97eb47..76c98ee1 100644 --- a/src/ml4t/backtest/config.py +++ b/src/ml4t/backtest/config.py @@ -748,10 +748,9 @@ def get_effective_account_type(self) -> str: next_bar_submission_precheck: bool = False next_bar_simple_cash_check: bool = False buying_power_reservation: bool = False # Reserve cash at submission (LEAN-style) - # TODO(parity): consider an explicit profile/knob for "commit basket at close, - # fill reserved orders at next open" semantics. Keep it separate from the - # default next-bar/open path, which currently revalidates affordability at - # the actual open. + # Validate a next-open batch against a shadow account in submission order. + # When combined with next_bar_submission_precheck, each order first gets an + # independent close-price check before the batch is rechecked next session. next_bar_queue_shadow_validation: bool = False immediate_fill: bool = False # Fill same-bar market orders at submit time (LEAN-style) rebalance_mode: RebalanceMode = RebalanceMode.INCREMENTAL diff --git a/src/ml4t/backtest/core/execution_engine.py b/src/ml4t/backtest/core/execution_engine.py index bac3e097..e15f75aa 100644 --- a/src/ml4t/backtest/core/execution_engine.py +++ b/src/ml4t/backtest/core/execution_engine.py @@ -179,18 +179,13 @@ def _should_use_next_bar_queue_shadow_validation( if order_types is not None or order_ids is not None or include_orders_this_bar: return False - current_bar_index = self.market.bar_index eligible_orders = self._eligible_orders( use_open, order_types=order_types, order_ids=order_ids, include_orders_this_bar=include_orders_this_bar, ) - for order in eligible_orders: - if getattr(order, "_created_bar_index", current_bar_index) < current_bar_index - 1: - return True - - return False + return bool(eligible_orders) def _process_orders_next_bar_queue_shadow( self, diff --git a/src/ml4t/backtest/core/order_book.py b/src/ml4t/backtest/core/order_book.py index 889dcac1..d77d5657 100644 --- a/src/ml4t/backtest/core/order_book.py +++ b/src/ml4t/backtest/core/order_book.py @@ -370,7 +370,11 @@ def _passes_submission_precheck(self, order: Order) -> bool: self._reset_submission_shadow_if_needed() if broker.allow_leverage and not broker.next_bar_simple_cash_check: - return self._passes_margin_submission_precheck(order, signal_price) + return self._passes_margin_submission_precheck( + order, + signal_price, + commit=not broker.next_bar_queue_shadow_validation, + ) size = order.quantity if order.side is OrderSide.BUY else -order.quantity old_qty, old_price = self._submission_shadow_positions.get(order.asset, (0.0, signal_price)) @@ -493,11 +497,17 @@ def _passes_buying_power_check(self, order: Order) -> bool: self._submission_shadow_positions[order.asset] = (new_qty, new_price) return True - def _passes_margin_submission_precheck(self, order: Order, signal_price: float) -> bool: + def _passes_margin_submission_precheck( + self, + order: Order, + signal_price: float, + *, + commit: bool = True, + ) -> bool: """Margin-aware submission precheck for NEXT_BAR market orders. - Simulates sequential submission-time acceptance using policy validation at - signal-bar prices and commits only accepted orders into shadow state. + Validate at the signal-bar price. ``commit=False`` keeps each check + independent, while ``commit=True`` reserves accepted orders in shadow state. """ broker = self.broker @@ -576,6 +586,9 @@ def _passes_margin_submission_precheck(self, order: Order, signal_price: float) order._rejection_code = rejection_code return False + if not commit: + return True + multiplier = broker.get_multiplier(order.asset) self._submission_shadow_cash += -size * signal_price * multiplier - commission if abs(new_qty) <= quantity_zero_tolerance(old_qty, size): diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index ae9da55d..d11f8740 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -181,7 +181,7 @@ "partial_fills_allowed": False, "fill_ordering": "fifo", "entry_order_priority": "submission", - "next_bar_queue_shadow_validation": True, + "next_bar_queue_shadow_validation": False, "rebalance_mode": "snapshot", "rebalance_headroom_pct": 1.0, "missing_price_policy": "use_last", @@ -340,6 +340,7 @@ "fill_ordering": "sequential", "entry_order_priority": "submission", "buying_power_reservation": False, + "next_bar_submission_precheck": True, "next_bar_queue_shadow_validation": True, "rebalance_mode": "snapshot", "rebalance_headroom_pct": 0.9975, diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index 485ea71e..a84f95a6 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -1477,6 +1477,7 @@ "late_asset_policy": "allow", "missing_price_policy": "use_last", "next_bar_queue_shadow_validation": true, + "next_bar_submission_precheck": true, "partial_fills_allowed": false, "rebalance_headroom_pct": 0.9975, "rebalance_mode": "snapshot", @@ -1704,7 +1705,7 @@ "late_asset_min_bars": 1, "late_asset_policy": "allow", "missing_price_policy": "use_last", - "next_bar_queue_shadow_validation": true, + "next_bar_queue_shadow_validation": false, "partial_fills_allowed": false, "rebalance_headroom_pct": 1.0, "rebalance_mode": "snapshot", @@ -1751,7 +1752,7 @@ "late_asset_min_bars": 1, "late_asset_policy": "allow", "missing_price_policy": "use_last", - "next_bar_queue_shadow_validation": true, + "next_bar_queue_shadow_validation": false, "partial_fills_allowed": false, "rebalance_headroom_pct": 1.0, "rebalance_mode": "snapshot", diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index dd92f8f3..b7a629d3 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -262,6 +262,54 @@ def test_next_bar_submission_precheck_uses_sequential_shadow_cash(self): assert first.status.value != "rejected" assert second.status.value == "rejected" + def test_lean_two_stage_buying_power_validation(self): + broker = _make_broker( + initial_cash=10_000.0, + execution_mode=ExecutionMode.NEXT_BAR, + next_bar_submission_precheck=True, + next_bar_queue_shadow_validation=True, + allow_short_selling=True, + allow_leverage=True, + initial_margin=0.5, + long_maintenance_margin=0.5, + short_maintenance_margin=0.5, + fill_ordering=FillOrdering.SEQUENTIAL, + share_type=ShareType.INTEGER, + reject_on_insufficient_cash=True, + ) + broker._update_time( + timestamp=datetime(2024, 1, 2), + prices={"AAPL": 100.0}, + opens={"AAPL": 100.0}, + volumes={"AAPL": 1_000.0}, + highs={"AAPL": 100.0}, + lows={"AAPL": 100.0}, + signals={}, + ) + + first = broker.submit_order("AAPL", 150, OrderSide.BUY) + second = broker.submit_order("AAPL", 150, OrderSide.BUY) + + assert first is not None and first.status.value == "pending" + assert second is not None and second.status.value == "pending" + + broker._update_time( + timestamp=datetime(2024, 1, 3), + prices={"AAPL": 110.0}, + opens={"AAPL": 110.0}, + volumes={"AAPL": 1_000.0}, + highs={"AAPL": 110.0}, + lows={"AAPL": 110.0}, + signals={}, + ) + broker._process_orders(use_open=True) + + assert first.status.value == "filled" + assert second.status.value == "rejected" + assert second.rejection_code == "insufficient_buying_power" + assert broker.get_position("AAPL").quantity == 150.0 + assert broker.cash == -6_500.0 + def test_backtrader_precheck_rejects_unaffordable_short_cover(self): broker = _make_broker( initial_cash=100.0, @@ -1109,8 +1157,14 @@ def test_lean_preset_values(self): assert config.fill_ordering == FillOrdering.SEQUENTIAL assert config.rebalance_headroom_pct == 0.9975 assert config.slippage_type == SlippageType.NONE + assert config.next_bar_submission_precheck is True assert config.next_bar_queue_shadow_validation is True + def test_zipline_preset_does_not_apply_buying_power_validation(self): + config = BacktestConfig.from_preset("zipline_strict") + assert config.skip_cash_validation is True + assert config.next_bar_queue_shadow_validation is False + def test_ibkr_us_stocks_fixed_preset_values(self): config = BacktestConfig.from_preset("ibkr_us_stocks_fixed") assert config.share_type == ShareType.INTEGER diff --git a/validation/behavior_coverage.toml b/validation/behavior_coverage.toml index 4cfe59fe..3edfaf14 100644 --- a/validation/behavior_coverage.toml +++ b/validation/behavior_coverage.toml @@ -243,7 +243,7 @@ reason = "The current LEAN oracle and case studies do not test stop-order semant [[framework.lean]] name = "buying_power_and_ordering" -fields = ["orders.reject_on_insufficient_cash", "orders.partial_fills_allowed", "orders.fill_ordering", "orders.entry_order_priority", "orders.buying_power_reservation", "orders.next_bar_queue_shadow_validation"] +fields = ["orders.reject_on_insufficient_cash", "orders.partial_fills_allowed", "orders.fill_ordering", "orders.entry_order_priority", "orders.buying_power_reservation", "orders.next_bar_submission_precheck", "orders.next_bar_queue_shadow_validation"] native_checks = ["submission_sequence", "buying_power_sequence", "default_full_fill"] scenarios = [] published = false From d5d9a8101ff75d28360bac8419bfe0d17883bde7 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 07:35:47 -0400 Subject: [PATCH 25/44] test(validation): retain current scale parity matrix --- validation/LARGE_SCALE_RESULTS.json | 1828 +++++++++++++++++++++++++++ 1 file changed, 1828 insertions(+) create mode 100644 validation/LARGE_SCALE_RESULTS.json diff --git a/validation/LARGE_SCALE_RESULTS.json b/validation/LARGE_SCALE_RESULTS.json new file mode 100644 index 00000000..6bab2a0f --- /dev/null +++ b/validation/LARGE_SCALE_RESULTS.json @@ -0,0 +1,1828 @@ +{ + "frameworks": [ + { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[vectorbt_strict]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 390369, + "actual_sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1", + "expected_count": 390369, + "expected_sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 188549, + "actual_sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242", + "expected_count": 188549, + "expected_sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 188549, + "canonical_actual": 188549.0, + "canonical_difference": 0.0, + "canonical_expected": 188549.0, + "expected": 188549, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": -283214.59191072755, + "canonical_actual": -283214.591911, + "canonical_difference": 0.0, + "canonical_expected": -283214.591911, + "expected": -283214.59191072907, + "name": "total_pnl", + "passed": true, + "raw_difference": 1.5133991837501526e-09 + }, + { + "actual": 716785.4080892724, + "canonical_actual": 716785.408089, + "canonical_difference": 0.0, + "canonical_expected": 716785.408089, + "expected": 716785.4080892709, + "name": "final_value", + "passed": true, + "raw_difference": 1.5133991837501526e-09 + }, + { + "actual": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "actual_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "expected": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "expected_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "VectorBT Pro", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "vectorbt_pro", + "input": { + "conversion": "none", + "effective_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runtime_seconds": { + "framework": 62.88472085003741, + "ml4t": 85.68690094188787, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + } + }, + { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[vectorbt_oss_strict]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 390369, + "actual_sha256": "0a43d8334e05f1f269335d8111390a5dbafda6c36f66fa7d40b05120521ef83c", + "expected_count": 390369, + "expected_sha256": "0a43d8334e05f1f269335d8111390a5dbafda6c36f66fa7d40b05120521ef83c", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 188549, + "actual_sha256": "e8d13c481c716065ff0bf5fceed131c4ec39bfea45f5b4b7d51fdd867f53d8c9", + "expected_count": 188549, + "expected_sha256": "e8d13c481c716065ff0bf5fceed131c4ec39bfea45f5b4b7d51fdd867f53d8c9", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 188549, + "canonical_actual": 188549.0, + "canonical_difference": 0.0, + "canonical_expected": 188549.0, + "expected": 188549, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": -283214.5919107256, + "canonical_actual": -283214.591911, + "canonical_difference": 0.0, + "canonical_expected": -283214.591911, + "expected": -283214.5919107344, + "name": "total_pnl", + "passed": true, + "raw_difference": 8.847564458847046e-09 + }, + { + "actual": 716785.4080892744, + "canonical_actual": 716785.408089, + "canonical_difference": 0.0, + "canonical_expected": 716785.408089, + "expected": 716785.4080892656, + "name": "final_value", + "passed": true, + "raw_difference": 8.847564458847046e-09 + }, + { + "actual": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "actual_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "expected": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "expected_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "VectorBT OSS", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "vectorbt_oss", + "input": { + "conversion": "none", + "effective_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runtime_seconds": { + "framework": 41.441031792899594, + "ml4t": 84.64774281391874, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + } + }, + { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[backtrader_strict]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 343813, + "actual_sha256": "bacd31b4b84da47129e9ad05288eb74733968f32d1f09b1a911587fa22e5180e", + "expected_count": 343813, + "expected_sha256": "bacd31b4b84da47129e9ad05288eb74733968f32d1f09b1a911587fa22e5180e", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 182019, + "actual_sha256": "5ca62d52bc97c43d8c053f4e73d4b84199fc71155d56b61b3a18dd7e1017c3f8", + "expected_count": 182019, + "expected_sha256": "5ca62d52bc97c43d8c053f4e73d4b84199fc71155d56b61b3a18dd7e1017c3f8", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 182019, + "canonical_actual": 182019.0, + "canonical_difference": 0.0, + "canonical_expected": 182019.0, + "expected": 182019, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": -10166273.555953683, + "canonical_actual": -10166273.555954, + "canonical_difference": 0.0, + "canonical_expected": -10166273.555954, + "expected": -10166273.555953681, + "name": "total_pnl", + "passed": true, + "raw_difference": 1.862645149230957e-09 + }, + { + "actual": -9166273.555953683, + "canonical_actual": -9166273.555954, + "canonical_difference": 0.0, + "canonical_expected": -9166273.555954, + "expected": -9166273.555953681, + "name": "final_value", + "passed": true, + "raw_difference": 1.862645149230957e-09 + }, + { + "actual": { + "cash_from_fill_ledger": -75891.763751, + "holdings_from_fill_ledger": -9090381.792622, + "positions": { + "ASSET_007": -100.0, + "ASSET_008": -100.0, + "ASSET_010": 100.0, + "ASSET_022": 100.0, + "ASSET_024": -100.0, + "ASSET_034": -100.0, + "ASSET_039": -100.0, + "ASSET_046": -100.0, + "ASSET_057": 100.0, + "ASSET_058": 100.0, + "ASSET_060": 100.0, + "ASSET_063": 100.0, + "ASSET_104": -100.0, + "ASSET_105": -100.0, + "ASSET_109": 100.0, + "ASSET_112": -100.0, + "ASSET_117": -100.0, + "ASSET_120": 100.0, + "ASSET_121": -100.0, + "ASSET_130": 100.0, + "ASSET_132": -100.0, + "ASSET_133": -100.0, + "ASSET_138": -100.0, + "ASSET_140": 100.0, + "ASSET_150": -100.0, + "ASSET_151": 100.0, + "ASSET_152": -100.0, + "ASSET_156": -100.0, + "ASSET_159": 100.0, + "ASSET_165": -100.0, + "ASSET_174": -100.0, + "ASSET_177": 100.0, + "ASSET_187": -100.0, + "ASSET_202": -100.0, + "ASSET_209": 100.0, + "ASSET_210": 100.0, + "ASSET_217": 100.0, + "ASSET_218": 100.0, + "ASSET_229": -100.0, + "ASSET_238": 100.0, + "ASSET_248": 100.0 + }, + "reported_final_value": -9166273.555954, + "sha256": "28ed0fb657c2c38cd6eac08b323db6e95d235dcdeff18df05a895b1faf21c374" + }, + "actual_sha256": "28ed0fb657c2c38cd6eac08b323db6e95d235dcdeff18df05a895b1faf21c374", + "expected": { + "cash_from_fill_ledger": -75891.763751, + "holdings_from_fill_ledger": -9090381.792622, + "positions": { + "ASSET_007": -100.0, + "ASSET_008": -100.0, + "ASSET_010": 100.0, + "ASSET_022": 100.0, + "ASSET_024": -100.0, + "ASSET_034": -100.0, + "ASSET_039": -100.0, + "ASSET_046": -100.0, + "ASSET_057": 100.0, + "ASSET_058": 100.0, + "ASSET_060": 100.0, + "ASSET_063": 100.0, + "ASSET_104": -100.0, + "ASSET_105": -100.0, + "ASSET_109": 100.0, + "ASSET_112": -100.0, + "ASSET_117": -100.0, + "ASSET_120": 100.0, + "ASSET_121": -100.0, + "ASSET_130": 100.0, + "ASSET_132": -100.0, + "ASSET_133": -100.0, + "ASSET_138": -100.0, + "ASSET_140": 100.0, + "ASSET_150": -100.0, + "ASSET_151": 100.0, + "ASSET_152": -100.0, + "ASSET_156": -100.0, + "ASSET_159": 100.0, + "ASSET_165": -100.0, + "ASSET_174": -100.0, + "ASSET_177": 100.0, + "ASSET_187": -100.0, + "ASSET_202": -100.0, + "ASSET_209": 100.0, + "ASSET_210": 100.0, + "ASSET_217": 100.0, + "ASSET_218": 100.0, + "ASSET_229": -100.0, + "ASSET_238": 100.0, + "ASSET_248": 100.0 + }, + "reported_final_value": -9166273.555954, + "sha256": "28ed0fb657c2c38cd6eac08b323db6e95d235dcdeff18df05a895b1faf21c374" + }, + "expected_sha256": "28ed0fb657c2c38cd6eac08b323db6e95d235dcdeff18df05a895b1faf21c374", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "Backtrader", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "backtrader", + "input": { + "conversion": "none", + "effective_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "runtime_seconds": { + "framework": 729.4739102870226, + "ml4t": 145.95089966920204, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + } + }, + { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[zipline_strict]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 427696, + "actual_sha256": "25213baad0647cd21e481786c60ceb3b57f89a6578fcdf37bcac20e543aa4bd8", + "expected_count": 427696, + "expected_sha256": "25213baad0647cd21e481786c60ceb3b57f89a6578fcdf37bcac20e543aa4bd8", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 226434, + "actual_sha256": "5da4529deddb3c32c605e079e486f26402a0ed7011c849cbe788cf1cf2850ed4", + "expected_count": 226434, + "expected_sha256": "5da4529deddb3c32c605e079e486f26402a0ed7011c849cbe788cf1cf2850ed4", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 226434, + "canonical_actual": 226434.0, + "canonical_difference": 0.0, + "canonical_expected": 226434.0, + "expected": 226434, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": 9504095.900000088, + "canonical_actual": 9504095.9, + "canonical_difference": 0.0, + "canonical_expected": 9504095.9, + "expected": 9504095.90000011, + "name": "total_pnl", + "passed": true, + "raw_difference": 2.2351741790771484e-08 + }, + { + "actual": 10504095.900000088, + "canonical_actual": 10504095.9, + "canonical_difference": 0.0, + "canonical_expected": 10504095.9, + "expected": 10504095.90000011, + "name": "final_value", + "passed": true, + "raw_difference": 2.2351741790771484e-08 + }, + { + "actual": { + "cash_from_fill_ledger": 7797567.3, + "holdings_from_fill_ledger": 2706528.6, + "positions": { + "ASSET_003": -100.0, + "ASSET_004": 100.0, + "ASSET_017": -100.0, + "ASSET_023": -100.0, + "ASSET_026": -100.0, + "ASSET_027": 100.0, + "ASSET_034": 100.0, + "ASSET_035": -100.0, + "ASSET_036": 100.0, + "ASSET_058": 100.0, + "ASSET_060": 100.0, + "ASSET_062": 100.0, + "ASSET_063": -100.0, + "ASSET_068": -100.0, + "ASSET_075": -100.0, + "ASSET_096": -100.0, + "ASSET_104": 100.0, + "ASSET_107": 100.0, + "ASSET_126": 100.0, + "ASSET_130": 100.0, + "ASSET_132": -100.0, + "ASSET_136": -100.0, + "ASSET_141": -100.0, + "ASSET_143": -100.0, + "ASSET_149": 100.0, + "ASSET_150": 100.0, + "ASSET_154": -100.0, + "ASSET_158": 100.0, + "ASSET_160": -100.0, + "ASSET_161": -100.0, + "ASSET_163": -100.0, + "ASSET_169": 100.0, + "ASSET_170": -100.0, + "ASSET_180": -100.0, + "ASSET_183": 100.0, + "ASSET_184": -100.0, + "ASSET_189": -100.0, + "ASSET_191": 100.0, + "ASSET_203": 100.0, + "ASSET_209": -100.0, + "ASSET_216": -100.0, + "ASSET_218": 100.0, + "ASSET_220": 100.0, + "ASSET_225": -100.0, + "ASSET_226": 100.0, + "ASSET_227": 100.0, + "ASSET_234": -100.0, + "ASSET_236": 100.0, + "ASSET_243": 100.0, + "ASSET_244": 100.0 + }, + "reported_final_value": 10504095.9, + "sha256": "2b4072c31c6c0e8b81f1e93f142845962422754c7f69d37925372de3faba5a05" + }, + "actual_sha256": "2b4072c31c6c0e8b81f1e93f142845962422754c7f69d37925372de3faba5a05", + "expected": { + "cash_from_fill_ledger": 7797567.3, + "holdings_from_fill_ledger": 2706528.6, + "positions": { + "ASSET_003": -100.0, + "ASSET_004": 100.0, + "ASSET_017": -100.0, + "ASSET_023": -100.0, + "ASSET_026": -100.0, + "ASSET_027": 100.0, + "ASSET_034": 100.0, + "ASSET_035": -100.0, + "ASSET_036": 100.0, + "ASSET_058": 100.0, + "ASSET_060": 100.0, + "ASSET_062": 100.0, + "ASSET_063": -100.0, + "ASSET_068": -100.0, + "ASSET_075": -100.0, + "ASSET_096": -100.0, + "ASSET_104": 100.0, + "ASSET_107": 100.0, + "ASSET_126": 100.0, + "ASSET_130": 100.0, + "ASSET_132": -100.0, + "ASSET_136": -100.0, + "ASSET_141": -100.0, + "ASSET_143": -100.0, + "ASSET_149": 100.0, + "ASSET_150": 100.0, + "ASSET_154": -100.0, + "ASSET_158": 100.0, + "ASSET_160": -100.0, + "ASSET_161": -100.0, + "ASSET_163": -100.0, + "ASSET_169": 100.0, + "ASSET_170": -100.0, + "ASSET_180": -100.0, + "ASSET_183": 100.0, + "ASSET_184": -100.0, + "ASSET_189": -100.0, + "ASSET_191": 100.0, + "ASSET_203": 100.0, + "ASSET_209": -100.0, + "ASSET_216": -100.0, + "ASSET_218": 100.0, + "ASSET_220": 100.0, + "ASSET_225": -100.0, + "ASSET_226": 100.0, + "ASSET_227": 100.0, + "ASSET_234": -100.0, + "ASSET_236": 100.0, + "ASSET_243": 100.0, + "ASSET_244": 100.0 + }, + "reported_final_value": 10504095.9, + "sha256": "2b4072c31c6c0e8b81f1e93f142845962422754c7f69d37925372de3faba5a05" + }, + "expected_sha256": "2b4072c31c6c0e8b81f1e93f142845962422754c7f69d37925372de3faba5a05", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "Zipline", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "zipline", + "input": { + "conversion": "OHLC rounded to 3 decimals before both engines", + "effective_sha256": "488f31689ee4843e2817851e92c0fb229c3a253ec7d597cbc8c7c89f790e4ffd", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.11.13" + }, + "runtime_seconds": { + "framework": 297.3190433611162, + "ml4t": 132.85931095900014, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + } + }, + { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[lean]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 361297, + "actual_sha256": "8195538948325e43f0905fd1877fd5a6a3d7f43b909f22a28912be3b11588b28", + "expected_count": 361297, + "expected_sha256": "8195538948325e43f0905fd1877fd5a6a3d7f43b909f22a28912be3b11588b28", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 191297, + "actual_sha256": "021ef93839be812f0b7e6010ba7535f0ae60df144f1d055e6bfd829bc57ab7f9", + "expected_count": 191297, + "expected_sha256": "021ef93839be812f0b7e6010ba7535f0ae60df144f1d055e6bfd829bc57ab7f9", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 191297, + "canonical_actual": 191297.0, + "canonical_difference": 0.0, + "canonical_expected": 191297.0, + "expected": 191297, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": -815461.8699999778, + "canonical_actual": -815461.87, + "canonical_difference": 0.0, + "canonical_expected": -815461.87, + "expected": -815461.87, + "name": "total_pnl", + "passed": true, + "raw_difference": 2.223532646894455e-08 + }, + { + "actual": 184538.13000002224, + "canonical_actual": 184538.13, + "canonical_difference": 0.0, + "canonical_expected": 184538.13, + "expected": 184538.13, + "name": "final_value", + "passed": true, + "raw_difference": 2.223532646894455e-08 + }, + { + "actual": { + "cash_from_fill_ledger": 140759.97, + "holdings_from_fill_ledger": 43778.16, + "positions": { + "ASSET_003": -100.0, + "ASSET_017": -100.0, + "ASSET_023": -100.0, + "ASSET_026": -100.0, + "ASSET_035": -100.0, + "ASSET_062": 100.0, + "ASSET_063": -100.0, + "ASSET_068": -100.0, + "ASSET_104": 100.0, + "ASSET_126": 100.0, + "ASSET_130": 100.0, + "ASSET_132": -100.0, + "ASSET_136": -100.0, + "ASSET_141": -100.0, + "ASSET_143": -100.0, + "ASSET_149": 100.0, + "ASSET_150": 100.0, + "ASSET_154": -100.0, + "ASSET_158": 100.0, + "ASSET_160": -100.0, + "ASSET_163": -100.0, + "ASSET_180": -100.0, + "ASSET_183": 100.0, + "ASSET_191": 100.0, + "ASSET_209": -100.0, + "ASSET_216": -100.0, + "ASSET_220": 100.0, + "ASSET_225": -100.0, + "ASSET_226": 100.0, + "ASSET_227": 100.0, + "ASSET_243": 100.0, + "ASSET_244": 100.0 + }, + "reported_final_value": 184538.13, + "sha256": "5dcf8612a6d4383347ee7206a837cc808fba5539086d589328ac8289496497d1" + }, + "actual_sha256": "5dcf8612a6d4383347ee7206a837cc808fba5539086d589328ac8289496497d1", + "expected": { + "cash_from_fill_ledger": 140759.97, + "holdings_from_fill_ledger": 43778.16, + "positions": { + "ASSET_003": -100.0, + "ASSET_017": -100.0, + "ASSET_023": -100.0, + "ASSET_026": -100.0, + "ASSET_035": -100.0, + "ASSET_062": 100.0, + "ASSET_063": -100.0, + "ASSET_068": -100.0, + "ASSET_104": 100.0, + "ASSET_126": 100.0, + "ASSET_130": 100.0, + "ASSET_132": -100.0, + "ASSET_136": -100.0, + "ASSET_141": -100.0, + "ASSET_143": -100.0, + "ASSET_149": 100.0, + "ASSET_150": 100.0, + "ASSET_154": -100.0, + "ASSET_158": 100.0, + "ASSET_160": -100.0, + "ASSET_163": -100.0, + "ASSET_180": -100.0, + "ASSET_183": 100.0, + "ASSET_191": 100.0, + "ASSET_209": -100.0, + "ASSET_216": -100.0, + "ASSET_220": 100.0, + "ASSET_225": -100.0, + "ASSET_226": 100.0, + "ASSET_227": 100.0, + "ASSET_243": 100.0, + "ASSET_244": 100.0 + }, + "reported_final_value": 184538.13, + "sha256": "5dcf8612a6d4383347ee7206a837cc808fba5539086d589328ac8289496497d1" + }, + "expected_sha256": "5dcf8612a6d4383347ee7206a837cc808fba5539086d589328ac8289496497d1", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "LEAN CLI", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "lean", + "input": { + "conversion": "OHLC rounded to 4 decimals before both engines", + "effective_sha256": "718a6da2fc4a0a1326fc42a0d32c274843c6c40b56c7277422caf5ef1dc84023", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runtime_seconds": { + "framework": 137.2150160910096, + "ml4t": 195.11730115604587, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + } + } + ], + "generated_at": "2026-08-14T11:35:28.393203+00:00", + "release_gate_passed": true, + "schema_version": 1, + "workload": { + "data_points": 1260000, + "generator": "validation.benchmark_suite.generate_benchmark_data", + "recipe": { + "assets": 250, + "bars": 5040, + "bottom_n": 25, + "end_session": "2025-12-31", + "initial_cash": 1000000.0, + "long_target_shares": 100.0, + "name": "controlled_250_assets_5040_sessions", + "rebalance_frequency": 1, + "seed": 42, + "short_target_shares": -100.0, + "top_n": 25 + }, + "recipe_sha256": "5de81aacdda2ee7f08b2cc1549e64a974b19693967ac2fe1fdb0f1a6370d0ba5", + "redistributable": true + } +} From ef0d052cc45e041a3bc503256412f892a99bb2cb Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 07:46:38 -0400 Subject: [PATCH 26/44] fix(validation): allow evidence-only replay revisions --- tests/contracts/test_large_scale_evidence.py | 8 ++++++++ validation/large_scale_evidence.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/contracts/test_large_scale_evidence.py b/tests/contracts/test_large_scale_evidence.py index 5179d79a..91afc7f7 100644 --- a/tests/contracts/test_large_scale_evidence.py +++ b/tests/contracts/test_large_scale_evidence.py @@ -210,10 +210,18 @@ def test_historical_report_requires_exact_identity_and_matching_outputs( assert module.historical_report_failures(report, reconstruct_input=True) == [] + evidence_only_revision = copy.deepcopy(report) + evidence_only_revision["historical"]["ml4t"]["commit"] = "b" * 40 + assert module.historical_report_failures(evidence_only_revision, reconstruct_input=True) == [] + wrong_identity = copy.deepcopy(report) wrong_identity["historical"]["target"]["actual_version"] = "2026.6.27" assert module.historical_report_failures(wrong_identity) + missing_ml4t_identity = copy.deepcopy(report) + missing_ml4t_identity["historical"]["ml4t"]["commit"] = "" + assert module.historical_report_failures(missing_ml4t_identity) + changed_output = copy.deepcopy(report) fill_check = next( check diff --git a/validation/large_scale_evidence.py b/validation/large_scale_evidence.py index b075443a..eba4d79e 100644 --- a/validation/large_scale_evidence.py +++ b/validation/large_scale_evidence.py @@ -651,6 +651,8 @@ def historical_report_failures( ml4t = record.get("ml4t") if not isinstance(ml4t, dict) or ml4t.get("dirty") is not False: failures.append(f"VectorBT Pro {label} run used a dirty ML4T tree") + elif not isinstance(ml4t.get("commit"), str) or len(str(ml4t["commit"])) != 40: + failures.append(f"VectorBT Pro {label} ML4T commit identity is missing") comparison = record.get("comparison") if not isinstance(comparison, dict) or comparison.get("passed") is not True: failures.append(f"VectorBT Pro {label} exact comparison did not pass") @@ -661,8 +663,6 @@ def historical_report_failures( WORKLOAD ): failures.append(f"VectorBT Pro {label} input digest does not reconstruct") - if current.get("ml4t") != historical.get("ml4t"): - failures.append("Historical replay runs used different ML4T revisions") if current.get("source_digests") != historical.get("source_digests"): failures.append("Historical replay runs used different comparison sources") if current.get("input") != historical.get("input"): From 1c3c1e3a8c6d3f5cf26c978efae786302b670e1e Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 07:53:27 -0400 Subject: [PATCH 27/44] test(validation): refresh current scenario evidence --- validation/CORRECTNESS_RESULTS.json | 740 ++++++++++++++-------------- 1 file changed, 370 insertions(+), 370 deletions(-) diff --git a/validation/CORRECTNESS_RESULTS.json b/validation/CORRECTNESS_RESULTS.json index 908b48e9..0815ca77 100644 --- a/validation/CORRECTNESS_RESULTS.json +++ b/validation/CORRECTNESS_RESULTS.json @@ -32,7 +32,7 @@ "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", "license": "Apache-2.0 WITH Commons-Clause", "package": "vectorbt", - "profile": "vectorbt", + "profile": "vectorbt_oss_strict", "python": ">=3.11,<3.15", "source": "https://pypi.org/project/vectorbt/1.1.0/", "version": "1.1.0" @@ -63,7 +63,7 @@ "version": "3.1.1" } }, - "generated_at": "2026-08-14T05:15:38.885810+00:00", + "generated_at": "2026-08-14T11:53:11.693665+00:00", "records": [ { "comparison": { @@ -698,7 +698,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.3022239189594984, + "duration_seconds": 2.9022904271259904, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -1355,10 +1355,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" }, "framework_target": { @@ -1368,7 +1368,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -2028,7 +2028,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.3081350419670343, + "duration_seconds": 2.635350476950407, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -2685,10 +2685,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" }, "framework_target": { @@ -2698,7 +2698,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -2855,7 +2855,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.3090186859481037, + "duration_seconds": 2.3570660441182554, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3003,10 +3003,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" }, "framework_target": { @@ -3016,7 +3016,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -3173,7 +3173,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.297614884097129, + "duration_seconds": 2.3704132658895105, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3321,10 +3321,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" }, "framework_target": { @@ -3334,7 +3334,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -4004,7 +4004,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.3087035389617085, + "duration_seconds": 2.29961962508969, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -4665,10 +4665,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" }, "framework_target": { @@ -4678,7 +4678,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -5348,7 +5348,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.3084055720828474, + "duration_seconds": 2.3205984868109226, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -6009,10 +6009,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "523af2137e8233ef65d03ffb841e91525f65f7c3057b3111e86aedbf0a973fb7" }, "framework_target": { @@ -6022,7 +6022,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -6682,7 +6682,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.3003372810781, + "duration_seconds": 2.2875159040559083, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -7339,10 +7339,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" }, "framework_target": { @@ -7352,7 +7352,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -8012,7 +8012,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.3101020380854607, + "duration_seconds": 2.3487607061397284, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -8669,10 +8669,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" }, "framework_target": { @@ -8682,7 +8682,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -8886,7 +8886,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.311944976914674, + "duration_seconds": 2.3469194669742137, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9087,10 +9087,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" }, "framework_target": { @@ -9100,7 +9100,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -9361,7 +9361,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 2.320407192921266, + "duration_seconds": 2.341246779076755, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9619,10 +9619,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "23ed56800f308478a89f083eb8c33c3d0aa5bd6475dbcdc2092bb3b975c5eb45", + "profile": "592c4ca3a782275c61f3fc2123e30c9055c3dcaec49a4b0202feafbc9821f1f3", "scenario": "ca329113ef7eae6ef6cb075659587a244d4808ab35df74a891dcea2db9151f0e" }, "framework_target": { @@ -9632,7 +9632,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -10292,7 +10292,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.378596806200221, + "duration_seconds": 2.3152057118713856, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -10949,10 +10949,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" }, "framework_target": { @@ -10962,7 +10962,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -11166,7 +11166,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 3.7011152170598507, + "duration_seconds": 2.3157475090119988, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11367,10 +11367,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "2f85fd2bb26ba7275d3a5ffb9eaf57ef5895665282032aabb7672ae871a8df34", + "profile": "ed38e0bc2ef5eae08a4d0d71c4d646cde827805bcfb346f2c85d92295040a29f", "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" }, "framework_target": { @@ -11380,7 +11380,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -11527,7 +11527,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.309941826155409, + "duration_seconds": 2.3186875029932708, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11671,10 +11671,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" }, "framework_target": { @@ -11684,7 +11684,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -11831,7 +11831,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 3.0959273409098387, + "duration_seconds": 2.3047236069105566, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11975,10 +11975,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" }, "framework_target": { @@ -11988,7 +11988,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -12135,7 +12135,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 4.586802172008902, + "duration_seconds": 2.3098256271332502, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -12279,10 +12279,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" }, "framework_target": { @@ -12292,7 +12292,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -12895,7 +12895,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.371119718067348, + "duration_seconds": 2.355546784121543, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -13495,10 +13495,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "57cdc5886b86ec87c3d0edce0e07363855476ced956068298af64a87307835b8", + "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" }, "framework_target": { @@ -13508,7 +13508,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -47798,7 +47798,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.414606736972928, + "duration_seconds": 2.431329692946747, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -82085,10 +82085,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" }, "framework_target": { @@ -82098,7 +82098,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -82758,7 +82758,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 3.2742884571198374, + "duration_seconds": 3.2446235159877688, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -83415,10 +83415,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" }, "framework_target": { @@ -83428,7 +83428,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -84088,7 +84088,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 3.3379638779442757, + "duration_seconds": 3.259092109045014, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -84745,10 +84745,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" }, "framework_target": { @@ -84758,7 +84758,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -84915,7 +84915,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 3.266716612968594, + "duration_seconds": 3.2769843318965286, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85063,10 +85063,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" }, "framework_target": { @@ -85076,7 +85076,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -85233,7 +85233,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 3.2450743049848825, + "duration_seconds": 3.2421666071750224, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85381,10 +85381,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "137c824d1c973aa36d8c2d368a187bca379e0667ad43a69ee1711d7f32a9da40", + "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" }, "framework_target": { @@ -85394,7 +85394,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -86064,7 +86064,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 3.236978525063023, + "duration_seconds": 3.239228632999584, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -86725,10 +86725,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" }, "framework_target": { @@ -86738,7 +86738,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -86768,7 +86768,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 5.0531234592199326e-06, + "duration_seconds": 4.461035132408142e-06, "framework": "vectorbt_oss", "framework_result": null, "ml4t_result": null, @@ -87412,7 +87412,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 3.256936904042959, + "duration_seconds": 3.2395296881441027, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -88069,10 +88069,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" }, "framework_target": { @@ -88082,7 +88082,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -88742,7 +88742,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 3.253919875016436, + "duration_seconds": 3.2616704050451517, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89399,10 +89399,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" }, "framework_target": { @@ -89412,7 +89412,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -89616,7 +89616,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 3.3604526040144265, + "duration_seconds": 3.2567403968423605, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89817,10 +89817,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" }, "framework_target": { @@ -89830,7 +89830,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -90091,7 +90091,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 3.2586936780717224, + "duration_seconds": 3.253674411214888, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -90349,10 +90349,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "23ed56800f308478a89f083eb8c33c3d0aa5bd6475dbcdc2092bb3b975c5eb45", + "profile": "592c4ca3a782275c61f3fc2123e30c9055c3dcaec49a4b0202feafbc9821f1f3", "scenario": "ca329113ef7eae6ef6cb075659587a244d4808ab35df74a891dcea2db9151f0e" }, "framework_target": { @@ -90362,7 +90362,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -91022,7 +91022,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 3.2626333869993687, + "duration_seconds": 3.2487299130298197, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -91679,10 +91679,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" }, "framework_target": { @@ -91692,7 +91692,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -91896,7 +91896,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 3.272601071977988, + "duration_seconds": 3.238377473084256, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92097,10 +92097,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "a3b09249b5b4af24b6bcfcb5175b48077fed844e695fb9206221ca487dd2656c", + "profile": "932435fd79f122599609991a33af8e129883b9fdcb0262599f224890feee0f0c", "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" }, "framework_target": { @@ -92110,7 +92110,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -92257,7 +92257,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 3.291440617060289, + "duration_seconds": 3.245127772912383, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92401,10 +92401,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" }, "framework_target": { @@ -92414,7 +92414,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -92561,7 +92561,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 3.255767574068159, + "duration_seconds": 3.248155200853944, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92705,10 +92705,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" }, "framework_target": { @@ -92718,7 +92718,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -92865,7 +92865,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 3.242527954047546, + "duration_seconds": 3.238037460949272, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -93009,10 +93009,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" }, "framework_target": { @@ -93022,7 +93022,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -93625,7 +93625,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 3.2858357271179557, + "duration_seconds": 3.3207258789334446, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -94225,10 +94225,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "570211c374a10116b954bda2279411792e016782a23e53756305fad7ff9b60b8", + "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" }, "framework_target": { @@ -94238,7 +94238,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -128528,7 +128528,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.4040371340233833, + "duration_seconds": 3.3899817462079227, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -162815,10 +162815,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" }, "framework_target": { @@ -162828,7 +162828,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { @@ -163508,7 +163508,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 0.19540617195889354, + "duration_seconds": 0.1908741348888725, "framework": "backtrader", "framework_result": { "capabilities": { @@ -164187,10 +164187,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" }, "framework_target": { @@ -164200,12 +164200,12 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -164880,7 +164880,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 0.19547894108109176, + "duration_seconds": 0.21065902104601264, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165559,10 +165559,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" }, "framework_target": { @@ -165572,12 +165572,12 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -165730,7 +165730,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 0.1770279430784285, + "duration_seconds": 0.1838237678166479, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165879,10 +165879,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" }, "framework_target": { @@ -165892,12 +165892,12 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 20, @@ -166050,7 +166050,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 0.17615905008278787, + "duration_seconds": 0.18742704903706908, "framework": "backtrader", "framework_result": { "capabilities": { @@ -166199,10 +166199,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" }, "framework_target": { @@ -166212,12 +166212,12 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 20, @@ -166273,10 +166273,10 @@ "passed": true }, { - "actual": 177.48802034865972, + "actual": 177.4880203486597, "canonical_quantum": "0.00000001", "diagnostic_limit": 0.01, - "difference": 0.0, + "difference": 2.842170943040401e-14, "expected": 177.48802034865972, "message": "Backtrader=$177.4880203487, ML4T=$177.4880203487 (exact_diff=$0.0000000000; diagnostic_limit=$0.01)", "name": "total_commission", @@ -166902,7 +166902,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 0.19230420584790409, + "duration_seconds": 0.1971568139269948, "framework": "backtrader", "framework_result": { "capabilities": { @@ -167233,7 +167233,7 @@ "terminal": "native" }, "extra": { - "total_commission": 177.48802034865972 + "total_commission": 177.4880203486597 }, "fills": [ { @@ -167583,10 +167583,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" }, "framework_target": { @@ -167596,12 +167596,12 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -168286,7 +168286,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 0.19070344720967114, + "duration_seconds": 0.19473743089474738, "framework": "backtrader", "framework_result": { "capabilities": { @@ -168967,10 +168967,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "523af2137e8233ef65d03ffb841e91525f65f7c3057b3111e86aedbf0a973fb7" }, "framework_target": { @@ -168980,12 +168980,12 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -169660,7 +169660,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 0.18997658719308674, + "duration_seconds": 0.1950578459072858, "framework": "backtrader", "framework_result": { "capabilities": { @@ -170339,10 +170339,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" }, "framework_target": { @@ -170352,12 +170352,12 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -171032,7 +171032,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 0.19215964106842875, + "duration_seconds": 0.20610000379383564, "framework": "backtrader", "framework_result": { "capabilities": { @@ -171711,10 +171711,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" }, "framework_target": { @@ -171724,12 +171724,12 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -171930,7 +171930,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 0.1874006330035627, + "duration_seconds": 0.1911431299522519, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172133,10 +172133,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" }, "framework_target": { @@ -172146,12 +172146,12 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -172410,7 +172410,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 0.18735090689733624, + "duration_seconds": 0.1928136378992349, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172671,10 +172671,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "ca329113ef7eae6ef6cb075659587a244d4808ab35df74a891dcea2db9151f0e" }, "framework_target": { @@ -172684,12 +172684,12 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -173354,7 +173354,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 0.19880032702349126, + "duration_seconds": 0.20458918204531074, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174021,10 +174021,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" }, "framework_target": { @@ -174034,12 +174034,12 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 200, @@ -174240,7 +174240,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 0.1857105130329728, + "duration_seconds": 0.19500821898691356, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174443,10 +174443,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "55d713605da5bcb48c32d1d1f76e932117b7810ed367ea5f6e354c84503d3363", + "profile": "4dc2ca9d958a93592d8d31cfc054fccac9f460314cad187d221981191d6a9898", "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" }, "framework_target": { @@ -174456,12 +174456,12 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 100, @@ -174604,7 +174604,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 0.18179326900281012, + "duration_seconds": 0.19571567000821233, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174749,10 +174749,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" }, "framework_target": { @@ -174762,12 +174762,12 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 50, @@ -174910,7 +174910,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 0.17859415197744966, + "duration_seconds": 0.19319700193591416, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175055,10 +175055,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" }, "framework_target": { @@ -175068,12 +175068,12 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 50, @@ -175216,7 +175216,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 0.18483930104412138, + "duration_seconds": 0.18348273797892034, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175361,10 +175361,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" }, "framework_target": { @@ -175374,12 +175374,12 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 50, @@ -175986,7 +175986,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 0.3405823779758066, + "duration_seconds": 0.31646846095100045, "framework": "backtrader", "framework_result": { "capabilities": { @@ -176595,10 +176595,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "bc72a5d9db4a9da77165ea8d667819fba92dd6c85b0f99dad13d51552b7fb987", + "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" }, "framework_target": { @@ -176608,12 +176608,12 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 1500, @@ -212098,7 +212098,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 0.6032488059718162, + "duration_seconds": 0.5051041629631072, "framework": "backtrader", "framework_result": { "capabilities": { @@ -247587,10 +247587,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" }, "framework_target": { @@ -247600,12 +247600,12 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 1800, @@ -247975,7 +247975,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.004964594030753, + "duration_seconds": 2.0575591980013996, "framework": "zipline", "framework_result": { "capabilities": { @@ -248351,10 +248351,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d34babef0534a871f927ab6553a49d7b7e35a03283516b1741835d49381d2e0d" }, "framework_target": { @@ -248364,12 +248364,12 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -248739,7 +248739,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.0278703500516713, + "duration_seconds": 2.1073191261384636, "framework": "zipline", "framework_result": { "capabilities": { @@ -249115,10 +249115,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "7db3751b770b7369c40f6b31fc757e7949b07dd5b56430e7226dc8db7d444e38" }, "framework_target": { @@ -249128,12 +249128,12 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -249285,7 +249285,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 1.967110760975629, + "duration_seconds": 2.1081440050620586, "framework": "zipline", "framework_result": { "capabilities": { @@ -249437,10 +249437,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "289e2e7bbc4c64a281318ef3f25bbefe0a3e96c9393ee3e7672898f6c06a4f5c", + "profile": "28b180f9c05b5422cd2c453999768d0d8b12915b1cf2946fa4b7d912f7ced322", "scenario": "ad7292cedc685fa6c10032a0574f3e5da89b81dbb0f3a312cc2f5d83f5b454a1" }, "framework_target": { @@ -249450,12 +249450,12 @@ }, "input_digest": "c35f1e258ae4d0cd8eed9125a530bea473632a5bb3f4558583c0818700906e96", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 13, @@ -249607,7 +249607,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 1.979664044920355, + "duration_seconds": 1.9919104760047048, "framework": "zipline", "framework_result": { "capabilities": { @@ -249759,10 +249759,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "289e2e7bbc4c64a281318ef3f25bbefe0a3e96c9393ee3e7672898f6c06a4f5c", + "profile": "28b180f9c05b5422cd2c453999768d0d8b12915b1cf2946fa4b7d912f7ced322", "scenario": "2dea68c3a9472e95c15e7238928919fe01b4e63bfd3a14a5a9666ea89b86cc41" }, "framework_target": { @@ -249772,12 +249772,12 @@ }, "input_digest": "9f43427f7ad70fc963aeec58cf8867b5646e88bd608ec489964f802a2c98a57d", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 13, @@ -250157,7 +250157,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.0347821419127285, + "duration_seconds": 2.0461016981862485, "framework": "zipline", "framework_result": { "capabilities": { @@ -250537,10 +250537,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "93f5ba4a70377e12f472819a04fbceabb1a44df86108f5feed401a8499bd7b88" }, "framework_target": { @@ -250550,12 +250550,12 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -250935,7 +250935,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.0951536900829524, + "duration_seconds": 2.044092816999182, "framework": "zipline", "framework_result": { "capabilities": { @@ -251315,10 +251315,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "523af2137e8233ef65d03ffb841e91525f65f7c3057b3111e86aedbf0a973fb7" }, "framework_target": { @@ -251328,12 +251328,12 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -251703,7 +251703,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.009585133055225, + "duration_seconds": 2.0859753768891096, "framework": "zipline", "framework_result": { "capabilities": { @@ -252079,10 +252079,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "0eee68a74bb2c999c23582d129c81e91ad51b48af637e051507f8a40979c2871" }, "framework_target": { @@ -252092,12 +252092,12 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -252467,7 +252467,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.0269625219516456, + "duration_seconds": 2.0675931749865413, "framework": "zipline", "framework_result": { "capabilities": { @@ -252843,10 +252843,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d2d36326d5a7ec88f577088205574b8a9f6dab9661ed6813d190c138c4c8208f" }, "framework_target": { @@ -252856,12 +252856,12 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -253060,7 +253060,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 1.9936341198626906, + "duration_seconds": 2.194376523140818, "framework": "zipline", "framework_result": { "capabilities": { @@ -253265,10 +253265,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", "scenario": "80d8dea99e845ad7f708cc42fb94f66feababcf8b6814e3096300af1f4b709c2" }, "framework_target": { @@ -253278,12 +253278,12 @@ }, "input_digest": "de6e2060eccdf8f068669911169eb7a3d28af0622a7a840f637acb82db930a7e", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -253308,7 +253308,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 4.532048478722572e-06, + "duration_seconds": 4.029134288430214e-06, "framework": "zipline", "framework_result": null, "ml4t_result": null, @@ -253667,7 +253667,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.0319214940536767, + "duration_seconds": 2.1975450550671667, "framework": "zipline", "framework_result": { "capabilities": { @@ -254043,10 +254043,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "be9f469774faeb635ac0aee9f03aae638912f45c1e3011372f3e95c70e2a9c28", + "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", "scenario": "88c5993243d7dfa17cc8ed4d7979639e4846f1a3d5a9f1b62007e934bd9f73b5" }, "framework_target": { @@ -254056,12 +254056,12 @@ }, "input_digest": "517a65764277b104abf7848a9875d5f09febfddffb82d8fd9318f724ff1aaa86", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 137, @@ -254260,7 +254260,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.0088390049058944, + "duration_seconds": 2.162331265863031, "framework": "zipline", "framework_result": { "capabilities": { @@ -254465,10 +254465,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "0a07a9016d0aefe80ef3f3b91b88a8f2db5bc156849e54d232c6e3120652b767", + "profile": "1959f1b057e8b49dd44d9c7d7252eb2d9b40d1d7e035752ca4794fd596d502fd", "scenario": "51166032bf2c4582113ae77995f8db134af72ee7ccdca2dfa4b989fc48295e33" }, "framework_target": { @@ -254478,12 +254478,12 @@ }, "input_digest": "b211286d7dde78c905f246c3d56fb3c84b7f7de3c5f4a124c6b33680c37aa37d", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 69, @@ -254625,7 +254625,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 1.993454037932679, + "duration_seconds": 2.2323906030505896, "framework": "zipline", "framework_result": { "capabilities": { @@ -254773,10 +254773,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", "scenario": "b39049d150f6fc2c71a16c642dc255e53e92c4840e949226036d175bccc4e1b0" }, "framework_target": { @@ -254786,12 +254786,12 @@ }, "input_digest": "79590cf03ef0f3e90985c032e8f555ecdf9add3fc21908924a49e7d706b5f041", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 34, @@ -254933,7 +254933,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.1262002419680357, + "duration_seconds": 2.15216267388314, "framework": "zipline", "framework_result": { "capabilities": { @@ -255081,10 +255081,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", "scenario": "875c440f742f71bb0793ff5c4c6a1a0080b961930e6d2a24493cfa3e4c1d80b5" }, "framework_target": { @@ -255094,12 +255094,12 @@ }, "input_digest": "939287c002cf7b640b21c5859335249e1db1400c7d94dd37f62a7f078ba31fad", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 34, @@ -255241,7 +255241,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.012783998157829, + "duration_seconds": 2.19005371700041, "framework": "zipline", "framework_result": { "capabilities": { @@ -255389,10 +255389,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", "scenario": "fccddcd3455a97b6ce7c416cc2b41672c9d79511da75211739c16c90e940c969" }, "framework_target": { @@ -255402,12 +255402,12 @@ }, "input_digest": "935e7e58b70b2ff5c2181016ceae955c9aa4986a9e1d7653b63043d3be82a524", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 34, @@ -255777,7 +255777,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.472045441158116, + "duration_seconds": 2.576013322919607, "framework": "zipline", "framework_result": { "capabilities": { @@ -256153,10 +256153,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "623ee8eac5d0bd9bcb350f6bf81210775c7dcf743f3a2a0dc3de65a35123e912", + "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", "scenario": "0198df8bd89459f57967743d1f22954c5d08e535d28d96d9ab83461ca73d02b9" }, "framework_target": { @@ -256166,12 +256166,12 @@ }, "input_digest": "fc4132bd3907c4367265ff478960830680f88ab7df440ad0ec317ff5136c039c", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 1034, @@ -275465,7 +275465,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.8047522220294923, + "duration_seconds": 2.777995100012049, "framework": "zipline", "framework_result": { "capabilities": { @@ -294765,10 +294765,10 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "09f71d67d0d7cd5c2df40fbf72d12ff4bc5af1dac18623b0e1210d68748b0299", - "manifest": "be433a764ad746d8dcc45e1ce0ec010c90530caed3cd357df49c254b9bafbfd7", + "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", - "profile": "8f2464cbf407167dce7170f8e2a54a648b2b293ea872ff19bd033dea21741636", + "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", "scenario": "d0e0852cea9e321d72793f0f7fd7479d70d67ea3b367cbab817e4e3067af4e32" }, "framework_target": { @@ -294778,12 +294778,12 @@ }, "input_digest": "d8119bff0157cd31258a444fec247040af62a78f46aff8b484ad1b9ef8915516", "ml4t": { - "commit": "a40b5c246eedd918ac052475d505b4795e600eb5", + "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "record_counts": { "bars": 1241, From d7496d9e7bad6dd94086b9b8c5a1dc7ee02ee4eb Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 07:55:14 -0400 Subject: [PATCH 28/44] fix(validation): generate all current scale claims --- .../contracts/test_parity_claim_generation.py | 13 +++- validation/generate_parity_claims.py | 68 +++++++++++++------ 2 files changed, 57 insertions(+), 24 deletions(-) diff --git a/tests/contracts/test_parity_claim_generation.py b/tests/contracts/test_parity_claim_generation.py index c852ef1f..0a1f07f2 100644 --- a/tests/contracts/test_parity_claim_generation.py +++ b/tests/contracts/test_parity_claim_generation.py @@ -61,6 +61,7 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( correctness["records"].append(added) large_scale = generate_parity_claims._load_json(generate_parity_claims.LARGE_SCALE_EVIDENCE) monkeypatch.setattr(generate_parity_claims, "correctness_report_failures", lambda _: []) + monkeypatch.setattr(generate_parity_claims, "large_scale_report_failures", lambda _: []) claims = generate_parity_claims.render_claims(correctness, large_scale) @@ -69,8 +70,16 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( assert pin["source"] in claims assert f"`{pin['profile']}`" in claims assert "16/16 exact" in claims - assert "225,844 trades" in claims - assert "No large-scale claim is published for Backtrader" in claims + assert "250 assets and 5,040 daily sessions (1,260,000 bars)" in claims + for record in large_scale["frameworks"]: + target = record["target"] + checks = generate_parity_claims._comparison_checks(record) + assert f"`{target['profile']}`" in claims + assert target["version"] in claims + assert f"{checks['fills']['expected_count']:,}" in claims + assert f"{checks['trades']['expected_count']:,}" in claims + assert "validation/LARGE_SCALE_RESULTS.json" in claims + assert "No large-scale claim is published" not in claims failed_correctness = copy.deepcopy(correctness) failed_record = next( diff --git a/validation/generate_parity_claims.py b/validation/generate_parity_claims.py index a697bd6d..ac059cd2 100644 --- a/validation/generate_parity_claims.py +++ b/validation/generate_parity_claims.py @@ -10,11 +10,12 @@ from common.correctness_evidence import correctness_report_failures from common.framework_registry import load_framework_manifest +from large_scale_evidence import report_failures as large_scale_report_failures from scenarios.definitions import SCENARIOS PROJECT_ROOT = Path(__file__).parent.parent CORRECTNESS_EVIDENCE = PROJECT_ROOT / "validation" / "CORRECTNESS_RESULTS.json" -LARGE_SCALE_EVIDENCE = PROJECT_ROOT / "validation" / "vectorbt_pro" / "large_scale_parity.json" +LARGE_SCALE_EVIDENCE = PROJECT_ROOT / "validation" / "LARGE_SCALE_RESULTS.json" TARGETS = ( PROJECT_ROOT / "README.md", PROJECT_ROOT / "docs" / "index.md", @@ -50,8 +51,20 @@ def _validate_evidence(correctness: dict[str, Any], large_scale: dict[str, Any]) framework_records = [record for record in records if record.get("framework") == framework] if len(framework_records) != len(SCENARIOS): raise ValueError(f"Expected {len(SCENARIOS)} retained records for {framework}") - if large_scale.get("exact_comparison", {}).get("passed") is not True: - raise ValueError("Large-scale evidence is not an exact canonical pass") + scale_failures = large_scale_report_failures(large_scale) + if scale_failures: + raise ValueError("Accepted large-scale evidence is invalid: " + "; ".join(scale_failures)) + + +def _comparison_checks(record: dict[str, Any]) -> dict[str, dict[str, Any]]: + comparison = record.get("comparison") + if not isinstance(comparison, dict) or not isinstance(comparison.get("checks"), list): + raise ValueError(f"Large-scale comparison checks are missing: {record.get('framework')}") + return { + str(check["name"]): check + for check in comparison["checks"] + if isinstance(check, dict) and "name" in check + } def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> str: @@ -60,7 +73,7 @@ def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> s frameworks = correctness["frameworks"] records = correctness["records"] correctness_url = f"{GITHUB_EVIDENCE_ROOT}/CORRECTNESS_RESULTS.json" - large_scale_url = f"{GITHUB_EVIDENCE_ROOT}/vectorbt_pro/large_scale_parity.json" + large_scale_url = f"{GITHUB_EVIDENCE_ROOT}/LARGE_SCALE_RESULTS.json" rows = [] for framework in SCENARIO_FRAMEWORKS: @@ -80,36 +93,47 @@ def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> s f"[scenario evidence]({correctness_url}) |" ) - comparison = large_scale["exact_comparison"] - reference = large_scale["reference"] - large_row = ( - f"| `vectorbt_strict` | VectorBT Pro {reference['version']} " - f"(`{reference['git_commit'][:12]}`) | {comparison['trades']['count']:,} trades | " - f"0 | {comparison['terminal_value']['reference_canonical']:.6f} | " - f"[large-scale evidence]({large_scale_url}) |" - ) + scale_rows = [] + for record in large_scale["frameworks"]: + target = record["target"] + checks = _comparison_checks(record) + intents = checks["order_intents"]["expected_count"] + fills = checks["fills"]["expected_count"] + trades = checks["trades"]["expected_count"] + terminal_value = checks["final_value"]["canonical_expected"] + pinned_framework = f"[{target['display_name']} {target['version']}]({target['source']})" + scale_rows.append( + f"| `{target['profile']}` | {pinned_framework} | {intents:,} | {fills:,} | " + f"{trades:,} | {terminal_value:,.6f} | " + f"[scale evidence]({large_scale_url}) |" + ) + + workload = large_scale["workload"] + recipe = workload["recipe"] return "\n".join( [ START_MARKER, "", "", - 'Scenario claims use the retained release-candidate matrix. "Exact" means terminal ' - "values, ordered closed trades, and ordered fills match after 1e-8 quantization for " - "every retained surface the framework exposes.", + 'Scenario claims use the retained accepted matrix. "Exact" means terminal values, ' + "ordered closed trades, and ordered fills match after 1e-8 quantization. Each record " + "declares whether a surface is native, reconstructed, aggregate-only, input-only, or " + "unavailable; the claim does not extend to unavailable order-lifecycle fields.", "", "| Profile | Pinned framework | Required scenarios | Evidence |", "|---|---|---:|---|", *rows, "", - "Large-scale claims are published only when a retained workload has zero canonical gap.", - "", - "| Profile | Pinned framework | Compared | Trade gap | Terminal value | Evidence |", - "|---|---|---:|---:|---:|---|", - large_row, + f"The controlled scale workload contains {recipe['assets']:,} assets and " + f"{recipe['bars']:,} daily sessions ({workload['data_points']:,} bars). Every row " + "has zero canonical gap for target intents, native fills, closed trades reconstructed " + "from those fills, and terminal state reconstructed from the fill ledger and final " + "marks.", "", - "No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN " - "without a passing retained artifact.", + "| Profile | Current framework | Target intents | Native fills | Fill-derived closed trades | Terminal value | Evidence |", + "|---|---|---:|---:|---:|---:|---|", + *scale_rows, END_MARKER, ] ) From 0315119acc05796d95cc3c344a0418007dde6cbc Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 08:05:35 -0400 Subject: [PATCH 29/44] feat(validation): add cross-framework performance evidence --- .../test_cross_framework_performance.py | 163 +++ validation/cross_framework_performance.py | 949 ++++++++++++++++++ 2 files changed, 1112 insertions(+) create mode 100644 tests/contracts/test_cross_framework_performance.py create mode 100644 validation/cross_framework_performance.py diff --git a/tests/contracts/test_cross_framework_performance.py b/tests/contracts/test_cross_framework_performance.py new file mode 100644 index 00000000..2851aaeb --- /dev/null +++ b/tests/contracts/test_cross_framework_performance.py @@ -0,0 +1,163 @@ +"""Contracts for repeated cross-framework performance evidence.""" + +from __future__ import annotations + +import copy +import json +from pathlib import Path + +import pytest + +from validation import cross_framework_performance as performance + + +def _sample(runner: performance.RunnerSpec, index: int = 0) -> dict: + target = performance.load_framework_manifest().targets[runner.framework] + target_metadata = {**target.evidence_metadata(), "actual_version": target.version} + if runner.framework == "vectorbt_pro": + target_metadata.update( + { + "actual_commit": target.source_commit, + "actual_immutable_id": target.immutable_id, + } + ) + input_sha256 = performance.scale._expected_input_digest(performance.WORKLOAD) + output = { + "order_intents": {"count": 1, "sha256": "a" * 64}, + "fills": {"count": 1, "sha256": "b" * 64}, + "trades": {"count": 1, "sha256": "c" * 64}, + "trade_count": 1, + "total_pnl": 1.0, + "final_value": 1_000_001.0, + "terminal_state_sha256": "d" * 64, + } + return { + "runner_id": runner.runner_id, + "framework": runner.framework, + "side": runner.side, + "profile": runner.profile, + "target": target_metadata, + "python": {"implementation": "cpython", "version": "3.12.11"}, + "ml4t": {"commit": "a" * 40, "dirty": False}, + "input": {"raw_sha256": input_sha256, "effective_sha256": input_sha256}, + "stages_seconds": { + "input_generation": 0.01, + "framework_call": 0.1 + index / 1_000, + "adapter_reported_engine": 0.08 + index / 1_000, + "output_validation": 0.01, + "worker_total": 0.12 + index / 1_000, + }, + "process_peak_rss_mb": 100.0 + index, + "worker_self_peak_rss_mb": 90.0 + index, + "process_wall_seconds": 0.2 + index / 100, + "lean_container_observed": True, + "thread_environment": performance.THREAD_ENVIRONMENT, + "output": output, + "output_sha256": performance._json_digest(output), + "captured_log_tail": "", + } + + +def test_bootstrap_interval_is_reproducible_and_requires_ten_samples() -> None: + values = [float(value) for value in range(10)] + + first = performance.bootstrap_median_interval(values, seed=7) + second = performance.bootstrap_median_interval(values, seed=7) + + assert first == second + assert first[0] <= 4.5 <= first[1] + with pytest.raises(ValueError, match="At least 10"): + performance.bootstrap_median_interval(values[:9], seed=7) + + +def test_instrumentation_calibration_measures_child_wall_time_and_rss() -> None: + result = performance.run_calibration_process() + + assert result["allocated_bytes"] == 32 * 1024 * 1024 + assert result["worker_seconds"] >= 0.02 + assert result["process_wall_seconds"] >= result["worker_seconds"] + assert result["process_peak_rss_mb"] >= 20 + + +def test_protocol_identity_changes_with_setup_or_cache_boundary() -> None: + original = performance._json_digest(performance.MEASUREMENT_PROTOCOL) + changed = copy.deepcopy(performance.MEASUREMENT_PROTOCOL) + changed["cache_policy"] = "different" + + assert performance._json_digest(changed) != original + + +def test_complete_report_recomputes_raw_sample_summaries( + monkeypatch: pytest.MonkeyPatch, +) -> None: + calibration = { + "allocated_bytes": 32 * 1024 * 1024, + "worker_seconds": 0.025, + "process_wall_seconds": 0.03, + "process_peak_rss_mb": 40.0, + } + monkeypatch.setattr(performance, "run_calibration_process", lambda: calibration) + calls = {runner.runner_id: 0 for runner in performance.RUNNERS} + + def run(runner: performance.RunnerSpec) -> dict: + index = calls[runner.runner_id] + calls[runner.runner_id] += 1 + return _sample(runner, max(index - 1, 0)) + + monkeypatch.setattr(performance, "_run_process", run) + + report = performance.collect_evidence(10) + + assert performance.report_failures(report) == [] + assert report["controlled"]["passed"] is True + assert report["idiomatic"]["equivalence_claim"] is False + assert all(len(runner["samples"]) == 10 for runner in report["runners"].values()) + + +def test_output_change_or_missing_runner_fails_closed(monkeypatch: pytest.MonkeyPatch) -> None: + calibration = { + "allocated_bytes": 32 * 1024 * 1024, + "worker_seconds": 0.025, + "process_wall_seconds": 0.03, + "process_peak_rss_mb": 40.0, + } + monkeypatch.setattr(performance, "run_calibration_process", lambda: calibration) + monkeypatch.setattr(performance, "_run_process", lambda runner: _sample(runner)) + report = performance.collect_evidence(10) + + changed = copy.deepcopy(report) + changed["runners"]["backtrader:ml4t"]["samples"][0]["output_sha256"] = "0" * 64 + assert performance.report_failures(changed) + + missing = copy.deepcopy(report) + del missing["runners"]["zipline:external"] + assert performance.report_failures(missing) + + +def test_worker_uses_profile_specific_ml4t_side(monkeypatch: pytest.MonkeyPatch) -> None: + runner = performance.RUNNERS_BY_ID["backtrader:ml4t"] + captured: dict[str, object] = {} + + def benchmark(*_args, **kwargs): + captured.update(kwargs) + return object() + + monkeypatch.setattr(performance.suite, "benchmark_ml4t", benchmark) + + result = performance._run_ml4t(runner, object(), {}, object(), object()) + + assert result is not None + assert captured == { + "execution_mode": "next_bar", + "profile_override": "backtrader_strict", + } + + +def test_accepted_write_is_atomic(tmp_path: Path) -> None: + target = tmp_path / "accepted.json" + target.write_text("old\n", encoding="utf-8") + + performance._write_json_atomic(target, {"value": 1}) + + assert json.loads(target.read_text(encoding="utf-8")) == {"value": 1} + assert list(tmp_path.iterdir()) == [target] diff --git a/validation/cross_framework_performance.py b/validation/cross_framework_performance.py new file mode 100644 index 00000000..ba8b101b --- /dev/null +++ b/validation/cross_framework_performance.py @@ -0,0 +1,949 @@ +#!/usr/bin/env python3 +"""Generate controlled and idiomatic cross-framework performance evidence.""" + +from __future__ import annotations + +import argparse +import hashlib +import http.client +import json +import os +import platform +import random +import socket +import subprocess +import sys +import tempfile +import urllib.parse +from contextlib import redirect_stdout +from dataclasses import asdict, dataclass +from datetime import UTC, datetime +from io import StringIO +from pathlib import Path +from statistics import median +from time import perf_counter, sleep +from typing import Any, cast + +VALIDATION_DIR = Path(__file__).parent +PROJECT_ROOT = VALIDATION_DIR.parent +sys.path.insert(0, str(PROJECT_ROOT)) +sys.path.insert(0, str(PROJECT_ROOT / "src")) +sys.path.insert(0, str(VALIDATION_DIR)) + +import benchmark_suite as suite # noqa: E402 +import large_scale_evidence as scale # noqa: E402 +from common.framework_registry import load_framework_manifest # noqa: E402 + +SCHEMA_VERSION = 1 +MIN_SAMPLES = 10 +BOOTSTRAP_RESAMPLES = 10_000 +BOOTSTRAP_CONFIDENCE = 0.95 +WORKER_TIMEOUT_SECONDS = 900 +ACCEPTED_PATH = VALIDATION_DIR / "PERFORMANCE_RESULTS.json" +CANDIDATE_PATH = VALIDATION_DIR / "candidates" / "PERFORMANCE_RESULTS.candidate.json" +THREAD_ENVIRONMENT = { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0", +} +MEASUREMENT_PROTOCOL = { + "process_isolation": "one fresh child process per warm-up and measured repetition", + "warmup": "one unmeasured isolated process per runner before measured repetitions", + "runtime_primary": ( + "parent perf_counter around the complete child process, including interpreter startup, " + "imports, deterministic input generation, adapter setup, engine execution, output " + "extraction, canonical validation, and process teardown" + ), + "runtime_secondary": "adapter-reported engine interval and worker stage intervals", + "memory": "child resource.getrusage(RUSAGE_SELF).ru_maxrss over the complete process", + "cache_policy": ( + "installed packages and compiled framework caches persist; inputs and framework state are " + "rebuilt in every child; Zipline uses a new bundle root for every child" + ), + "thread_environment": THREAD_ENVIRONMENT, + "uncertainty": { + "method": "deterministic percentile bootstrap of the sample median", + "confidence": BOOTSTRAP_CONFIDENCE, + "resamples": BOOTSTRAP_RESAMPLES, + }, +} + + +@dataclass(frozen=True) +class RunnerSpec: + """One framework side measured in its locked environment.""" + + runner_id: str + framework: str + side: str + profile: str + + +WORKLOAD = scale.ScaleWorkload( + name="performance_50_assets_252_sessions", + seed=42, + bars=252, + assets=50, + top_n=5, + bottom_n=5, + rebalance_frequency=1, + end_session="2025-12-31", +) + +RUNNERS = tuple( + runner + for framework, profile in ( + ("vectorbt_pro", "vectorbt_strict"), + ("vectorbt_oss", "vectorbt_oss_strict"), + ("backtrader", "backtrader_strict"), + ("zipline", "zipline_strict"), + ("lean", "lean"), + ) + for runner in ( + RunnerSpec(f"{framework}:external", framework, "external", profile), + RunnerSpec(f"{framework}:ml4t", framework, "ml4t", profile), + ) +) +RUNNERS_BY_ID = {runner.runner_id: runner for runner in RUNNERS} + +IDIOMATIC_RUNNERS = { + "ml4t_backtest": "vectorbt_oss:ml4t", + "vectorbt_pro": "vectorbt_pro:external", + "vectorbt_oss": "vectorbt_oss:external", + "backtrader": "backtrader:external", + "zipline": "zipline:external", + "lean": "lean:external", +} +IDIOMATIC_DISCLOSURES = { + "ml4t_backtest": ( + "Event-driven Strategy and Engine API with the vectorbt_oss_strict profile; this is one " + "documented ML4T configuration, not a framework-wide default-performance claim." + ), + "vectorbt_pro": ( + "Vectorized Portfolio.from_orders target-amount API with cash sharing, same-bar close " + "execution, zero costs, and locked short collateral." + ), + "vectorbt_oss": ( + "Vectorized Portfolio.from_orders target-amount API with cash sharing, same-bar close " + "execution, zero costs, and lock_cash enabled." + ), + "backtrader": ( + "Native Cerebro and Strategy callbacks with target orders, next-session open fills, " + "integer shares, zero commission, and enabled submission cash checks." + ), + "zipline": ( + "Native run_algorithm callback and order_target API with daily bundle ingestion, a custom " + "open-price slippage model, and zero commission. Bundle creation is included." + ), + "lean": ( + "Native QCAlgorithm daily callback and market-order API in the frozen LEAN image with the " + "declared margin account, zero fee, and zero slippage models." + ), +} + + +def _json_digest(value: object) -> str: + return hashlib.sha256( + json.dumps(value, sort_keys=True, separators=(",", ":"), default=str).encode() + ).hexdigest() + + +def _source_digests() -> dict[str, str]: + paths = { + "benchmark_suite": VALIDATION_DIR / "benchmark_suite.py", + "framework_manifest": VALIDATION_DIR / "framework_targets.toml", + "performance_runner": Path(__file__), + "profiles": PROJECT_ROOT / "src" / "ml4t" / "backtest" / "profiles.py", + } + return {name: hashlib.sha256(path.read_bytes()).hexdigest() for name, path in paths.items()} + + +def _git_identity() -> dict[str, object]: + commit = subprocess.run( + ["git", "rev-parse", "HEAD"], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.strip() + status = subprocess.run( + ["git", "status", "--porcelain", "--untracked-files=no"], + cwd=PROJECT_ROOT, + check=True, + capture_output=True, + text=True, + ).stdout.strip() + return {"commit": commit, "dirty": bool(status)} + + +def _peak_rss_mb() -> float: + import resource + + peak = float(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss) + return peak / (1024 * 1024) if sys.platform == "darwin" else peak / 1024 + + +def _process_tree_rss_bytes(root_pid: int) -> int: + """Return current RSS for a Linux process and all current descendants.""" + pending = [root_pid] + observed: set[int] = set() + total = 0 + while pending: + pid = pending.pop() + if pid in observed: + continue + observed.add(pid) + try: + status = Path(f"/proc/{pid}/status").read_text(encoding="utf-8") + rss_line = next( + (line for line in status.splitlines() if line.startswith("VmRSS:")), + "VmRSS: 0 kB", + ) + total += int(rss_line.split()[1]) * 1024 + children = Path(f"/proc/{pid}/task/{pid}/children").read_text(encoding="utf-8") + pending.extend(int(child) for child in children.split()) + except (FileNotFoundError, PermissionError, ProcessLookupError, ValueError): + continue + return total + + +class _DockerConnection(http.client.HTTPConnection): + def connect(self) -> None: + self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.connect("/var/run/docker.sock") + + +def _docker_json(path: str) -> Any: + connection = _DockerConnection("localhost", timeout=1.0) + try: + connection.request("GET", path) + response = connection.getresponse() + payload = response.read() + if response.status != 200: + raise RuntimeError(f"Docker API {path} returned {response.status}") + return json.loads(payload) + finally: + connection.close() + + +def _docker_container_ids(ancestor: str) -> set[str]: + filters = urllib.parse.quote(json.dumps({"ancestor": [ancestor]}, separators=(",", ":"))) + payload = _docker_json(f"/containers/json?filters={filters}") + if not isinstance(payload, list): + raise RuntimeError("Docker container list was not an array") + return {str(container["Id"]) for container in payload if isinstance(container, dict)} + + +def _docker_container_pid(container_id: str) -> int | None: + payload = _docker_json(f"/containers/{container_id}/json") + if not isinstance(payload, dict) or not isinstance(payload.get("State"), dict): + return None + pid = payload["State"].get("Pid") + return int(pid) if isinstance(pid, int) and pid > 0 else None + + +def _container_cgroup_memory_path(pid: int) -> Path | None: + try: + entries = Path(f"/proc/{pid}/cgroup").read_text(encoding="utf-8").splitlines() + except (FileNotFoundError, PermissionError, ProcessLookupError): + return None + for entry in entries: + parts = entry.split(":", 2) + if len(parts) == 3 and parts[0] == "0": + path = Path("/sys/fs/cgroup") / parts[2].lstrip("/") / "memory.current" + return path if path.is_file() else None + return None + + +def _execute_with_memory_monitor( + command: list[str], + *, + cwd: Path, + env: dict[str, str], + timeout: float, + docker_ancestor: str | None = None, +) -> tuple[subprocess.CompletedProcess[str], float, float, bool]: + """Execute a worker while sampling its process tree and optional container cgroup.""" + existing_containers = ( + _docker_container_ids(docker_ancestor) if docker_ancestor is not None else set() + ) + started = perf_counter() + process = subprocess.Popen( + command, + cwd=cwd, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + peak_bytes = 0 + container_path: Path | None = None + container_observed = docker_ancestor is None + next_docker_poll = started + deadline = started + timeout + while process.poll() is None: + if perf_counter() > deadline: + process.kill() + stdout, stderr = process.communicate() + raise RuntimeError( + f"Performance worker exceeded {timeout:.0f}s: {(stderr or stdout).strip()[-2_000:]}" + ) + tree_bytes = _process_tree_rss_bytes(process.pid) + container_bytes = 0 + if ( + docker_ancestor is not None + and container_path is None + and perf_counter() >= next_docker_poll + ): + next_docker_poll = perf_counter() + 0.1 + current = _docker_container_ids(docker_ancestor) - existing_containers + if current: + container_id = sorted(current)[0] + container_pid = _docker_container_pid(container_id) + if container_pid is not None: + container_path = _container_cgroup_memory_path(container_pid) + container_observed = container_path is not None + if container_path is not None: + try: + container_bytes = int(container_path.read_text(encoding="utf-8").strip()) + except (FileNotFoundError, PermissionError, ProcessLookupError, ValueError): + container_path = None + peak_bytes = max(peak_bytes, tree_bytes + container_bytes) + sleep(0.02) + peak_bytes = max(peak_bytes, _process_tree_rss_bytes(process.pid)) + stdout, stderr = process.communicate() + completed = subprocess.CompletedProcess(command, process.returncode, stdout, stderr) + return completed, perf_counter() - started, peak_bytes / (1024 * 1024), container_observed + + +def _run_external( + framework: str, + config: suite.BenchmarkConfig, + price_data: dict[str, Any], + signals: Any, + dates: Any, +) -> suite.BenchmarkResult: + runners = { + "vectorbt_pro": suite.benchmark_vectorbt_pro, + "vectorbt_oss": suite.benchmark_vectorbt_oss, + "backtrader": suite.benchmark_backtrader, + "zipline": suite.benchmark_zipline, + "lean": suite.benchmark_lean, + } + return runners[framework](config, price_data, signals, dates) + + +def _run_ml4t( + runner: RunnerSpec, + config: suite.BenchmarkConfig, + price_data: dict[str, Any], + signals: Any, + dates: Any, +) -> suite.BenchmarkResult: + execution_mode = "same_bar" if runner.framework.startswith("vectorbt") else "next_bar" + return suite.benchmark_ml4t( + config, + price_data, + signals, + dates, + execution_mode=execution_mode, + profile_override=runner.profile, + ) + + +def _surface_signature(result: suite.BenchmarkResult, effective_prices: dict[str, Any]) -> dict: + result.trades_df = suite.closed_trades_from_fills(result.fills_df) + trade_records = suite.canonical_trade_records(result.trades_df, timestamp_domain="session_date") + result.num_trades = len(trade_records) if trade_records is not None else 0 + intents = suite.canonical_target_records(result.target_trace_df) + fills = suite.canonical_fill_records(result.fills_df, timestamp_domain="session_date") + trades = trade_records + if intents is None or fills is None or trades is None: + raise RuntimeError("Performance runner did not expose every controlled output surface") + terminal = scale._terminal_state(result, effective_prices, WORKLOAD.initial_cash) + return { + "order_intents": {"count": len(intents), "sha256": suite._records_hash(intents)}, + "fills": {"count": len(fills), "sha256": suite._records_hash(fills)}, + "trades": {"count": len(trades), "sha256": suite._records_hash(trades)}, + "trade_count": len(trades), + "total_pnl": scale._canonical_money(result.final_value - WORKLOAD.initial_cash), + "final_value": scale._canonical_money(result.final_value), + "terminal_state_sha256": terminal["sha256"], + } + + +def run_worker(runner: RunnerSpec) -> dict[str, Any]: + """Run one measured framework side and return its validated output signature.""" + started = perf_counter() + manifest = load_framework_manifest() + target = manifest.targets[runner.framework] + actual_target = scale._actual_target(target) + config = WORKLOAD.benchmark_config() + + input_started = perf_counter() + price_data, signals, dates = suite.generate_benchmark_data(config, seed=WORKLOAD.seed) + raw_input_sha256 = scale.input_digest(price_data, signals, dates) + effective_prices = scale._effective_prices(runner.framework, price_data) + effective_input_sha256 = scale.input_digest(effective_prices, signals, dates) + input_seconds = perf_counter() - input_started + + framework_started = perf_counter() + output_log = StringIO() + with redirect_stdout(output_log): + if runner.framework == "zipline": + with tempfile.TemporaryDirectory(prefix="ml4t-performance-zipline-") as root: + previous_root = os.environ.get("ZIPLINE_ROOT") + os.environ["ZIPLINE_ROOT"] = root + try: + result = ( + _run_external(runner.framework, config, price_data, signals, dates) + if runner.side == "external" + else _run_ml4t(runner, config, price_data, signals, dates) + ) + finally: + if previous_root is None: + os.environ.pop("ZIPLINE_ROOT", None) + else: + os.environ["ZIPLINE_ROOT"] = previous_root + else: + result = ( + _run_external(runner.framework, config, price_data, signals, dates) + if runner.side == "external" + else _run_ml4t(runner, config, price_data, signals, dates) + ) + framework_call_seconds = perf_counter() - framework_started + if result.error is not None: + raise RuntimeError(f"{runner.runner_id} failed: {result.error}") + + validation_started = perf_counter() + signature = _surface_signature(result, effective_prices) + validation_seconds = perf_counter() - validation_started + return { + "runner_id": runner.runner_id, + "framework": runner.framework, + "side": runner.side, + "profile": runner.profile, + "target": actual_target, + "python": { + "implementation": sys.implementation.name, + "version": platform.python_version(), + }, + "ml4t": _git_identity(), + "input": { + "raw_sha256": raw_input_sha256, + "effective_sha256": effective_input_sha256, + }, + "stages_seconds": { + "input_generation": input_seconds, + "framework_call": framework_call_seconds, + "adapter_reported_engine": result.runtime_sec, + "output_validation": validation_seconds, + "worker_total": perf_counter() - started, + }, + "process_peak_rss_mb": _peak_rss_mb(), + "thread_environment": {key: os.environ.get(key) for key in sorted(THREAD_ENVIRONMENT)}, + "output": signature, + "output_sha256": _json_digest(signature), + "captured_log_tail": output_log.getvalue()[-2_000:], + } + + +def run_calibration_worker() -> dict[str, Any]: + """Exercise wall-time and peak-RSS instrumentation with known work.""" + started = perf_counter() + allocation = bytearray(32 * 1024 * 1024) + allocation[0] = 1 + sleep(0.025) + return { + "worker_seconds": perf_counter() - started, + "process_peak_rss_mb": _peak_rss_mb(), + "allocated_bytes": len(allocation), + } + + +def _resolve_python(runner: RunnerSpec) -> Path: + target = load_framework_manifest().targets[runner.framework] + override = os.getenv(target.python_env_var or "") + if override: + return Path(override).expanduser().resolve() + if target.environment is None: + raise RuntimeError(f"No environment configured for {runner.framework}") + return PROJECT_ROOT / target.environment / "bin" / "python" + + +def _write_json(path: Path, payload: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(payload, indent=2, sort_keys=True) + "\n", encoding="utf-8") + + +def _write_json_atomic(path: Path, payload: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + serialized = json.dumps(payload, indent=2, sort_keys=True) + "\n" + with tempfile.NamedTemporaryFile( + mode="w", + encoding="utf-8", + dir=path.parent, + prefix=f".{path.name}.", + delete=False, + ) as handle: + temporary = Path(handle.name) + handle.write(serialized) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, path) + + +def _run_process(runner: RunnerSpec) -> dict[str, Any]: + interpreter = _resolve_python(runner) + if not interpreter.is_file(): + raise RuntimeError(f"Missing interpreter for {runner.runner_id}: {interpreter}") + with tempfile.TemporaryDirectory(prefix="ml4t-performance-worker-") as directory: + output = Path(directory) / "sample.json" + command = [ + str(interpreter), + str(Path(__file__).resolve()), + "--worker", + runner.runner_id, + "--output", + str(output), + ] + environment = os.environ.copy() + environment.update(THREAD_ENVIRONMENT) + paths = [str(PROJECT_ROOT / "src"), str(VALIDATION_DIR)] + sibling_specs = PROJECT_ROOT.parent / "ml4t-specs" / "src" + if sibling_specs.is_dir(): + paths.append(str(sibling_specs)) + environment["PYTHONPATH"] = os.pathsep.join( + paths + ([environment["PYTHONPATH"]] if environment.get("PYTHONPATH") else []) + ) + docker_ancestor = None + if runner.runner_id == "lean:external": + docker_ancestor = load_framework_manifest().targets["lean"].artifact + if docker_ancestor is None: + raise RuntimeError("LEAN target lacks an immutable engine image") + completed, process_wall_seconds, monitored_peak_rss_mb, container_observed = ( + _execute_with_memory_monitor( + command, + cwd=PROJECT_ROOT, + env=environment, + timeout=WORKER_TIMEOUT_SECONDS, + docker_ancestor=docker_ancestor, + ) + ) + if completed.returncode != 0 or not output.is_file(): + details = "\n".join( + value.strip() for value in (completed.stdout, completed.stderr) if value.strip() + ) + raise RuntimeError( + f"Performance worker {runner.runner_id} exited {completed.returncode}: " + f"{details[-10_000:]}" + ) + sample = cast(dict[str, Any], json.loads(output.read_text(encoding="utf-8"))) + sample["process_wall_seconds"] = process_wall_seconds + sample["worker_self_peak_rss_mb"] = sample.pop("process_peak_rss_mb") + sample["process_peak_rss_mb"] = monitored_peak_rss_mb + sample["lean_container_observed"] = container_observed + return sample + + +def run_calibration_process() -> dict[str, Any]: + with tempfile.TemporaryDirectory(prefix="ml4t-performance-calibration-") as directory: + output = Path(directory) / "calibration.json" + command = [ + sys.executable, + str(Path(__file__).resolve()), + "--calibration-worker", + "--output", + str(output), + ] + started = perf_counter() + completed = subprocess.run(command, check=False, timeout=60) + wall_seconds = perf_counter() - started + if completed.returncode != 0 or not output.is_file(): + raise RuntimeError("Performance instrumentation calibration failed") + result = cast(dict[str, Any], json.loads(output.read_text(encoding="utf-8"))) + result["process_wall_seconds"] = wall_seconds + return result + + +def _percentile(values: list[float], probability: float) -> float: + position = probability * (len(values) - 1) + lower = int(position) + upper = min(lower + 1, len(values) - 1) + fraction = position - lower + return values[lower] * (1.0 - fraction) + values[upper] * fraction + + +def bootstrap_median_interval(values: list[float], *, seed: int) -> list[float]: + """Return a deterministic percentile-bootstrap 95 percent median interval.""" + if len(values) < MIN_SAMPLES: + raise ValueError(f"At least {MIN_SAMPLES} samples are required") + generator = random.Random(seed) + estimates = sorted( + median(generator.choices(values, k=len(values))) for _ in range(BOOTSTRAP_RESAMPLES) + ) + tail = (1.0 - BOOTSTRAP_CONFIDENCE) / 2.0 + return [_percentile(estimates, tail), _percentile(estimates, 1.0 - tail)] + + +def _summary(samples: list[dict[str, Any]], key: str, *, seed: int) -> dict[str, Any]: + values = [float(sample[key]) for sample in samples] + return { + "median": median(values), + "ci95": bootstrap_median_interval(values, seed=seed), + "minimum": min(values), + "maximum": max(values), + } + + +def _runner_evidence( + runner: RunnerSpec, + warmup: dict[str, Any], + samples: list[dict[str, Any]], +) -> dict[str, Any]: + seed = int(hashlib.sha256(runner.runner_id.encode()).hexdigest()[:8], 16) + output_sha256 = str(warmup["output_sha256"]) + passed = all(sample.get("output_sha256") == output_sha256 for sample in samples) + return { + "runner": asdict(runner), + "target": warmup["target"], + "python": warmup["python"], + "warmup": { + "output_sha256": output_sha256, + "process_wall_seconds": warmup["process_wall_seconds"], + }, + "output": warmup["output"], + "output_sha256": output_sha256, + "process_wall_seconds": _summary(samples, "process_wall_seconds", seed=seed), + "process_peak_rss_mb": _summary(samples, "process_peak_rss_mb", seed=seed + 1), + "adapter_engine_seconds": _summary( + [{"value": sample["stages_seconds"]["adapter_reported_engine"]} for sample in samples], + "value", + seed=seed + 2, + ), + "samples": samples, + "passed": passed, + } + + +def _host_metadata() -> dict[str, Any]: + cpu_model = "" + cpuinfo = Path("/proc/cpuinfo") + if cpuinfo.is_file(): + for line in cpuinfo.read_text(encoding="utf-8", errors="replace").splitlines(): + if line.lower().startswith("model name"): + cpu_model = line.split(":", 1)[1].strip() + break + return { + "platform": platform.platform(), + "machine": platform.machine(), + "processor": platform.processor(), + "cpu_model": cpu_model, + "logical_cpu_count": os.cpu_count(), + "python": platform.python_version(), + } + + +def _capability_matrix() -> list[dict[str, Any]]: + return [ + { + "workload": WORKLOAD.name, + "dimensions": f"{WORKLOAD.assets} assets x {WORKLOAD.bars} daily sessions", + "coverage": list(scale.FRAMEWORKS), + "use": "controlled and idiomatic repeated performance evidence", + }, + { + "workload": scale.WORKLOAD.name, + "dimensions": f"{scale.WORKLOAD.assets} assets x {scale.WORKLOAD.bars} daily sessions", + "coverage": list(scale.FRAMEWORKS), + "use": "large-scale equivalence only; recorded runtimes are not performance claims", + }, + { + "workload": "historical_real_250_assets_5040_sessions", + "dimensions": "250 assets x 5,040 daily sessions", + "coverage": ["vectorbt_oss", "backtrader", "zipline", "lean"], + "use": ( + "superseded audit input; single samples, inconsistent setup boundaries, missing " + "peak RSS for LEAN, and a non-reconstructable temporary data path" + ), + }, + { + "workload": "performance_baselines.json workloads", + "dimensions": "single-asset, 250-asset, quote, rebalance, and partial-fill workloads", + "coverage": ["ml4t_backtest"], + "use": "internal regression evidence; not a cross-framework comparison", + }, + ] + + +def collect_evidence(samples: int) -> dict[str, Any]: + """Warm every runner, interleave measured repetitions, and build both tracks.""" + if samples < MIN_SAMPLES: + raise ValueError(f"At least {MIN_SAMPLES} measured samples are required") + calibration = run_calibration_process() + if ( + calibration["allocated_bytes"] != 32 * 1024 * 1024 + or calibration["worker_seconds"] < 0.02 + or calibration["process_wall_seconds"] < calibration["worker_seconds"] + or calibration["process_peak_rss_mb"] < 20 + ): + raise RuntimeError(f"Performance instrumentation calibration failed: {calibration}") + + warmups: dict[str, dict[str, Any]] = {} + measured: dict[str, list[dict[str, Any]]] = {runner.runner_id: [] for runner in RUNNERS} + for runner in RUNNERS: + print(f"Warming {runner.runner_id}...", flush=True) + warmups[runner.runner_id] = _run_process(runner) + for repetition in range(samples): + offset = repetition % len(RUNNERS) + ordered = RUNNERS[offset:] + RUNNERS[:offset] + for runner in ordered: + print( + f"Measuring {runner.runner_id} sample {repetition + 1}/{samples}...", + flush=True, + ) + measured[runner.runner_id].append(_run_process(runner)) + + runners = { + runner.runner_id: _runner_evidence( + runner, + warmups[runner.runner_id], + measured[runner.runner_id], + ) + for runner in RUNNERS + } + pairs: dict[str, dict[str, Any]] = {} + for framework in scale.FRAMEWORKS: + external = runners[f"{framework}:external"] + ml4t = runners[f"{framework}:ml4t"] + exact = external["output"] == ml4t["output"] + pairs[framework] = { + "external_runner": f"{framework}:external", + "ml4t_runner": f"{framework}:ml4t", + "exact_output": exact, + "passed": bool(exact and external["passed"] and ml4t["passed"]), + } + + idiomatic = { + name: { + "sample_source": runner_id, + "semantic_disclosure": IDIOMATIC_DISCLOSURES[name], + "invariants_passed": runners[runner_id]["passed"], + } + for name, runner_id in IDIOMATIC_RUNNERS.items() + } + controlled_passed = all(pair["passed"] for pair in pairs.values()) + idiomatic_passed = all(entry["invariants_passed"] for entry in idiomatic.values()) + return { + "schema_version": SCHEMA_VERSION, + "generated_at": datetime.now(UTC).isoformat(), + "workload": { + "recipe": asdict(WORKLOAD), + "recipe_sha256": _json_digest(asdict(WORKLOAD)), + "data_points": WORKLOAD.data_points, + }, + "measurement_protocol": MEASUREMENT_PROTOCOL, + "protocol_sha256": _json_digest(MEASUREMENT_PROTOCOL), + "samples_per_runner": samples, + "host": _host_metadata(), + "calibration": calibration, + "source_digests": _source_digests(), + "runners": runners, + "controlled": { + "equivalence_required": True, + "pairs": pairs, + "passed": controlled_passed, + }, + "idiomatic": { + "equivalence_claim": False, + "runners": idiomatic, + "passed": idiomatic_passed, + }, + "capability_matrix": _capability_matrix(), + "historical_assessment": { + "comparable_to_current_measurements": False, + "reason": ( + "The 2026-02-28 artifacts used one sample, inconsistent setup boundaries, old " + "framework revisions, different hardware provenance, and incomplete memory data." + ), + }, + "release_gate_passed": controlled_passed and idiomatic_passed, + } + + +def report_failures(report: dict[str, Any]) -> list[str]: + """Return every reason performance evidence cannot be accepted.""" + failures: list[str] = [] + if report.get("schema_version") != SCHEMA_VERSION: + return [f"Unsupported performance schema: {report.get('schema_version')!r}"] + workload = report.get("workload") + if not isinstance(workload, dict) or workload.get("recipe") != asdict(WORKLOAD): + failures.append("Performance workload recipe differs") + elif workload.get("recipe_sha256") != _json_digest(asdict(WORKLOAD)): + failures.append("Performance workload recipe digest differs") + if report.get("measurement_protocol") != MEASUREMENT_PROTOCOL: + failures.append("Performance measurement protocol differs") + if report.get("protocol_sha256") != _json_digest(MEASUREMENT_PROTOCOL): + failures.append("Performance protocol digest differs") + samples_per_runner = report.get("samples_per_runner") + if not isinstance(samples_per_runner, int) or samples_per_runner < MIN_SAMPLES: + failures.append("Performance evidence has too few measured samples") + samples_per_runner = 0 + if report.get("source_digests") != _source_digests(): + failures.append("Performance source digests differ") + + raw_runners = report.get("runners") + if not isinstance(raw_runners, dict) or set(raw_runners) != set(RUNNERS_BY_ID): + return failures + ["Performance runner coverage differs"] + runners = cast(dict[str, dict[str, Any]], raw_runners) + manifest = load_framework_manifest() + reconstructed_input = scale._expected_input_digest(WORKLOAD) + for runner_id, runner in runners.items(): + samples = runner.get("samples") + if not isinstance(samples, list) or len(samples) != samples_per_runner: + failures.append(f"{runner_id} sample count differs") + continue + if any(not isinstance(sample, dict) for sample in samples): + failures.append(f"{runner_id} contains a malformed sample") + continue + runner_spec = RUNNERS_BY_ID[runner_id] + expected_target = manifest.targets[runner_spec.framework].evidence_metadata() + target = runner.get("target") + if ( + not isinstance(target, dict) + or scale._declared_target_metadata(target) != expected_target + or target.get("actual_version") != expected_target["version"] + or any(sample.get("target") != target for sample in samples) + ): + failures.append(f"{runner_id} target identity differs") + elif runner_spec.framework == "vectorbt_pro" and ( + target.get("actual_commit") != expected_target["commit"] + or target.get("actual_immutable_id") != expected_target["immutable_id"] + ): + failures.append(f"{runner_id} installed source identity differs") + output_sha256 = runner.get("output_sha256") + if not isinstance(output_sha256, str) or any( + sample.get("output_sha256") != output_sha256 + or sample.get("ml4t", {}).get("dirty") is not False + or not isinstance(sample.get("ml4t", {}).get("commit"), str) + or len(sample["ml4t"]["commit"]) != 40 + for sample in samples + ): + failures.append(f"{runner_id} output checksum or clean-tree identity differs") + if runner.get("output") is None or _json_digest(runner["output"]) != output_sha256: + failures.append(f"{runner_id} retained output digest differs") + if any( + sample.get("input", {}).get("raw_sha256") != reconstructed_input + or sample.get("input") != samples[0].get("input") + or sample.get("thread_environment") != THREAD_ENVIRONMENT + for sample in samples + ): + failures.append(f"{runner_id} input or thread environment differs") + if any( + float(sample.get("process_wall_seconds", 0)) <= 0 + or float(sample.get("process_peak_rss_mb", 0)) <= 0 + or (runner_id == "lean:external" and sample.get("lean_container_observed") is not True) + for sample in samples + ): + failures.append(f"{runner_id} wall-time or full-process memory evidence is missing") + for key, source_key, seed_offset in ( + ("process_wall_seconds", "process_wall_seconds", 0), + ("process_peak_rss_mb", "process_peak_rss_mb", 1), + ): + seed = int(hashlib.sha256(runner_id.encode()).hexdigest()[:8], 16) + seed_offset + if runner.get(key) != _summary(samples, source_key, seed=seed): + failures.append(f"{runner_id} {key} summary differs") + engine_samples = [ + {"value": sample["stages_seconds"]["adapter_reported_engine"]} for sample in samples + ] + seed = int(hashlib.sha256(runner_id.encode()).hexdigest()[:8], 16) + 2 + if runner.get("adapter_engine_seconds") != _summary(engine_samples, "value", seed=seed): + failures.append(f"{runner_id} engine summary differs") + if runner.get("passed") is not True: + failures.append(f"{runner_id} did not pass") + + controlled = report.get("controlled") + pairs = controlled.get("pairs") if isinstance(controlled, dict) else None + if not isinstance(pairs, dict) or set(pairs) != set(scale.FRAMEWORKS): + failures.append("Controlled performance pair coverage differs") + else: + for framework, pair in pairs.items(): + external = runners[f"{framework}:external"] + ml4t = runners[f"{framework}:ml4t"] + if ( + pair.get("passed") is not True + or pair.get("exact_output") is not True + or external.get("output") != ml4t.get("output") + ): + failures.append(f"{framework} controlled performance output differs") + if not isinstance(controlled, dict) or controlled.get("passed") is not True: + failures.append("Controlled performance track did not pass") + + idiomatic = report.get("idiomatic") + idiomatic_runners = idiomatic.get("runners") if isinstance(idiomatic, dict) else None + if ( + not isinstance(idiomatic, dict) + or idiomatic.get("equivalence_claim") is not False + or idiomatic.get("passed") is not True + or not isinstance(idiomatic_runners, dict) + or set(idiomatic_runners) != set(IDIOMATIC_RUNNERS) + ): + failures.append("Idiomatic performance track is incomplete") + else: + for name, runner_id in IDIOMATIC_RUNNERS.items(): + entry = idiomatic_runners[name] + if ( + entry.get("sample_source") != runner_id + or entry.get("semantic_disclosure") != IDIOMATIC_DISCLOSURES[name] + or entry.get("invariants_passed") is not True + ): + failures.append(f"{name} idiomatic disclosure differs") + if report.get("capability_matrix") != _capability_matrix(): + failures.append("Performance capability matrix differs") + if report.get("release_gate_passed") is not True: + failures.append("Performance release gate did not pass") + return failures + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--worker", choices=tuple(RUNNERS_BY_ID)) + parser.add_argument("--calibration-worker", action="store_true") + parser.add_argument("--output", type=Path) + parser.add_argument("--samples", type=int, default=MIN_SAMPLES) + parser.add_argument("--check", action="store_true") + args = parser.parse_args() + if args.worker: + if args.output is None: + parser.error("--worker requires --output") + _write_json(args.output, run_worker(RUNNERS_BY_ID[args.worker])) + return 0 + if args.calibration_worker: + if args.output is None: + parser.error("--calibration-worker requires --output") + _write_json(args.output, run_calibration_worker()) + return 0 + if args.check: + report = cast(dict[str, Any], json.loads(ACCEPTED_PATH.read_text(encoding="utf-8"))) + failures = report_failures(report) + for failure in failures: + print(f"- {failure}") + return 1 if failures else 0 + candidate = collect_evidence(args.samples) + _write_json(CANDIDATE_PATH, candidate) + failures = report_failures(candidate) + if failures: + print("Accepted performance evidence unchanged:") + for failure in failures: + print(f"- {failure}") + return 1 + _write_json_atomic(ACCEPTED_PATH, candidate) + print(f"Accepted performance evidence: {ACCEPTED_PATH}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From dfda2c143e12d3f7c763acb9636e5c5053bbecf8 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 08:15:16 -0400 Subject: [PATCH 30/44] test(validation): retain repeated performance evidence --- validation/PERFORMANCE_RESULTS.json | 8144 +++++++++++++++++++++++++++ 1 file changed, 8144 insertions(+) create mode 100644 validation/PERFORMANCE_RESULTS.json diff --git a/validation/PERFORMANCE_RESULTS.json b/validation/PERFORMANCE_RESULTS.json new file mode 100644 index 00000000..55348bb0 --- /dev/null +++ b/validation/PERFORMANCE_RESULTS.json @@ -0,0 +1,8144 @@ +{ + "calibration": { + "allocated_bytes": 33554432, + "process_peak_rss_mb": 167.5859375, + "process_wall_seconds": 0.4757457880768925, + "worker_seconds": 0.03539959201589227 + }, + "capability_matrix": [ + { + "coverage": [ + "vectorbt_pro", + "vectorbt_oss", + "backtrader", + "zipline", + "lean" + ], + "dimensions": "50 assets x 252 daily sessions", + "use": "controlled and idiomatic repeated performance evidence", + "workload": "performance_50_assets_252_sessions" + }, + { + "coverage": [ + "vectorbt_pro", + "vectorbt_oss", + "backtrader", + "zipline", + "lean" + ], + "dimensions": "250 assets x 5040 daily sessions", + "use": "large-scale equivalence only; recorded runtimes are not performance claims", + "workload": "controlled_250_assets_5040_sessions" + }, + { + "coverage": [ + "vectorbt_oss", + "backtrader", + "zipline", + "lean" + ], + "dimensions": "250 assets x 5,040 daily sessions", + "use": "superseded audit input; single samples, inconsistent setup boundaries, missing peak RSS for LEAN, and a non-reconstructable temporary data path", + "workload": "historical_real_250_assets_5040_sessions" + }, + { + "coverage": [ + "ml4t_backtest" + ], + "dimensions": "single-asset, 250-asset, quote, rebalance, and partial-fill workloads", + "use": "internal regression evidence; not a cross-framework comparison", + "workload": "performance_baselines.json workloads" + } + ], + "controlled": { + "equivalence_required": true, + "pairs": { + "backtrader": { + "exact_output": true, + "external_runner": "backtrader:external", + "ml4t_runner": "backtrader:ml4t", + "passed": true + }, + "lean": { + "exact_output": true, + "external_runner": "lean:external", + "ml4t_runner": "lean:ml4t", + "passed": true + }, + "vectorbt_oss": { + "exact_output": true, + "external_runner": "vectorbt_oss:external", + "ml4t_runner": "vectorbt_oss:ml4t", + "passed": true + }, + "vectorbt_pro": { + "exact_output": true, + "external_runner": "vectorbt_pro:external", + "ml4t_runner": "vectorbt_pro:ml4t", + "passed": true + }, + "zipline": { + "exact_output": true, + "external_runner": "zipline:external", + "ml4t_runner": "zipline:ml4t", + "passed": true + } + }, + "passed": true + }, + "generated_at": "2026-08-14T12:14:30.387013+00:00", + "historical_assessment": { + "comparable_to_current_measurements": false, + "reason": "The 2026-02-28 artifacts used one sample, inconsistent setup boundaries, old framework revisions, different hardware provenance, and incomplete memory data." + }, + "host": { + "cpu_model": "12th Gen Intel(R) Core(TM) i9-12900K", + "logical_cpu_count": 24, + "machine": "x86_64", + "platform": "Linux-6.8.0-136-generic-x86_64-with-glibc2.39", + "processor": "x86_64", + "python": "3.12.11" + }, + "idiomatic": { + "equivalence_claim": false, + "passed": true, + "runners": { + "backtrader": { + "invariants_passed": true, + "sample_source": "backtrader:external", + "semantic_disclosure": "Native Cerebro and Strategy callbacks with target orders, next-session open fills, integer shares, zero commission, and enabled submission cash checks." + }, + "lean": { + "invariants_passed": true, + "sample_source": "lean:external", + "semantic_disclosure": "Native QCAlgorithm daily callback and market-order API in the frozen LEAN image with the declared margin account, zero fee, and zero slippage models." + }, + "ml4t_backtest": { + "invariants_passed": true, + "sample_source": "vectorbt_oss:ml4t", + "semantic_disclosure": "Event-driven Strategy and Engine API with the vectorbt_oss_strict profile; this is one documented ML4T configuration, not a framework-wide default-performance claim." + }, + "vectorbt_oss": { + "invariants_passed": true, + "sample_source": "vectorbt_oss:external", + "semantic_disclosure": "Vectorized Portfolio.from_orders target-amount API with cash sharing, same-bar close execution, zero costs, and lock_cash enabled." + }, + "vectorbt_pro": { + "invariants_passed": true, + "sample_source": "vectorbt_pro:external", + "semantic_disclosure": "Vectorized Portfolio.from_orders target-amount API with cash sharing, same-bar close execution, zero costs, and locked short collateral." + }, + "zipline": { + "invariants_passed": true, + "sample_source": "zipline:external", + "semantic_disclosure": "Native run_algorithm callback and order_target API with daily bundle ingestion, a custom open-price slippage model, and zero commission. Bundle creation is included." + } + } + }, + "measurement_protocol": { + "cache_policy": "installed packages and compiled framework caches persist; inputs and framework state are rebuilt in every child; Zipline uses a new bundle root for every child", + "memory": "child resource.getrusage(RUSAGE_SELF).ru_maxrss over the complete process", + "process_isolation": "one fresh child process per warm-up and measured repetition", + "runtime_primary": "parent perf_counter around the complete child process, including interpreter startup, imports, deterministic input generation, adapter setup, engine execution, output extraction, canonical validation, and process teardown", + "runtime_secondary": "adapter-reported engine interval and worker stage intervals", + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "uncertainty": { + "confidence": 0.95, + "method": "deterministic percentile bootstrap of the sample median", + "resamples": 10000 + }, + "warmup": "one unmeasured isolated process per runner before measured repetitions" + }, + "protocol_sha256": "2e1c91c46a8f6be460b9f33157afe602c8eaf15358aa247c5406d2abf93ff8bb", + "release_gate_passed": true, + "runners": { + "backtrader:external": { + "adapter_engine_seconds": { + "ci95": [ + 3.350934648886323, + 3.6069803595310077 + ], + "maximum": 4.0709646351169795, + "median": 3.423901053494774, + "minimum": 3.304090574849397 + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 197.19921875, + 197.45703125 + ], + "maximum": 201.2265625, + "median": 197.294921875, + "minimum": 197.03515625 + }, + "process_wall_seconds": { + "ci95": [ + 4.859050475992262, + 5.406705005094409 + ], + "maximum": 5.6817656338680536, + "median": 5.014518941054121, + "minimum": 4.792324147885665 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "backtrader", + "profile": "backtrader_strict", + "runner_id": "backtrader:external", + "side": "external" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.5078125, + "process_wall_seconds": 5.376169226132333, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.6734475230332464, + "framework_call": 3.987528580939397, + "input_generation": 0.17883973685093224, + "output_validation": 0.7111673119943589, + "worker_total": 4.884594844887033 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 195.28125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 201.2265625, + "process_wall_seconds": 5.6817656338680536, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 4.0709646351169795, + "framework_call": 4.383497969945893, + "input_generation": 0.18363346089608967, + "output_validation": 0.6725615339819342, + "worker_total": 5.2451489749364555 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 194.87890625 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.2734375, + "process_wall_seconds": 5.109883235068992, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.540513196028769, + "framework_call": 3.8552259739954025, + "input_generation": 0.17031445098109543, + "output_validation": 0.6831903841812164, + "worker_total": 4.7138629630208015 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 195.46875 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.40625, + "process_wall_seconds": 5.4834628470707685, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.576482319040224, + "framework_call": 3.9185223788954318, + "input_generation": 0.1673972129356116, + "output_validation": 0.7199663419742137, + "worker_total": 4.813109786948189 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 195.48828125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.4296875, + "process_wall_seconds": 5.3299471631180495, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.4706426488701254, + "framework_call": 3.889205976156518, + "input_generation": 0.2292528140824288, + "output_validation": 0.6676586889661849, + "worker_total": 4.79290368501097 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 195.3203125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.296875, + "process_wall_seconds": 4.859050475992262, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.377159458119422, + "framework_call": 3.6661560570355505, + "input_generation": 0.1512304120697081, + "output_validation": 0.6185254689771682, + "worker_total": 4.440962121123448 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 196.4453125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.03515625, + "process_wall_seconds": 4.898767878999934, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.3749146070331335, + "framework_call": 3.6809635940007865, + "input_generation": 0.16374001908116043, + "output_validation": 0.6309148538857698, + "worker_total": 4.482350798789412 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 195.93359375 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.19921875, + "process_wall_seconds": 4.9191546470392495, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.350934648886323, + "framework_call": 3.668874398106709, + "input_generation": 0.1646620538085699, + "output_validation": 0.6683604100253433, + "worker_total": 4.506771945860237 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 196.00390625 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.29296875, + "process_wall_seconds": 4.856806471943855, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.334570054896176, + "framework_call": 3.6319363589864224, + "input_generation": 0.1571136680431664, + "output_validation": 0.670759926084429, + "worker_total": 4.465157583123073 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 195.984375 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 197.15234375, + "process_wall_seconds": 4.792324147885665, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 3.304090574849397, + "framework_call": 3.5917146620340645, + "input_generation": 0.16222902899608016, + "output_validation": 0.6231943219900131, + "worker_total": 4.383566793054342 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 196.125 + } + ], + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "warmup": { + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_wall_seconds": 5.175673787947744 + } + }, + "backtrader:ml4t": { + "adapter_engine_seconds": { + "ci95": [ + 0.908577922033146, + 0.9894778840243816 + ], + "maximum": 1.037454895908013, + "median": 0.9448818495729938, + "minimum": 0.8902315250597894 + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 155.8671875, + 156.65234375 + ], + "maximum": 312.3828125, + "median": 156.07421875, + "minimum": 155.85546875 + }, + "process_wall_seconds": { + "ci95": [ + 2.530810981988907, + 2.709004875156097 + ], + "maximum": 2.866589648881927, + "median": 2.612126521533355, + "minimum": 2.447079428937286 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "backtrader", + "profile": "backtrader_strict", + "runner_id": "backtrader:ml4t", + "side": "ml4t" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 156.98046875, + "process_wall_seconds": 2.7839601701125503, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.0181061150506139, + "framework_call": 1.5028354679234326, + "input_generation": 0.21065072109922767, + "output_validation": 0.6413971921429038, + "worker_total": 2.3612418100237846 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.24609375 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 156.32421875, + "process_wall_seconds": 2.6768742080312222, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9608496529981494, + "framework_call": 1.4163008669856936, + "input_generation": 0.17067066789604723, + "output_validation": 0.6646531720180064, + "worker_total": 2.257363608106971 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.8125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 156.0625, + "process_wall_seconds": 2.613623331999406, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9633448419626802, + "framework_call": 1.4114560668822378, + "input_generation": 0.1719590718857944, + "output_validation": 0.648574722930789, + "worker_total": 2.237245577853173 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.35546875 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 155.8671875, + "process_wall_seconds": 2.866589648881927, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.037454895908013, + "framework_call": 1.5683179590851068, + "input_generation": 0.18849451513960958, + "output_validation": 0.6789953368715942, + "worker_total": 2.4413970168679953 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.80078125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 156.0859375, + "process_wall_seconds": 2.610629711067304, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9382545321714133, + "framework_call": 1.42265171604231, + "input_generation": 0.152428223984316, + "output_validation": 0.6759225248824805, + "worker_total": 2.2558157618623227 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.01953125 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 155.859375, + "process_wall_seconds": 2.530810981988907, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9065284337848425, + "framework_call": 1.3859011081513017, + "input_generation": 0.15998178184963763, + "output_validation": 0.6346101809758693, + "worker_total": 2.1876259739510715 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.13671875 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 312.3828125, + "process_wall_seconds": 2.597840033005923, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.929973758989945, + "framework_call": 1.3882147979456931, + "input_generation": 0.17093791300430894, + "output_validation": 0.6521568079479039, + "worker_total": 2.216292425058782 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.78515625 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 156.45703125, + "process_wall_seconds": 2.447079428937286, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8902315250597894, + "framework_call": 1.3272064051125199, + "input_generation": 0.1574009859468788, + "output_validation": 0.6059910738840699, + "worker_total": 2.096101847011596 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.421875 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 155.87890625, + "process_wall_seconds": 2.634049580199644, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9515091669745743, + "framework_call": 1.4156893738545477, + "input_generation": 0.1641269619576633, + "output_validation": 0.660244386876002, + "worker_total": 2.244823061861098 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.4296875 + }, + { + "captured_log_tail": "", + "framework": "backtrader", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "febf7d800ad51bb21a08dcde7271f83d998df1555717892bb7df1e043c558963" + }, + "final_value": 1017080.363019, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "ff7fe2b530c5859f9f166204f13090e1852563d1f442facea022fdf3580ba1d9", + "total_pnl": 17080.363019, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "775e56a8766efa3cd1bddc12b8ba0580b7bc0306fe0391d02bc7f5bd9724f73d" + } + }, + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_peak_rss_mb": 155.85546875, + "process_wall_seconds": 2.4748893938958645, + "profile": "backtrader_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "backtrader:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.908577922033146, + "framework_call": 1.3572073380928487, + "input_generation": 0.1586920388508588, + "output_validation": 0.6126857830677181, + "worker_total": 2.1335354649927467 + }, + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.9140625 + } + ], + "target": { + "access": "public", + "actual_version": "1.9.78.123", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "version": "1.9.78.123" + }, + "warmup": { + "output_sha256": "812655f4febafd954501947cff27c631ef86d0d1e2708f18eb8c94d4ee742438", + "process_wall_seconds": 2.614274393999949 + } + }, + "lean:external": { + "adapter_engine_seconds": { + "ci95": [ + 9.302797012962401, + 10.53841226757504 + ], + "maximum": 11.18987100222148, + "median": 9.411902562016621, + "minimum": 8.945152326952666 + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 756.7421875, + 788.666015625 + ], + "maximum": 983.65625, + "median": 774.61328125, + "minimum": 691.19140625 + }, + "process_wall_seconds": { + "ci95": [ + 11.036492455634288, + 12.244950134074315 + ], + "maximum": 13.056066303048283, + "median": 11.206220811931416, + "minimum": 10.7337086268235 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "lean", + "profile": "lean", + "runner_id": "lean:external", + "side": "external" + }, + "samples": [ + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 776.76171875, + "process_wall_seconds": 12.019305891124532, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 10.185783114982769, + "framework_call": 10.724170634057373, + "input_generation": 0.19310970208607614, + "output_validation": 0.702254791976884, + "worker_total": 11.623742611845955 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 781.83203125, + "process_wall_seconds": 13.056066303048283, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 11.18987100222148, + "framework_call": 11.758946699090302, + "input_generation": 0.188275049906224, + "output_validation": 0.7313700309023261, + "worker_total": 12.683818692108616 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 795.5, + "process_wall_seconds": 12.244950134074315, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 10.404145527165383, + "framework_call": 10.970031555974856, + "input_generation": 0.1847632999997586, + "output_validation": 0.7049245410598814, + "worker_total": 11.866646374808624 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 983.65625, + "process_wall_seconds": 12.704453617101535, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 10.891041420167312, + "framework_call": 11.443608423927799, + "input_generation": 0.19487099605612457, + "output_validation": 0.7112620898988098, + "worker_total": 12.355302988784388 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 772.46484375, + "process_wall_seconds": 11.11995538813062, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 9.363360463874415, + "framework_call": 9.906120584113523, + "input_generation": 0.19041855516843498, + "output_validation": 0.679943721042946, + "worker_total": 10.783782337093726 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 785.8984375, + "process_wall_seconds": 11.26505703292787, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 9.450210659066215, + "framework_call": 10.003367149969563, + "input_generation": 0.19682106701657176, + "output_validation": 0.7030586530454457, + "worker_total": 10.908337126951665 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 749.671875, + "process_wall_seconds": 11.084114050026983, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 9.3164061778225, + "framework_call": 9.84822169598192, + "input_generation": 0.19571771007031202, + "output_validation": 0.680251837009564, + "worker_total": 10.728396950056776 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 136.97265625 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 691.19140625, + "process_wall_seconds": 10.7337086268235, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 8.945152326952666, + "framework_call": 9.481722017051652, + "input_generation": 0.18337821518070996, + "output_validation": 0.6910067761782557, + "worker_total": 10.360885162837803 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 138.68359375 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 761.35546875, + "process_wall_seconds": 10.953029523137957, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 9.231999560957775, + "framework_call": 9.745108352974057, + "input_generation": 0.18416382395662367, + "output_validation": 0.6621900799218565, + "worker_total": 10.596050997963175 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 138.68359375 + }, + { + "captured_log_tail": " LEAN data export: cache hit (50 assets)\n", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 763.8125, + "process_wall_seconds": 11.147384590934962, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 9.373594464967027, + "framework_call": 9.93591579911299, + "input_generation": 0.1843034198973328, + "output_validation": 0.6802478530444205, + "worker_total": 10.804355204105377 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 138.68359375 + } + ], + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "warmup": { + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_wall_seconds": 11.679331682156771 + } + }, + "lean:ml4t": { + "adapter_engine_seconds": { + "ci95": [ + 1.3706486190203577, + 1.4218521299771965 + ], + "maximum": 1.433795009041205, + "median": 1.397009706008248, + "minimum": 1.3313814599532634 + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 156.81640625, + 157.501953125 + ], + "maximum": 158.859375, + "median": 157.15234375, + "minimum": 156.74609375 + }, + "process_wall_seconds": { + "ci95": [ + 3.049292348441668, + 3.2311629990581423 + ], + "maximum": 3.5748406078200787, + "median": 3.1330102384090424, + "minimum": 3.011835790006444 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "lean", + "profile": "lean", + "runner_id": "lean:ml4t", + "side": "ml4t" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 157.046875, + "process_wall_seconds": 3.5748406078200787, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.4276690089609474, + "framework_call": 2.0419853311032057, + "input_generation": 0.21625301497988403, + "output_validation": 0.9067609130870551, + "worker_total": 3.1709984850604087 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.9375 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 156.74609375, + "process_wall_seconds": 3.1823340819682926, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.3706486190203577, + "framework_call": 1.8673832311760634, + "input_generation": 0.18896398902870715, + "output_validation": 0.7042831610888243, + "worker_total": 2.766540241893381 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.1796875 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 157.71875, + "process_wall_seconds": 3.0813401688355953, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.4004664199892431, + "framework_call": 1.8936227390076965, + "input_generation": 0.19472763198427856, + "output_validation": 0.6292587341740727, + "worker_total": 2.7227156930603087 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.02734375 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 158.859375, + "process_wall_seconds": 3.083686394849792, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.393552992027253, + "framework_call": 1.8873397649731487, + "input_generation": 0.18920155288651586, + "output_validation": 0.627145430073142, + "worker_total": 2.7081215269863605 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.87890625 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 156.7578125, + "process_wall_seconds": 3.0148983020335436, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.3553519088309258, + "framework_call": 1.8468800981063396, + "input_generation": 0.18298948789015412, + "output_validation": 0.6126887190621346, + "worker_total": 2.646813865052536 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.046875 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 157.046875, + "process_wall_seconds": 3.1869257749058306, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.433795009041205, + "framework_call": 1.946343685965985, + "input_generation": 0.1942231790162623, + "output_validation": 0.618491327855736, + "worker_total": 2.763743472052738 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.34765625 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 157.32421875, + "process_wall_seconds": 3.2311629990581423, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.4218521299771965, + "framework_call": 1.955944683868438, + "input_generation": 0.19136144500225782, + "output_validation": 0.661566044902429, + "worker_total": 2.8142996768001467 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.921875 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 156.81640625, + "process_wall_seconds": 3.0752324189525098, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.382749306038022, + "framework_call": 1.8939984000753611, + "input_generation": 0.19286258495412767, + "output_validation": 0.6301647510845214, + "worker_total": 2.7216198549140245 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.47265625 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 157.2578125, + "process_wall_seconds": 3.011835790006444, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.3313814599532634, + "framework_call": 1.8444276098161936, + "input_generation": 0.18630578787997365, + "output_validation": 0.6243295278400183, + "worker_total": 2.6601850509177893 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.71484375 + }, + { + "captured_log_tail": "", + "framework": "lean", + "input": { + "effective_sha256": "139d5a2f6a9f88a185c97c00eaf9f9a85ba3953b2e3632bc33c9f0677641a6a5", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "ef7b6d976557fef0b0d366a85d44112d1c9a1282307a44ad6351d030d5a6e7d5" + }, + "final_value": 1017080.38, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "f426d075aad3f7bc182858a410e3c9d325ca40c7b634a8c0f7bda3043b6da0a0", + "total_pnl": 17080.38, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "cac5bf5535364f3f04bf994c75a570f8fad24a632681372e3b2a2d4ce6967728" + } + }, + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_peak_rss_mb": 157.28515625, + "process_wall_seconds": 3.250726570840925, + "profile": "lean", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "lean:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.4113483978435397, + "framework_call": 1.9658494531176984, + "input_generation": 0.19743163813836873, + "output_validation": 0.6800318469759077, + "worker_total": 2.847525800112635 + }, + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.76171875 + } + ], + "target": { + "access": "public", + "actual_version": "18001", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "display_name": "LEAN", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "source": "https://github.com/QuantConnect/Lean", + "version": "18001" + }, + "warmup": { + "output_sha256": "d89dbc381565eab9a3d4a88b680fd815cc5f4a934a386b23ad1e8ed7ad0e8b22", + "process_wall_seconds": 3.186559548135847 + } + }, + "vectorbt_oss:external": { + "adapter_engine_seconds": { + "ci95": [ + 0.8307405739324167, + 0.8690108514856547 + ], + "maximum": 0.882908120052889, + "median": 0.8480116230202839, + "minimum": 0.8021623259410262 + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 387.306640625, + 387.5 + ], + "maximum": 387.5234375, + "median": 387.439453125, + "minimum": 387.16796875 + }, + "process_wall_seconds": { + "ci95": [ + 3.525195039110258, + 3.6873238731641322 + ], + "maximum": 3.8338988691102713, + "median": 3.6086933659389615, + "minimum": 3.482216221978888 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "vectorbt_oss", + "profile": "vectorbt_oss_strict", + "runner_id": "vectorbt_oss:external", + "side": "external" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.43359375, + "process_wall_seconds": 3.670104590943083, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8798201009631157, + "framework_call": 2.062932245898992, + "input_generation": 0.16191663895733654, + "output_validation": 0.7096830219961703, + "worker_total": 2.9396252918522805 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 385.25 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.51953125, + "process_wall_seconds": 3.8338988691102713, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8585861781612039, + "framework_call": 2.091058199061081, + "input_generation": 0.16191325685940683, + "output_validation": 0.7331500151194632, + "worker_total": 2.9914798820391297 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 384.98828125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.48046875, + "process_wall_seconds": 3.6873238731641322, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8582016020081937, + "framework_call": 2.064197650179267, + "input_generation": 0.16661790409125388, + "output_validation": 0.6851765559986234, + "worker_total": 2.921632877085358 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 384.265625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.16796875, + "process_wall_seconds": 3.7498691040091217, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8465168729890138, + "framework_call": 2.1357659180648625, + "input_generation": 0.1744779150467366, + "output_validation": 0.6610894009936601, + "worker_total": 2.976782123092562 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 386.109375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.375, + "process_wall_seconds": 3.5211444818414748, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8488034920301288, + "framework_call": 2.0262639930006117, + "input_generation": 0.1772257210686803, + "output_validation": 0.647859837859869, + "worker_total": 2.8567061200737953 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 385.19921875 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.1796875, + "process_wall_seconds": 3.608235420892015, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8308160889428109, + "framework_call": 2.067230924963951, + "input_generation": 0.16955018020235002, + "output_validation": 0.6723636840470135, + "worker_total": 2.9140442551579326 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 384.9609375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.4453125, + "process_wall_seconds": 3.5682687910739332, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8472197540104389, + "framework_call": 2.0262966749724, + "input_generation": 0.17957995180040598, + "output_validation": 0.6536156190559268, + "worker_total": 2.8652191888540983 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 385.765625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.43359375, + "process_wall_seconds": 3.482216221978888, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8149642748758197, + "framework_call": 2.021031162934378, + "input_generation": 0.15743755199946463, + "output_validation": 0.64180369512178, + "worker_total": 2.825268122833222 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 385.5234375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.48046875, + "process_wall_seconds": 3.609151310985908, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.882908120052889, + "framework_call": 2.051390077918768, + "input_generation": 0.15605690493248403, + "output_validation": 0.6586936758831143, + "worker_total": 2.8732933779247105 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 385.7890625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 387.5234375, + "process_wall_seconds": 3.525195039110258, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 0.8021623259410262, + "framework_call": 1.9822685839608312, + "input_generation": 0.15689620794728398, + "output_validation": 0.6623139940202236, + "worker_total": 2.806431439006701 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 386.17578125 + } + ], + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "warmup": { + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_wall_seconds": 3.7903245377819985 + } + }, + "vectorbt_oss:ml4t": { + "adapter_engine_seconds": { + "ci95": [ + 0.8981822959613055, + 1.008911918150261 + ], + "maximum": 1.2465274089481682, + "median": 0.9092964320443571, + "minimum": 0.8798509649932384 + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 155.798828125, + 157.884765625 + ], + "maximum": 310.21484375, + "median": 155.9140625, + "minimum": 155.7109375 + }, + "process_wall_seconds": { + "ci95": [ + 2.2440610979683697, + 2.4991891224635765 + ], + "maximum": 3.256326812086627, + "median": 2.277965266490355, + "minimum": 2.223389583872631 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "vectorbt_oss", + "profile": "vectorbt_oss_strict", + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 159.609375, + "process_wall_seconds": 2.3952237679623067, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9686031411401927, + "framework_call": 1.1901077630463988, + "input_generation": 0.154701157938689, + "output_validation": 0.654574777930975, + "worker_total": 2.0046242149546742 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.08984375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.7109375, + "process_wall_seconds": 2.6031544769648463, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.008911918150261, + "framework_call": 1.3068602001294494, + "input_generation": 0.21605361602269113, + "output_validation": 0.653870282927528, + "worker_total": 2.183360032038763 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.71875 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.84375, + "process_wall_seconds": 2.451485815923661, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.0214208189863712, + "framework_call": 1.248727394035086, + "input_generation": 0.1640953291207552, + "output_validation": 0.6562014650553465, + "worker_total": 2.074317052960396 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.03515625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.75390625, + "process_wall_seconds": 3.256326812086627, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.2465274089481682, + "framework_call": 1.577657372923568, + "input_generation": 0.1758553208783269, + "output_validation": 0.8341000508517027, + "worker_total": 2.595768948085606 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.72265625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.83203125, + "process_wall_seconds": 2.2834033970721066, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9060374309774488, + "framework_call": 1.1317346221767366, + "input_generation": 0.15844938182272017, + "output_validation": 0.6323951878584921, + "worker_total": 1.9277215849142522 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.359375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 156.16015625, + "process_wall_seconds": 2.223389583872631, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8981822959613055, + "framework_call": 1.1087714741006494, + "input_generation": 0.15337755298241973, + "output_validation": 0.6162916289176792, + "worker_total": 1.883411531103775 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.80859375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 310.21484375, + "process_wall_seconds": 2.2725271359086037, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9125554331112653, + "framework_call": 1.1285230768844485, + "input_generation": 0.15912495600059628, + "output_validation": 0.6264055089559406, + "worker_total": 1.9197965608909726 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.578125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.875, + "process_wall_seconds": 2.2243441899772733, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8798509649932384, + "framework_call": 1.0897447711322457, + "input_generation": 0.15880534006282687, + "output_validation": 0.6201093110721558, + "worker_total": 1.873634281102568 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.390625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.953125, + "process_wall_seconds": 2.2440610979683697, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8912546280771494, + "framework_call": 1.115328145911917, + "input_generation": 0.15796285402029753, + "output_validation": 0.612602864857763, + "worker_total": 1.8908990109339356 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.53515625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_oss", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 157.4453125, + "process_wall_seconds": 2.2701504779979587, + "profile": "vectorbt_oss_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_oss:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9017682771664113, + "framework_call": 1.1111474989447743, + "input_generation": 0.1592353261075914, + "output_validation": 0.6402482429984957, + "worker_total": 1.9163800119422376 + }, + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.1953125 + } + ], + "target": { + "access": "public", + "actual_version": "1.1.0", + "artifact": "vectorbt-1.1.0.tar.gz", + "commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "display_name": "VectorBT OSS", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "version": "1.1.0" + }, + "warmup": { + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_wall_seconds": 2.7466204871889204 + } + }, + "vectorbt_pro:external": { + "adapter_engine_seconds": { + "ci95": [ + 1.6690128268674016, + 1.7714889941271394 + ], + "maximum": 2.270636638859287, + "median": 1.728068141383119, + "minimum": 1.6571708989795297 + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 414.65234375, + 414.884765625 + ], + "maximum": 414.99609375, + "median": 414.74609375, + "minimum": 414.578125 + }, + "process_wall_seconds": { + "ci95": [ + 5.71285487303976, + 6.257438300875947 + ], + "maximum": 9.99652496096678, + "median": 5.991469567990862, + "minimum": 5.5841467110440135 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "vectorbt_pro", + "profile": "vectorbt_strict", + "runner_id": "vectorbt_pro:external", + "side": "external" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.8203125, + "process_wall_seconds": 5.959158386103809, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.7371781261172146, + "framework_call": 4.1232807820197195, + "input_generation": 0.1640956699848175, + "output_validation": 0.648703636135906, + "worker_total": 4.9424108299426734 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 411.59765625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.65234375, + "process_wall_seconds": 6.257438300875947, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.7362616048194468, + "framework_call": 4.317180361133069, + "input_generation": 0.1769615518860519, + "output_validation": 0.7294469620101154, + "worker_total": 5.229629810899496 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 411.96875 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.7734375, + "process_wall_seconds": 9.99652496096678, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 2.270636638859287, + "framework_call": 6.091383671853691, + "input_generation": 0.16453690105117857, + "output_validation": 0.8518167729489505, + "worker_total": 7.118468755856156 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 412.03515625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.99609375, + "process_wall_seconds": 6.023780749877915, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.7160168879199773, + "framework_call": 4.048435340868309, + "input_generation": 0.1620536979753524, + "output_validation": 0.7531253169290721, + "worker_total": 4.972098605940118 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 411.4375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.71484375, + "process_wall_seconds": 5.609207591973245, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.66347999102436, + "framework_call": 3.9243139519821852, + "input_generation": 0.15953805786557496, + "output_validation": 0.6566350138746202, + "worker_total": 4.745537045877427 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 412.39453125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.64453125, + "process_wall_seconds": 6.314501478103921, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.8057998621370643, + "framework_call": 4.355701731983572, + "input_generation": 0.16373650403693318, + "output_validation": 0.6716082249768078, + "worker_total": 5.200047123944387 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 412.18359375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.578125, + "process_wall_seconds": 5.800166065106168, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.6690128268674016, + "framework_call": 4.021351563045755, + "input_generation": 0.17845306801609695, + "output_validation": 0.6897027879022062, + "worker_total": 4.895391779951751 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 411.51953125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.875, + "process_wall_seconds": 5.816502154106274, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.764242930104956, + "framework_call": 4.080579221947119, + "input_generation": 0.15481626009568572, + "output_validation": 0.662275732960552, + "worker_total": 4.903302671853453 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 412.5390625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.99609375, + "process_wall_seconds": 5.5841467110440135, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.6571708989795297, + "framework_call": 3.8644673260860145, + "input_generation": 0.1620912249200046, + "output_validation": 0.6730847209692001, + "worker_total": 4.715928931022063 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 412.63671875 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 414.71875, + "process_wall_seconds": 6.088474199874327, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 1.719874677946791, + "framework_call": 4.2443152100313455, + "input_generation": 0.21618003700859845, + "output_validation": 0.6430077231489122, + "worker_total": 5.109357130015269 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 413.01953125 + } + ], + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "warmup": { + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_wall_seconds": 6.184146265964955 + } + }, + "vectorbt_pro:ml4t": { + "adapter_engine_seconds": { + "ci95": [ + 0.9047102495096624, + 1.0043395365355536 + ], + "maximum": 1.9459911989979446, + "median": 0.9240547810913995, + "minimum": 0.8907343389000744 + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 155.8359375, + 156.02734375 + ], + "maximum": 159.6171875, + "median": 155.865234375, + "minimum": 155.796875 + }, + "process_wall_seconds": { + "ci95": [ + 2.2773244495037943, + 2.5231631849892437 + ], + "maximum": 4.528987112920731, + "median": 2.3167884735157713, + "minimum": 2.244471146957949 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "vectorbt_pro", + "profile": "vectorbt_strict", + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.9453125, + "process_wall_seconds": 2.5357214431278408, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.930464378092438, + "framework_call": 1.1525822631083429, + "input_generation": 0.15816618292592466, + "output_validation": 0.7532674588728696, + "worker_total": 2.079071493120864 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.48828125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.796875, + "process_wall_seconds": 2.5231631849892437, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.0782146949786693, + "framework_call": 1.3005577349103987, + "input_generation": 0.16522943787276745, + "output_validation": 0.6411126849707216, + "worker_total": 2.1124589869286865 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.9140625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 156.02734375, + "process_wall_seconds": 4.528987112920731, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 1.9459911989979446, + "framework_call": 2.386813025921583, + "input_generation": 0.45184363005682826, + "output_validation": 0.755135057028383, + "worker_total": 3.6057104161009192 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.8671875 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 156.09765625, + "process_wall_seconds": 2.3521372568793595, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9350400541443378, + "framework_call": 1.168484119931236, + "input_generation": 0.16800005920231342, + "output_validation": 0.6441999510861933, + "worker_total": 1.9865476908162236 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 155.06640625 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.8203125, + "process_wall_seconds": 2.286148939980194, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.916111133992672, + "framework_call": 1.1275252439081669, + "input_generation": 0.1644469709135592, + "output_validation": 0.6393944921437651, + "worker_total": 1.9367348002269864 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.01171875 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.85546875, + "process_wall_seconds": 2.326364906039089, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.917645184090361, + "framework_call": 1.1439288000110537, + "input_generation": 0.16722212894819677, + "output_validation": 0.6177532710134983, + "worker_total": 1.9345095169264823 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 153.78125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.8515625, + "process_wall_seconds": 2.2889087309595197, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9393373690545559, + "framework_call": 1.1504261358641088, + "input_generation": 0.15304543706588447, + "output_validation": 0.6295626398641616, + "worker_total": 1.938792741857469 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.0234375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.875, + "process_wall_seconds": 2.247436858015135, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8933093650266528, + "framework_call": 1.1127361478284001, + "input_generation": 0.158513454021886, + "output_validation": 0.607449027011171, + "worker_total": 1.8840810460969806 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.34375 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 159.6171875, + "process_wall_seconds": 2.3072120409924537, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.9071503840386868, + "framework_call": 1.134229457937181, + "input_generation": 0.15990970307029784, + "output_validation": 0.6521279099397361, + "worker_total": 1.9519521209876984 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.078125 + }, + { + "captured_log_tail": "", + "framework": "vectorbt_pro", + "input": { + "effective_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4306, + "sha256": "5e74fc1dc208d9a4ecac295eca00a797db81db8ce00aa50f1f3c8ca9a3db59da" + }, + "final_value": 1007736.514952, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "b44d0292dd420d62eea72d4cf03fb04bc5a8ec76c742a53d2d6d6940ab22c436", + "total_pnl": 7736.514952, + "trade_count": 2280, + "trades": { + "count": 2280, + "sha256": "b531982ccef3b5b71002ddcffa42d093e737312df88eaeffc6645d152d4cc3db" + } + }, + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_peak_rss_mb": 155.84765625, + "process_wall_seconds": 2.244471146957949, + "profile": "vectorbt_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "vectorbt_pro:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8907343389000744, + "framework_call": 1.1046026512049139, + "input_generation": 0.16227731201797724, + "output_validation": 0.6135311261750758, + "worker_total": 1.8856932430062443 + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 154.53515625 + } + ], + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + }, + "warmup": { + "output_sha256": "c804c59ed063b927bc86dc00416ff689a7dbdbb25f3ffaa9fd179a7648403c53", + "process_wall_seconds": 2.267685509985313 + } + }, + "zipline:external": { + "adapter_engine_seconds": { + "ci95": [ + 4.748736156150699, + 5.10177456215024 + ], + "maximum": 5.503119731787592, + "median": 4.977568666450679, + "minimum": 4.717232923023403 + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 346.33203125, + 348.34765625 + ], + "maximum": 351.35546875, + "median": 346.390625, + "minimum": 346.20703125 + }, + "process_wall_seconds": { + "ci95": [ + 7.1438562190160155, + 7.647039557108656 + ], + "maximum": 8.003612227039412, + "median": 7.464878038037568, + "minimum": 7.018419272033498 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "zipline", + "profile": "zipline_strict", + "runner_id": "zipline:external", + "side": "external" + }, + "samples": [ + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 351.35546875, + "process_wall_seconds": 7.711425847141072, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 5.091250766068697, + "framework_call": 6.295086770085618, + "input_generation": 0.19786221301183105, + "output_validation": 0.6627009769435972, + "worker_total": 7.161247201031074 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 342.7265625 + }, + { + "captured_log_tail": " Bundle creation: 1.1s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.33203125, + "process_wall_seconds": 8.003612227039412, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 5.503119731787592, + "framework_call": 6.497629802906886, + "input_generation": 0.20184951601549983, + "output_validation": 0.7159625249914825, + "worker_total": 7.420901325065643 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 342.81640625 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.4296875, + "process_wall_seconds": 7.3726214750204235, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 4.924369488842785, + "framework_call": 5.869465551106259, + "input_generation": 0.1991936641279608, + "output_validation": 0.7059388430789113, + "worker_total": 6.7807400999590755 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 343.62890625 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 350.28125, + "process_wall_seconds": 7.582653267076239, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 5.030767844058573, + "framework_call": 6.077844540122896, + "input_generation": 0.21785450587049127, + "output_validation": 0.6522597980219871, + "worker_total": 6.9531793689820915 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 342.45703125 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.328125, + "process_wall_seconds": 7.557134601054713, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 5.10177456215024, + "framework_call": 6.074810586171225, + "input_generation": 0.21035503293387592, + "output_validation": 0.6693015419878066, + "worker_total": 6.960555827943608 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 341.96484375 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.20703125, + "process_wall_seconds": 7.1438562190160155, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 4.748736156150699, + "framework_call": 5.73698405502364, + "input_generation": 0.21277186600491405, + "output_validation": 0.6704761269502342, + "worker_total": 6.626129260985181 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 343.41796875 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.35546875, + "process_wall_seconds": 7.24830866092816, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 4.8676639350596815, + "framework_call": 5.794056324986741, + "input_generation": 0.18637165799736977, + "output_validation": 0.6866976919118315, + "worker_total": 6.674514743965119 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 344.40234375 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.3671875, + "process_wall_seconds": 7.018419272033498, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 4.717232923023403, + "framework_call": 5.63641257584095, + "input_generation": 0.2074915268458426, + "output_validation": 0.6421569350641221, + "worker_total": 6.490977911977097 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 343.26953125 + }, + { + "captured_log_tail": " Bundle creation: 1.0s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.875, + "process_wall_seconds": 7.631891947938129, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 5.117074390873313, + "framework_call": 6.1258636098355055, + "input_generation": 0.20888931094668806, + "output_validation": 0.6922734039835632, + "worker_total": 7.033299366943538 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 343.3671875 + }, + { + "captured_log_tail": " Bundle creation: 0.9s (one-time setup)\n", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 346.4140625, + "process_wall_seconds": 7.067554120905697, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:external", + "side": "external", + "stages_seconds": { + "adapter_reported_engine": 4.741218131966889, + "framework_call": 5.661317677004263, + "input_generation": 0.19341292115859687, + "output_validation": 0.6663111308589578, + "worker_total": 6.526222827844322 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 343.953125 + } + ], + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "warmup": { + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_wall_seconds": 7.682794199092314 + } + }, + "zipline:ml4t": { + "adapter_engine_seconds": { + "ci95": [ + 0.8491478658979759, + 0.8854195929598063 + ], + "maximum": 0.8986947531811893, + "median": 0.8598419894697145, + "minimum": 0.8189114129636437 + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "passed": true, + "process_peak_rss_mb": { + "ci95": [ + 160.685546875, + 164.6640625 + ], + "maximum": 320.2578125, + "median": 161.07421875, + "minimum": 160.328125 + }, + "process_wall_seconds": { + "ci95": [ + 2.573103487957269, + 2.7163554108701646 + ], + "maximum": 2.719864967977628, + "median": 2.6236208204645663, + "minimum": 2.5323963440023363 + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner": { + "framework": "zipline", + "profile": "zipline_strict", + "runner_id": "zipline:ml4t", + "side": "ml4t" + }, + "samples": [ + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 320.2578125, + "process_wall_seconds": 2.655956004979089, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8430441298987716, + "framework_call": 1.3786883461289108, + "input_generation": 0.19677593000233173, + "output_validation": 0.6716889808885753, + "worker_total": 2.2532301018945873 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 159.06640625 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 164.63671875, + "process_wall_seconds": 2.7195419939234853, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8895131449680775, + "framework_call": 1.4294707980006933, + "input_generation": 0.24853772879578173, + "output_validation": 0.638234734069556, + "worker_total": 2.3220137970056385 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 158.8359375 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 161.06640625, + "process_wall_seconds": 2.703950681956485, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8590001529082656, + "framework_call": 1.3576857191510499, + "input_generation": 0.25127662695012987, + "output_validation": 0.6541171967983246, + "worker_total": 2.269417939009145 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 159.55859375 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 164.67578125, + "process_wall_seconds": 2.7163554108701646, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8986947531811893, + "framework_call": 1.473513575969264, + "input_generation": 0.20762456092052162, + "output_validation": 0.6460245719645172, + "worker_total": 2.3321758878882974 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 158.703125 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 160.5390625, + "process_wall_seconds": 2.573103487957269, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8606838260311633, + "framework_call": 1.338602809002623, + "input_generation": 0.20307351904921234, + "output_validation": 0.6266762991435826, + "worker_total": 2.1743306289426982 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 158.15625 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 161.08203125, + "process_wall_seconds": 2.591285635950044, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8552516018971801, + "framework_call": 1.3401092560961843, + "input_generation": 0.2297970480285585, + "output_validation": 0.6156892699655145, + "worker_total": 2.190389066003263 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 158.875 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 164.6640625, + "process_wall_seconds": 2.5908634080551565, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8500719619914889, + "framework_call": 1.3792267120443285, + "input_generation": 0.18986796401441097, + "output_validation": 0.6602669539861381, + "worker_total": 2.2349234770517796 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 159.89453125 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 160.328125, + "process_wall_seconds": 2.5323963440023363, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8189114129636437, + "framework_call": 1.3030543180648237, + "input_generation": 0.2030899878591299, + "output_validation": 0.6371270779054612, + "worker_total": 2.1484398460015655 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 158.41796875 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 160.76171875, + "process_wall_seconds": 2.719864967977628, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8854195929598063, + "framework_call": 1.417193704051897, + "input_generation": 0.21940957801416516, + "output_validation": 0.6480343870352954, + "worker_total": 2.2898331182077527 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 158.1640625 + }, + { + "captured_log_tail": "", + "framework": "zipline", + "input": { + "effective_sha256": "b1cae50463faa3523965f50cc48276f96820c5d361cb1dd470c2f5e2223a5754", + "raw_sha256": "c37af67d1da290637fa4721b44a0043485234c6c39374856fc09bd77b6ad412e" + }, + "lean_container_observed": true, + "ml4t": { + "commit": "0315119acc05796d95cc3c344a0418007dde6cbc", + "dirty": false + }, + "output": { + "fills": { + "count": 4288, + "sha256": "50f0db39e980f29f693a0806d1d2cff1e88bce680448181418440362a66cabf5" + }, + "final_value": 1017079.3, + "order_intents": { + "count": 4306, + "sha256": "8ceb30edfe288d834194a069b3f5588dd763139633d2d1eda193511ff7dd7a96" + }, + "terminal_state_sha256": "67e49c164678d98824b30cd2bcd23b422571c3a0261734fda293e899b01b1d2a", + "total_pnl": 17079.3, + "trade_count": 2271, + "trades": { + "count": 2271, + "sha256": "66c48c8a7633abd9bfd1d5cb6fdef5e625ce2a96b83722b84724b39eed60eefe" + } + }, + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_peak_rss_mb": 160.83203125, + "process_wall_seconds": 2.571588051971048, + "profile": "zipline_strict", + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runner_id": "zipline:ml4t", + "side": "ml4t", + "stages_seconds": { + "adapter_reported_engine": 0.8790653401520103, + "framework_call": 1.3678630059584975, + "input_generation": 0.19575455598533154, + "output_validation": 0.6345286080613732, + "worker_total": 2.2030992510262877 + }, + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "thread_environment": { + "MKL_NUM_THREADS": "1", + "NUMBA_NUM_THREADS": "1", + "OMP_NUM_THREADS": "1", + "OPENBLAS_NUM_THREADS": "1", + "POLARS_MAX_THREADS": "1", + "PYTHONHASHSEED": "0" + }, + "worker_self_peak_rss_mb": 159.125 + } + ], + "target": { + "access": "public", + "actual_version": "3.1.1", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "display_name": "Zipline Reloaded", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "version": "3.1.1" + }, + "warmup": { + "output_sha256": "931316a4f8eb196536fc90f7afb2ef0172ae4e08b6d652151e39877d22c0a59d", + "process_wall_seconds": 2.6221440921071917 + } + } + }, + "samples_per_runner": 10, + "schema_version": 1, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "performance_runner": "b0739317d13321297a7dbb505f1044ef6fe2f70a1d86ae53c56d4c672ad1b0f5", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "workload": { + "data_points": 12600, + "recipe": { + "assets": 50, + "bars": 252, + "bottom_n": 5, + "end_session": "2025-12-31", + "initial_cash": 1000000.0, + "long_target_shares": 100.0, + "name": "performance_50_assets_252_sessions", + "rebalance_frequency": 1, + "seed": 42, + "short_target_shares": -100.0, + "top_n": 5 + }, + "recipe_sha256": "3000b13c09f3bad9dfb6450c6aea002c07482b42f23481f36e97a2b364015c78" + } +} From 619f0e072fd43e7ea6b144ab64f313adacc1b24d Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 08:17:53 -0400 Subject: [PATCH 31/44] fix(validation): retire single-run speedup entry points --- .../contracts/test_static_analysis_policy.py | 4 +- .../backtrader/benchmark_performance.py | 305 +------- validation/release_checks.txt | 1 + validation/run_all_benchmarks.py | 703 +----------------- .../vectorbt_pro/benchmark_performance.py | 303 +------- validation/zipline/benchmark_performance.py | 423 +---------- 6 files changed, 26 insertions(+), 1713 deletions(-) diff --git a/tests/contracts/test_static_analysis_policy.py b/tests/contracts/test_static_analysis_policy.py index 72914528..fdac71f1 100644 --- a/tests/contracts/test_static_analysis_policy.py +++ b/tests/contracts/test_static_analysis_policy.py @@ -83,7 +83,7 @@ def test_ci_checks_every_release_validation_script() -> None: ) } excluded_validation_scripts = { - # Legacy benchmark entry points run only in their named framework environments. + # Compatibility benchmark entry points route to the checked retained harness. "validation/backtrader/benchmark_performance.py", "validation/backtrader/scale_validation.py", "validation/vectorbt_pro/benchmark_performance.py", @@ -94,7 +94,7 @@ def test_ci_checks_every_release_validation_script() -> None: "validation/lean/workspace/chapter16_sp500_equity_option_analytics/main.py", "validation/lean/workspace/chapter16_us_equities_panel/main.py", "validation/native/lean_project/main.py", - # Legacy manual orchestrators require optional framework environments. + # Manual orchestrators require optional framework environments. "validation/benchmark_suite.py", "validation/run_all_benchmarks.py", "validation/run_full_validation.py", diff --git a/validation/backtrader/benchmark_performance.py b/validation/backtrader/benchmark_performance.py index 3d13a404..1388c445 100644 --- a/validation/backtrader/benchmark_performance.py +++ b/validation/backtrader/benchmark_performance.py @@ -1,308 +1,15 @@ #!/usr/bin/env python3 -"""Performance benchmark: ml4t.backtest vs Backtrader. +"""Route the former Backtrader benchmark entry point to retained performance evidence.""" -This script benchmarks runtime performance across different data sizes -and number of assets. +from __future__ import annotations -Run from .venv-backtrader environment: - .venv-backtrader/bin/python3 validation/backtrader/benchmark_performance.py - -Metrics: -- Total runtime (seconds) -- Trades per second -- Memory usage (MB) -""" - -import gc import sys -import time -import tracemalloc from pathlib import Path -import numpy as np -import pandas as pd - -# Add project root to path -PROJECT_ROOT = Path(__file__).parent.parent.parent -sys.path.insert(0, str(PROJECT_ROOT / "src")) - - -def generate_benchmark_data(n_bars: int, n_assets: int, seed: int = 42) -> tuple: - """Generate benchmark data for both frameworks.""" - np.random.seed(seed) - - dates = pd.date_range(start="2020-01-01", periods=n_bars, freq="D") - - # Generate price data for multiple assets - asset_data = {} - for i in range(n_assets): - base_price = 100.0 + i * 10 - returns = np.random.randn(n_bars) * 0.02 - prices = base_price * np.exp(np.cumsum(returns)) - - asset_data[f"ASSET_{i:03d}"] = pd.DataFrame( - { - "open": prices * (1 + np.random.randn(n_bars) * 0.005), - "high": prices * (1 + np.abs(np.random.randn(n_bars)) * 0.01), - "low": prices * (1 - np.abs(np.random.randn(n_bars)) * 0.01), - "close": prices, - "volume": np.random.randint(100000, 1000000, n_bars).astype(float), - }, - index=dates, - ) - - # Generate signals - entry every 20 bars, exit 10 bars later - entries = np.zeros(n_bars, dtype=bool) - exits = np.zeros(n_bars, dtype=bool) - - i = 0 - while i < n_bars - 11: - entries[i] = True - exits[i + 10] = True - i += 20 - - return asset_data, entries, exits, dates - - -def benchmark_backtrader(asset_data: dict, entries: np.ndarray, exits: np.ndarray) -> dict: - """Benchmark Backtrader.""" - import backtrader as bt - - class PandasData(bt.feeds.PandasData): - params = ( - ("datetime", None), - ("open", "open"), - ("high", "high"), - ("low", "low"), - ("close", "close"), - ("volume", "volume"), - ("openinterest", -1), - ) - - class BenchmarkStrategy(bt.Strategy): - params = (("entries", None), ("exits", None)) - - def __init__(self): - self.bar_count = 0 - self.trade_count = 0 - - def next(self): - idx = self.bar_count - for i, data in enumerate(self.datas): - if not self.getposition(data): - if idx < len(self.params.entries) and self.params.entries[idx]: - self.buy(data=data, size=100) - else: - if idx < len(self.params.exits) and self.params.exits[idx]: - self.close(data=data) - self.bar_count += 1 - - def notify_trade(self, trade): - if trade.isclosed: - self.trade_count += 1 - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - cerebro = bt.Cerebro() - cerebro.broker.setcash(100_000.0) - cerebro.broker.setcommission(commission=0.0) - - for name, df in asset_data.items(): - data = PandasData(dataname=df) - cerebro.adddata(data, name=name) - - cerebro.addstrategy(BenchmarkStrategy, entries=entries, exits=exits) - - results = cerebro.run() - strategy = results[0] - num_trades = strategy.trade_count - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "Backtrader", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - } - - -def benchmark_ml4t_backtest( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates -) -> dict: - """Benchmark ml4t.backtest.""" - import polars as pl - - from ml4t.backtest._validation_imports import DataFeed, Engine, ExecutionMode, NoCommission, NoSlippage, Strategy - - # Prepare data in polars format - rows = [] - for asset_name, df in asset_data.items(): - for i, (ts, row) in enumerate(df.iterrows()): - rows.append( - { - "timestamp": ts.to_pydatetime(), - "asset": asset_name, - "open": row["open"], - "high": row["high"], - "low": row["low"], - "close": row["close"], - "volume": row["volume"], - } - ) - - prices_pl = pl.DataFrame(rows) - - # Prepare signals - signal_rows = [] - for asset_name in asset_data: - for i, ts in enumerate(dates): - signal_rows.append( - { - "timestamp": ts.to_pydatetime(), - "asset": asset_name, - "entry": bool(entries[i]), - "exit": bool(exits[i]), - } - ) - - signals_pl = pl.DataFrame(signal_rows) - - class BenchmarkStrategy(Strategy): - def on_data(self, timestamp, data, context, broker): - for asset_name, asset_data in data.items(): - signals = asset_data.get("signals", {}) - position = broker.get_position(asset_name) - current_qty = position.quantity if position else 0 - - if signals.get("exit") and current_qty > 0: - broker.close_position(asset_name) - elif signals.get("entry") and current_qty == 0: - broker.submit_order(asset_name, 100) - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - feed = DataFeed(prices_df=prices_pl, signals_df=signals_pl) - strategy = BenchmarkStrategy() - - engine = Engine( - feed, - strategy, - initial_cash=100_000.0, - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.NEXT_BAR, # Match Backtrader - ) - - results = engine.run() - num_trades = results["num_trades"] - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "ml4t.backtest", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - } - - -def run_benchmark(n_bars: int, n_assets: int) -> dict: - """Run benchmark for specific configuration.""" - print(f"\n Generating data: {n_bars} bars x {n_assets} assets...") - asset_data, entries, exits, dates = generate_benchmark_data(n_bars, n_assets) - - print(" Running Backtrader...") - bt_results = benchmark_backtrader(asset_data, entries, exits) - - print(" Running ml4t.backtest...") - ml4t_results = benchmark_ml4t_backtest(asset_data, entries, exits, dates) - - # Calculate speedup (>1 means Backtrader is faster) - speedup = ( - bt_results["runtime_sec"] / ml4t_results["runtime_sec"] - if ml4t_results["runtime_sec"] > 0 - else 0 - ) - - return { - "n_bars": n_bars, - "n_assets": n_assets, - "bt_runtime": bt_results["runtime_sec"], - "bt_trades": bt_results["num_trades"], - "bt_memory": bt_results["memory_mb"], - "ml4t_runtime": ml4t_results["runtime_sec"], - "ml4t_trades": ml4t_results["num_trades"], - "ml4t_memory": ml4t_results["memory_mb"], - "speedup": speedup, - } - - -def main(): - print("=" * 70) - print("Performance Benchmark: ml4t.backtest vs Backtrader") - print("=" * 70) - - # Test configurations (smaller for Backtrader - it's slower) - configs = [ - (100, 1), - (1000, 1), - (10000, 1), - (1000, 10), - (1000, 50), - ] - - results = [] - - for n_bars, n_assets in configs: - print(f"\nBenchmark: {n_bars} bars x {n_assets} assets") - try: - result = run_benchmark(n_bars, n_assets) - results.append(result) - - print( - f" BT: {result['bt_runtime']:.3f}s, {result['bt_trades']} trades, {result['bt_memory']:.1f} MB" - ) - print( - f" ML4T: {result['ml4t_runtime']:.3f}s, {result['ml4t_trades']} trades, {result['ml4t_memory']:.1f} MB" - ) - print( - f" Speedup: {result['speedup']:.2f}x {'(BT faster)' if result['speedup'] > 1 else '(ML4T faster)'}" - ) - except Exception as e: - print(f" ERROR: {e}") - import traceback - - traceback.print_exc() - - # Summary table - print("\n" + "=" * 70) - print("SUMMARY") - print("=" * 70) - print(f"{'Config':<20} {'BT (s)':<12} {'ML4T (s)':<12} {'Speedup':<12} {'Winner'}") - print("-" * 70) - - for r in results: - config = f"{r['n_bars']}x{r['n_assets']}" - winner = "BT" if r["speedup"] > 1 else "ML4T" - speedup_str = f"{r['speedup']:.2f}x" if r["speedup"] > 1 else f"{1/r['speedup']:.2f}x" - print( - f"{config:<20} {r['bt_runtime']:<12.3f} {r['ml4t_runtime']:<12.3f} {speedup_str:<12} {winner}" - ) - - print("=" * 70) - - return 0 +VALIDATION_DIR = Path(__file__).parents[1] +sys.path.insert(0, str(VALIDATION_DIR)) +from cross_framework_performance import main # noqa: E402 if __name__ == "__main__": - sys.exit(main()) + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 5a8686a3..895397e1 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -3,6 +3,7 @@ validation/check_coverage.py validation/check_documentation_examples.py validation/check_security.py validation/build_framework_env.py +validation/cross_framework_performance.py validation/generate_changelog.py validation/generate_compatibility_snapshot.py validation/generate_parity_claims.py diff --git a/validation/run_all_benchmarks.py b/validation/run_all_benchmarks.py index e51f2b31..193f940b 100644 --- a/validation/run_all_benchmarks.py +++ b/validation/run_all_benchmarks.py @@ -1,723 +1,30 @@ #!/usr/bin/env python3 -"""Unified Performance Benchmark Runner. +"""Compatibility entry point for the retained cross-framework performance harness.""" -Runs performance benchmarks across all frameworks and generates a summary report. +from __future__ import annotations -Usage: - # Run all frameworks - python validation/run_all_benchmarks.py - - # Run specific framework - python validation/run_all_benchmarks.py --framework ml4t - - # Run specific configuration - python validation/run_all_benchmarks.py --config "100x1" "1000x1" - -Output: - - Console summary - - validation/BENCHMARK_RESULTS.md -""" - -import argparse -import gc -import subprocess import sys -import time -import tracemalloc -from datetime import datetime from pathlib import Path -import numpy as np -import pandas as pd - -# Directory structure VALIDATION_DIR = Path(__file__).parent -PROJECT_ROOT = VALIDATION_DIR.parent - -# Add project root to path for ml4t imports -sys.path.insert(0, str(PROJECT_ROOT / "src")) sys.path.insert(0, str(VALIDATION_DIR)) from common.framework_registry import load_framework_manifest # noqa: E402 +from cross_framework_performance import main as performance_main # noqa: E402 -# Framework configurations FRAMEWORKS: dict[str, dict[str, str | None]] = { - "ml4t": { - "venv": ".venv", - "display_name": "ml4t.backtest", - "function": "benchmark_ml4t", - } + "ml4t": {"venv": ".venv", "display_name": "ml4t.backtest"} } FRAMEWORKS.update( { framework_id: { "venv": target.environment, "display_name": target.display_name, - "function": f"benchmark_{framework_id}", } for framework_id, target in load_framework_manifest().targets.items() } ) -# Test configurations (n_bars, n_assets) -CONFIGS = { - "100x1": (100, 1), - "500x1": (500, 1), - "1000x1": (1000, 1), - "500x5": (500, 5), - "1000x10": (1000, 10), - "2520x500": (2520, 500), # ~10 years daily -} - - -def generate_benchmark_data(n_bars: int, n_assets: int, seed: int = 42) -> tuple: - """Generate benchmark data for testing.""" - np.random.seed(seed) - - # Generate date index (business days) - dates = pd.date_range(start="2013-01-02", periods=n_bars, freq="B", tz="UTC") - - # Generate price data for multiple assets - asset_data = {} - for i in range(n_assets): - base_price = 100.0 + i * 10 - returns = np.random.randn(n_bars) * 0.02 - prices = base_price * np.exp(np.cumsum(returns)) - - asset_data[f"ASSET_{i:03d}"] = pd.DataFrame( - { - "open": prices * (1 + np.random.randn(n_bars) * 0.005), - "high": prices * (1 + np.abs(np.random.randn(n_bars)) * 0.01), - "low": prices * (1 - np.abs(np.random.randn(n_bars)) * 0.01), - "close": prices, - "volume": np.random.randint(100000, 1000000, n_bars).astype(float), - }, - index=dates, - ) - - # Generate signals - entry every 20 bars, exit 10 bars later - entries = np.zeros(n_bars, dtype=bool) - exits = np.zeros(n_bars, dtype=bool) - - i = 0 - while i < n_bars - 11: - entries[i] = True - exits[i + 10] = True - i += 20 - - return asset_data, entries, exits, dates - - -def benchmark_ml4t(asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates) -> dict: - """Benchmark ml4t.backtest.""" - import polars as pl - - from ml4t.backtest._validation_imports import ( - DataFeed, - Engine, - ExecutionMode, - NoCommission, - NoSlippage, - Strategy, - ) - - # Prepare data in polars format - rows = [] - for asset_name, df in asset_data.items(): - for ts, row in df.iterrows(): - rows.append( - { - "timestamp": ts.to_pydatetime().replace(tzinfo=None), - "asset": asset_name, - "open": row["open"], - "high": row["high"], - "low": row["low"], - "close": row["close"], - "volume": row["volume"], - } - ) - - prices_pl = pl.DataFrame(rows) - - # Prepare signals - signal_rows = [] - for asset_name in asset_data: - for i, ts in enumerate(dates): - signal_rows.append( - { - "timestamp": ts.to_pydatetime().replace(tzinfo=None), - "asset": asset_name, - "entry": bool(entries[i]), - "exit": bool(exits[i]), - } - ) - - signals_pl = pl.DataFrame(signal_rows) - - class BenchmarkStrategy(Strategy): - def on_data(self, timestamp, data, context, broker): - for asset_name, asset_data in data.items(): - signals = asset_data.get("signals", {}) - position = broker.get_position(asset_name) - current_qty = position.quantity if position else 0 - - if signals.get("exit") and current_qty > 0: - broker.close_position(asset_name) - elif signals.get("entry") and current_qty == 0: - broker.submit_order(asset_name, 100) - - # Warm-up run - small_prices = prices_pl.head(100 * len(asset_data)) - small_signals = signals_pl.head(100 * len(asset_data)) - small_feed = DataFeed(prices_df=small_prices, signals_df=small_signals) - small_engine = Engine( - small_feed, - BenchmarkStrategy(), - initial_cash=100_000_000.0, # Match main run - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.SAME_BAR, - ) - _ = small_engine.run() - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - feed = DataFeed(prices_df=prices_pl, signals_df=signals_pl) - engine = Engine( - feed, - BenchmarkStrategy(), - initial_cash=100_000_000.0, # $100M to handle 500 assets - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.SAME_BAR, - ) - - results = engine.run() - num_trades = results["num_trades"] - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "ml4t.backtest", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - "success": True, - } - - -def benchmark_vectorbt_oss( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, _dates -) -> dict: - """Benchmark VectorBT OSS.""" - try: - import vectorbt as vbt - except ImportError: - return {"framework": "VectorBT OSS", "success": False, "error": "Not installed"} - - # Build price panel - close_df = pd.DataFrame({name: df["close"] for name, df in asset_data.items()}) - - # Expand signals to match assets - entries_2d = np.column_stack([entries] * len(asset_data)) - exits_2d = np.column_stack([exits] * len(asset_data)) - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - pf = vbt.Portfolio.from_signals( - close=close_df, - entries=entries_2d, - exits=exits_2d, - init_cash=100_000.0, - fees=0.0, - slippage=0.0, - size=100, - accumulate=False, - ) - - trades_count = pf.trades.count() - # Handle both scalar and Series (multi-asset case) - num_trades = int(trades_count.sum()) if hasattr(trades_count, "sum") else int(trades_count) - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "VectorBT OSS", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - "success": True, - } - - -def benchmark_vectorbt_pro( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, _dates -) -> dict: - """Benchmark VectorBT Pro.""" - try: - import vectorbtpro as vbt - except ImportError: - return {"framework": "VectorBT Pro", "success": False, "error": "Not installed"} - - # Build price panel - close_df = pd.DataFrame({name: df["close"] for name, df in asset_data.items()}) - - # Expand signals to match assets - entries_2d = np.column_stack([entries] * len(asset_data)) - exits_2d = np.column_stack([exits] * len(asset_data)) - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - pf = vbt.Portfolio.from_signals( - close=close_df, - entries=entries_2d, - exits=exits_2d, - init_cash=100_000.0, - fees=0.0, - slippage=0.0, - size=100, - accumulate=False, - ) - - trades_count = pf.trades.count() - # Handle both scalar and Series (multi-asset case) - num_trades = int(trades_count.sum()) if hasattr(trades_count, "sum") else int(trades_count) - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "VectorBT Pro", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - "success": True, - } - - -def benchmark_backtrader(asset_data: dict, entries: np.ndarray, exits: np.ndarray, _dates) -> dict: - """Benchmark Backtrader.""" - try: - import backtrader as bt - except ImportError: - return {"framework": "Backtrader", "success": False, "error": "Not installed"} - - trade_count = [0] - - class BenchmarkStrategy(bt.Strategy): - def __init__(self): - self.bar_idx = 0 - - def next(self): - if self.bar_idx >= len(entries): - return - - for data in self.datas: - position = self.getposition(data) - current_qty = position.size - - if exits[self.bar_idx] and current_qty > 0: - self.close(data) - trade_count[0] += 1 - elif entries[self.bar_idx] and current_qty == 0: - self.buy(data, size=100) - trade_count[0] += 1 - - self.bar_idx += 1 - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - cerebro = bt.Cerebro() - cerebro.addstrategy(BenchmarkStrategy) - cerebro.broker.setcash(100_000.0) - cerebro.broker.setcommission(commission=0.0) - - for asset_name, df in asset_data.items(): - bt_data = bt.feeds.PandasData( - dataname=df, - datetime=None, - open="open", - high="high", - low="low", - close="close", - volume="volume", - openinterest=-1, - ) - cerebro.adddata(bt_data, name=asset_name) - - cerebro.run() - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "Backtrader", - "runtime_sec": end_time - start_time, - "num_trades": trade_count[0], - "memory_mb": peak / 1024 / 1024, - "success": True, - } - - -def benchmark_zipline(asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates) -> dict: - """Benchmark Zipline-Reloaded.""" - try: - from zipline import run_algorithm - from zipline.api import order, set_commission, set_slippage, symbol - from zipline.finance.commission import NoCommission - from zipline.finance.slippage import FixedSlippage - except ImportError: - return {"framework": "Zipline", "success": False, "error": "Not installed"} - - # Build panel data for Zipline - panel_data = {} - for field in ["open", "high", "low", "close", "volume"]: - panel_data[field] = pd.DataFrame({name: df[field] for name, df in asset_data.items()}) - - asset_names = list(asset_data.keys()) - trade_count = [0] - - def initialize(context): - context.entries = entries - context.exits = exits - context.bar_idx = 0 - context.asset_names = asset_names - set_commission(NoCommission()) - set_slippage(FixedSlippage(spread=0.0)) - - def handle_data(context, _data): - if context.bar_idx >= len(context.entries): - return - - for asset_name in context.asset_names: - try: - asset = symbol(asset_name) - except Exception: - continue - - position = context.portfolio.positions.get(asset) - current_qty = position.amount if position else 0 - - if context.exits[context.bar_idx] and current_qty > 0: - order(asset, -current_qty) - trade_count[0] += 1 - elif context.entries[context.bar_idx] and current_qty == 0: - order(asset, 100) - trade_count[0] += 1 - - context.bar_idx += 1 - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - try: - run_algorithm( - start=dates[0], - end=dates[-1], - initialize=initialize, - handle_data=handle_data, - capital_base=100_000.0, - data=panel_data, - ) - success = True - except Exception as e: - success = False - return {"framework": "Zipline", "success": False, "error": str(e)} - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "Zipline", - "runtime_sec": end_time - start_time, - "num_trades": trade_count[0], - "memory_mb": peak / 1024 / 1024, - "success": success, - } - - -def benchmark_lean(_asset_data: dict, _entries: np.ndarray, _exits: np.ndarray, _dates) -> dict: - """Benchmark LEAN CLI (requires Docker).""" - lean_workspace = VALIDATION_DIR / "lean" / "workspace" - - if not lean_workspace.exists(): - return {"framework": "LEAN CLI", "success": False, "error": "Workspace not found"} - - # Check if lean CLI is available - try: - result = subprocess.run( - ["lean", "--version"], - capture_output=True, - text=True, - timeout=10, - ) - if result.returncode != 0: - return {"framework": "LEAN CLI", "success": False, "error": "CLI not available"} - except Exception as e: - return {"framework": "LEAN CLI", "success": False, "error": str(e)} - - # Run a simple backtest using the test_validation project - test_project = lean_workspace / "test_validation" - if not test_project.exists(): - return {"framework": "LEAN CLI", "success": False, "error": "Test project not found"} - - gc.collect() - start_time = time.perf_counter() - - try: - result = subprocess.run( - ["lean", "backtest", str(test_project)], - capture_output=True, - text=True, - timeout=300, # LEAN can be slow (Docker + initialization) - cwd=str(lean_workspace), - ) - success = result.returncode == 0 - - # Parse output for performance info - output = result.stdout + result.stderr - if "Total Trades" in output: - # Try to extract trade count from LEAN output - for line in output.split("\n"): - if "Total Trades" in line: - try: - num_trades = int(line.split()[-1]) - break - except (ValueError, IndexError): - num_trades = 0 - else: - num_trades = 0 - - except subprocess.TimeoutExpired: - return {"framework": "LEAN CLI", "success": False, "error": "Timeout (300s)"} - except Exception as e: - return {"framework": "LEAN CLI", "success": False, "error": str(e)} - - end_time = time.perf_counter() - - return { - "framework": "LEAN CLI", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": 0, # Cannot measure Docker memory easily - "success": success, - "note": "Docker-based execution, includes container startup overhead", - } - - -def run_benchmark(config_name: str, framework: str) -> dict: - """Run a single benchmark configuration.""" - n_bars, n_assets = CONFIGS[config_name] - - print(f"\n Generating data: {n_bars} bars x {n_assets} assets...") - asset_data, entries, exits, dates = generate_benchmark_data(n_bars, n_assets) - - benchmark_func = { - "ml4t": benchmark_ml4t, - "vectorbt_pro": benchmark_vectorbt_pro, - "vectorbt_oss": benchmark_vectorbt_oss, - "backtrader": benchmark_backtrader, - "zipline": benchmark_zipline, - "lean": benchmark_lean, - }.get(framework) - - if not benchmark_func: - return {"framework": framework, "success": False, "error": "Unknown framework"} - - try: - result = benchmark_func(asset_data, entries, exits, dates) - result["config"] = config_name - result["n_bars"] = n_bars - result["n_assets"] = n_assets - return result - except Exception as e: - return { - "framework": framework, - "config": config_name, - "success": False, - "error": str(e), - } - - -def run_all_benchmarks(frameworks: list = None, configs: list = None) -> list: - """Run all benchmarks and return results.""" - if frameworks is None: - frameworks = list(FRAMEWORKS.keys()) - if configs is None: - configs = list(CONFIGS.keys()) - - results = [] - - for framework in frameworks: - config = FRAMEWORKS.get(framework) - if not config: - print(f"Unknown framework: {framework}") - continue - - print(f"\n{'=' * 60}") - print(f"Framework: {config['display_name']}") - print(f"{'=' * 60}") - - for config_name in configs: - print(f"\n Config: {config_name}") - result = run_benchmark(config_name, framework) - results.append(result) - - if result.get("success"): - print( - f" Runtime: {result['runtime_sec']:.3f}s, " - f"Trades: {result['num_trades']}, " - f"Memory: {result.get('memory_mb', 0):.1f} MB" - ) - else: - print(f" FAILED: {result.get('error', 'Unknown error')}") - - return results - - -def generate_report(results: list) -> str: - """Generate markdown report from results.""" - now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - - lines = [ - "# Performance Benchmark Results", - "", - f"**Generated**: {now}", - "", - "## Summary", - "", - "| Framework | Config | Runtime (s) | Trades | Memory (MB) | Status |", - "|-----------|--------|-------------|--------|-------------|--------|", - ] - - for r in results: - framework = r.get("framework", "Unknown") - config = r.get("config", "N/A") - if r.get("success"): - runtime = f"{r['runtime_sec']:.3f}" - trades = str(r.get("num_trades", "N/A")) - memory = f"{r.get('memory_mb', 0):.1f}" - status = "PASS" - else: - runtime = "-" - trades = "-" - memory = "-" - status = f"FAIL: {r.get('error', 'Unknown')[:30]}" - - lines.append(f"| {framework} | {config} | {runtime} | {trades} | {memory} | {status} |") - - # Add comparison table by config - lines.extend( - [ - "", - "## Performance Comparison by Configuration", - "", - ] - ) - - # Group by config - configs_seen = {r.get("config") for r in results if r.get("config")} - for config_name in sorted(configs_seen): - config_results = [r for r in results if r.get("config") == config_name and r.get("success")] - if not config_results: - continue - - lines.extend( - [ - f"### {config_name}", - "", - "| Framework | Runtime (s) | vs ml4t |", - "|-----------|-------------|---------|", - ] - ) - - # Find ml4t baseline - ml4t_time = None - for r in config_results: - if r.get("framework") == "ml4t.backtest": - ml4t_time = r["runtime_sec"] - break - - for r in sorted(config_results, key=lambda x: x["runtime_sec"]): - framework = r["framework"] - runtime = r["runtime_sec"] - if ml4t_time and ml4t_time > 0: - speedup = runtime / ml4t_time - vs_ml4t = f"{speedup:.2f}x" if speedup > 1 else f"{1 / speedup:.2f}x faster" - else: - vs_ml4t = "-" - lines.append(f"| {framework} | {runtime:.3f} | {vs_ml4t} |") - - lines.append("") - - return "\n".join(lines) - - -def main(): - parser = argparse.ArgumentParser(description="Run performance benchmarks") - parser.add_argument( - "--framework", - type=str, - help="Specific framework to test (ml4t, vectorbt_pro, vectorbt_oss, backtrader, zipline, lean)", - ) - parser.add_argument( - "--config", - type=str, - nargs="+", - help="Specific configurations to run (e.g., 100x1, 1000x1)", - ) - parser.add_argument( - "--output", - type=str, - default="validation/BENCHMARK_RESULTS.md", - help="Output file path", - ) - - args = parser.parse_args() - - frameworks = [args.framework] if args.framework else None - configs = args.config if args.config else None - - print("=" * 60) - print("Performance Benchmark Runner") - print("=" * 60) - - results = run_all_benchmarks(frameworks=frameworks, configs=configs) - - # Generate and save report - report = generate_report(results) - output_path = PROJECT_ROOT / args.output - output_path.write_text(report) - - print(f"\n{'=' * 60}") - print(f"Report saved to: {output_path}") - print("=" * 60) - - # Summary - passed = sum(1 for r in results if r.get("success")) - failed = len(results) - passed - print(f"\nTotal: {len(results)} benchmarks ({passed} passed, {failed} failed)") - - return 0 if failed == 0 else 1 - if __name__ == "__main__": - sys.exit(main()) + raise SystemExit(performance_main()) diff --git a/validation/vectorbt_pro/benchmark_performance.py b/validation/vectorbt_pro/benchmark_performance.py index 4a5d1f49..a64e82c3 100644 --- a/validation/vectorbt_pro/benchmark_performance.py +++ b/validation/vectorbt_pro/benchmark_performance.py @@ -1,306 +1,15 @@ #!/usr/bin/env python3 -"""Performance benchmark: ml4t.backtest vs VectorBT Pro. +"""Route the former VectorBT Pro benchmark entry point to retained performance evidence.""" -This script benchmarks runtime performance across different data sizes -and number of assets. +from __future__ import annotations -Run from .venv-vectorbt-pro environment: - source .venv-vectorbt-pro/bin/activate - python validation/vectorbt_pro/benchmark_performance.py - -Metrics: -- Total runtime (seconds) -- Trades per second -- Memory usage (MB) -""" - -import gc import sys -import time -import tracemalloc from pathlib import Path -import numpy as np -import pandas as pd - -# Add project root to path -PROJECT_ROOT = Path(__file__).parent.parent.parent -sys.path.insert(0, str(PROJECT_ROOT / "src")) - - -def generate_benchmark_data(n_bars: int, n_assets: int, seed: int = 42) -> tuple: - """Generate benchmark data for both frameworks.""" - np.random.seed(seed) - - dates = pd.date_range(start="2020-01-01", periods=n_bars, freq="D") - - # Generate price data for multiple assets - asset_data = {} - for i in range(n_assets): - base_price = 100.0 + i * 10 - returns = np.random.randn(n_bars) * 0.02 - prices = base_price * np.exp(np.cumsum(returns)) - - asset_data[f"ASSET_{i:03d}"] = pd.DataFrame( - { - "open": prices * (1 + np.random.randn(n_bars) * 0.005), - "high": prices * (1 + np.abs(np.random.randn(n_bars)) * 0.01), - "low": prices * (1 - np.abs(np.random.randn(n_bars)) * 0.01), - "close": prices, - "volume": np.random.randint(100000, 1000000, n_bars).astype(float), - }, - index=dates, - ) - - # Generate signals - entry every 20 bars, exit 10 bars later - entries = np.zeros(n_bars, dtype=bool) - exits = np.zeros(n_bars, dtype=bool) - - i = 0 - while i < n_bars - 11: - entries[i] = True - exits[i + 10] = True - i += 20 - - return asset_data, entries, exits, dates - - -def benchmark_vectorbt_pro(asset_data: dict, entries: np.ndarray, exits: np.ndarray) -> dict: - """Benchmark VectorBT Pro.""" - import vectorbtpro as vbt - - # Prepare close prices DataFrame - close_df = pd.DataFrame({name: df["close"] for name, df in asset_data.items()}) - - # Warm-up run - _ = vbt.Portfolio.from_signals( - close=close_df.iloc[:100], - entries=entries[:100], - exits=exits[:100], - init_cash=100_000.0, - size=100, - size_type="amount", - fees=0.0, - slippage=0.0, - ) - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - pf = vbt.Portfolio.from_signals( - close=close_df, - entries=entries, - exits=exits, - init_cash=100_000.0, - size=100, - size_type="amount", - fees=0.0, - slippage=0.0, - ) - - # Force computation - _ = pf.total_return - num_trades = len(pf.trades.records_readable) - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "VectorBT Pro", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - } - - -def benchmark_ml4t_backtest( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates -) -> dict: - """Benchmark ml4t.backtest.""" - import polars as pl - - from ml4t.backtest._validation_imports import DataFeed, Engine, ExecutionMode, NoCommission, NoSlippage, Strategy - - # Prepare data in polars format - rows = [] - for asset_name, df in asset_data.items(): - for i, (ts, row) in enumerate(df.iterrows()): - rows.append( - { - "timestamp": ts.to_pydatetime(), - "asset": asset_name, - "open": row["open"], - "high": row["high"], - "low": row["low"], - "close": row["close"], - "volume": row["volume"], - } - ) - - prices_pl = pl.DataFrame(rows) - - # Prepare signals - signal_rows = [] - for asset_name in asset_data: - for i, ts in enumerate(dates): - signal_rows.append( - { - "timestamp": ts.to_pydatetime(), - "asset": asset_name, - "entry": bool(entries[i]), - "exit": bool(exits[i]), - } - ) - - signals_pl = pl.DataFrame(signal_rows) - - class BenchmarkStrategy(Strategy): - def on_data(self, timestamp, data, context, broker): - for asset_name, asset_data in data.items(): - signals = asset_data.get("signals", {}) - position = broker.get_position(asset_name) - current_qty = position.quantity if position else 0 - - if signals.get("exit") and current_qty > 0: - broker.close_position(asset_name) - elif signals.get("entry") and current_qty == 0: - broker.submit_order(asset_name, 100) - - # Warm-up run with small data - small_prices = prices_pl.head(100 * len(asset_data)) - small_signals = signals_pl.head(100 * len(asset_data)) - small_feed = DataFeed(prices_df=small_prices, signals_df=small_signals) - small_engine = Engine( - small_feed, - BenchmarkStrategy(), - initial_cash=100_000.0, - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.SAME_BAR, - ) - _ = small_engine.run() - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - feed = DataFeed(prices_df=prices_pl, signals_df=signals_pl) - strategy = BenchmarkStrategy() - - engine = Engine( - feed, - strategy, - initial_cash=100_000.0, - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.SAME_BAR, - ) - - results = engine.run() - num_trades = results["num_trades"] - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "ml4t.backtest", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - } - - -def run_benchmark(n_bars: int, n_assets: int) -> dict: - """Run benchmark for specific configuration.""" - print(f"\n Generating data: {n_bars} bars x {n_assets} assets...") - asset_data, entries, exits, dates = generate_benchmark_data(n_bars, n_assets) - - print(" Running VectorBT Pro...") - vbt_results = benchmark_vectorbt_pro(asset_data, entries, exits) - - print(" Running ml4t.backtest...") - ml4t_results = benchmark_ml4t_backtest(asset_data, entries, exits, dates) - - # Calculate speedup - speedup = ( - vbt_results["runtime_sec"] / ml4t_results["runtime_sec"] - if ml4t_results["runtime_sec"] > 0 - else 0 - ) - - return { - "n_bars": n_bars, - "n_assets": n_assets, - "vbt_runtime": vbt_results["runtime_sec"], - "vbt_trades": vbt_results["num_trades"], - "vbt_memory": vbt_results["memory_mb"], - "ml4t_runtime": ml4t_results["runtime_sec"], - "ml4t_trades": ml4t_results["num_trades"], - "ml4t_memory": ml4t_results["memory_mb"], - "speedup": speedup, - } - - -def main(): - print("=" * 70) - print("Performance Benchmark: ml4t.backtest vs VectorBT Pro") - print("=" * 70) - - # Test configurations - configs = [ - (100, 1), - (1000, 1), - (10000, 1), - (1000, 10), - (10000, 10), - (1000, 100), - ] - - results = [] - - for n_bars, n_assets in configs: - print(f"\nBenchmark: {n_bars} bars x {n_assets} assets") - try: - result = run_benchmark(n_bars, n_assets) - results.append(result) - - print( - f" VBT: {result['vbt_runtime']:.3f}s, {result['vbt_trades']} trades, {result['vbt_memory']:.1f} MB" - ) - print( - f" ML4T: {result['ml4t_runtime']:.3f}s, {result['ml4t_trades']} trades, {result['ml4t_memory']:.1f} MB" - ) - print( - f" Speedup: {result['speedup']:.2f}x {'(VBT faster)' if result['speedup'] > 1 else '(ML4T faster)'}" - ) - except Exception as e: - print(f" ERROR: {e}") - traceback.print_exc() - - # Summary table - print("\n" + "=" * 70) - print("SUMMARY") - print("=" * 70) - print(f"{'Config':<20} {'VBT (s)':<12} {'ML4T (s)':<12} {'Speedup':<12} {'Winner'}") - print("-" * 70) - - for r in results: - config = f"{r['n_bars']}x{r['n_assets']}" - winner = "VBT" if r["speedup"] > 1 else "ML4T" - speedup_str = f"{r['speedup']:.2f}x" if r["speedup"] > 1 else f"{1/r['speedup']:.2f}x" - print( - f"{config:<20} {r['vbt_runtime']:<12.3f} {r['ml4t_runtime']:<12.3f} {speedup_str:<12} {winner}" - ) - - print("=" * 70) - - return 0 +VALIDATION_DIR = Path(__file__).parents[1] +sys.path.insert(0, str(VALIDATION_DIR)) +from cross_framework_performance import main # noqa: E402 if __name__ == "__main__": - sys.exit(main()) + raise SystemExit(main()) diff --git a/validation/zipline/benchmark_performance.py b/validation/zipline/benchmark_performance.py index 067c3941..d435da31 100644 --- a/validation/zipline/benchmark_performance.py +++ b/validation/zipline/benchmark_performance.py @@ -1,426 +1,15 @@ #!/usr/bin/env python3 -"""Performance benchmark: ml4t.backtest vs Zipline-Reloaded. +"""Route the former Zipline benchmark entry point to retained performance evidence.""" -This script benchmarks runtime performance across different data sizes -and number of assets. +from __future__ import annotations -Run from .venv-zipline or .venv-validation environment: - source .venv-zipline/bin/activate - python validation/zipline/benchmark_performance.py - -Metrics: -- Total runtime (seconds) -- Trades per second -- Memory usage (MB) -""" - -import gc import sys -import time -import traceback -import tracemalloc -from datetime import datetime from pathlib import Path -import numpy as np -import pandas as pd - -# Add project root to path -PROJECT_ROOT = Path(__file__).parent.parent.parent -sys.path.insert(0, str(PROJECT_ROOT / "src")) - - -def generate_benchmark_data(n_bars: int, n_assets: int, seed: int = 42) -> tuple: - """Generate benchmark data for both frameworks.""" - np.random.seed(seed) - - # Use NYSE trading days - try: - import exchange_calendars as xcals - nyse = xcals.get_calendar("XNYS") - start = pd.Timestamp("2013-01-02") # No timezone for exchange_calendars - sessions = nyse.sessions_in_range(start, start + pd.Timedelta(days=n_bars * 2)) - dates = pd.DatetimeIndex(sessions[:n_bars]).tz_localize("UTC") - except ImportError: - # Fallback to business days - dates = pd.date_range(start="2013-01-02", periods=n_bars, freq="B", tz="UTC") - - # Generate price data for multiple assets - asset_data = {} - for i in range(n_assets): - base_price = 100.0 + i * 10 - returns = np.random.randn(n_bars) * 0.02 - prices = base_price * np.exp(np.cumsum(returns)) - - asset_data[f"ASSET_{i:03d}"] = pd.DataFrame( - { - "open": prices * (1 + np.random.randn(n_bars) * 0.005), - "high": prices * (1 + np.abs(np.random.randn(n_bars)) * 0.01), - "low": prices * (1 - np.abs(np.random.randn(n_bars)) * 0.01), - "close": prices, - "volume": np.random.randint(100000, 1000000, n_bars).astype(float), - }, - index=dates, - ) - - # Generate signals - entry every 20 bars, exit 10 bars later - entries = np.zeros(n_bars, dtype=bool) - exits = np.zeros(n_bars, dtype=bool) - - i = 0 - while i < n_bars - 11: - entries[i] = True - exits[i + 10] = True - i += 20 - - return asset_data, entries, exits, dates - - -def setup_zipline_bundle(asset_data: dict, dates, bundle_name: str = "perf_benchmark"): - """Register and ingest a custom bundle with multi-asset test data.""" - from zipline.data.bundles import ingest, register - - def make_ingest_func(asset_data_dict, dates_idx): - def ingest_func( - environ, - asset_db_writer, - minute_bar_writer, - daily_bar_writer, - adjustment_writer, - calendar, - start_session, - end_session, - cache, - show_progress, - output_dir, - ): - sessions = calendar.sessions_in_range(start_session, end_session) - asset_names = list(asset_data_dict.keys()) - - # Write equity metadata - asset_db_writer.write( - equities=pd.DataFrame( - { - "symbol": asset_names, - "asset_name": [f"Asset {i}" for i in range(len(asset_names))], - "exchange": ["NYSE"] * len(asset_names), - } - ) - ) - - # Write daily bars for each asset - def gen_data(): - for sid, (asset_name, df) in enumerate(asset_data_dict.items()): - df_naive = df.copy() - if df_naive.index.tz is not None: - df_naive.index = df_naive.index.tz_convert(None) - valid_mask = df_naive.index.isin(sessions) - trading_df = df_naive[valid_mask].copy() - if len(trading_df) > 0: - yield sid, trading_df[["open", "high", "low", "close", "volume"]] - - daily_bar_writer.write(gen_data(), show_progress=show_progress) - adjustment_writer.write() - - return ingest_func - - start_session = dates[0] - end_session = dates[-1] - if hasattr(start_session, 'tz') and start_session.tz is not None: - start_session = start_session.tz_convert(None) - end_session = end_session.tz_convert(None) - - register( - bundle_name, - make_ingest_func(asset_data, dates), - calendar_name="XNYS", - start_session=start_session, - end_session=end_session, - ) - - ingest(bundle_name, show_progress=False) - return bundle_name - - -def benchmark_zipline(asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates) -> dict: - """Benchmark Zipline-Reloaded using bundle-based data.""" - from zipline import run_algorithm - from zipline.api import order, set_commission, set_slippage, sid - from zipline.finance.commission import NoCommission - from zipline.finance.slippage import FixedSlippage - - asset_names = list(asset_data.keys()) - trade_count = [0] - - # Set up bundle (not timed - this is data prep) - try: - bundle_name = setup_zipline_bundle(asset_data, dates) - except Exception as e: - print(f" Zipline bundle error: {e}") - return {"framework": "Zipline", "success": False, "error": f"Bundle setup failed: {e}"} - - def initialize(context): - context.entries = entries - context.exits = exits - context.bar_idx = 0 - context.n_assets = len(asset_names) - set_commission(NoCommission()) - set_slippage(FixedSlippage(spread=0.0)) - - def handle_data(context, data): - if context.bar_idx >= len(context.entries): - return - - for asset_idx in range(context.n_assets): - try: - asset = sid(asset_idx) - except Exception: - continue - - position = context.portfolio.positions.get(asset) - current_qty = position.amount if position else 0 - - if context.exits[context.bar_idx] and current_qty > 0: - order(asset, -current_qty) - trade_count[0] += 1 - elif context.entries[context.bar_idx] and current_qty == 0: - order(asset, 100) - trade_count[0] += 1 - - context.bar_idx += 1 - - # Convert to tz-naive for Zipline (it adds tz internally) - start_date = dates[0] - end_date = dates[-1] - if hasattr(start_date, 'tz') and start_date.tz is not None: - start_date = start_date.tz_convert(None) - end_date = end_date.tz_convert(None) - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - try: - run_algorithm( - start=start_date, - end=end_date, - initialize=initialize, - handle_data=handle_data, - capital_base=100_000_000.0, # $100M for large portfolios - bundle=bundle_name, - ) - success = True - except Exception as e: - print(f" Zipline error: {e}") - return {"framework": "Zipline", "success": False, "error": str(e)} - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "Zipline", - "runtime_sec": end_time - start_time, - "num_trades": trade_count[0], - "memory_mb": peak / 1024 / 1024, - "success": success, - } - - -def benchmark_ml4t_backtest( - asset_data: dict, entries: np.ndarray, exits: np.ndarray, dates -) -> dict: - """Benchmark ml4t.backtest.""" - import polars as pl - - from ml4t.backtest._validation_imports import DataFeed, Engine, ExecutionMode, NoCommission, NoSlippage, Strategy - - # Prepare data in polars format - rows = [] - for asset_name, df in asset_data.items(): - for i, (ts, row) in enumerate(df.iterrows()): - rows.append( - { - "timestamp": ts.to_pydatetime().replace(tzinfo=None), - "asset": asset_name, - "open": row["open"], - "high": row["high"], - "low": row["low"], - "close": row["close"], - "volume": row["volume"], - } - ) - - prices_pl = pl.DataFrame(rows) - - # Prepare signals - signal_rows = [] - for asset_name in asset_data: - for i, ts in enumerate(dates): - signal_rows.append( - { - "timestamp": ts.to_pydatetime().replace(tzinfo=None), - "asset": asset_name, - "entry": bool(entries[i]), - "exit": bool(exits[i]), - } - ) - - signals_pl = pl.DataFrame(signal_rows) - - class BenchmarkStrategy(Strategy): - def on_data(self, timestamp, data, context, broker): - for asset_name, asset_data in data.items(): - signals = asset_data.get("signals", {}) - position = broker.get_position(asset_name) - current_qty = position.quantity if position else 0 - - if signals.get("exit") and current_qty > 0: - broker.close_position(asset_name) - elif signals.get("entry") and current_qty == 0: - broker.submit_order(asset_name, 100) - - # Warm-up run with small data - small_prices = prices_pl.head(100 * len(asset_data)) - small_signals = signals_pl.head(100 * len(asset_data)) - small_feed = DataFeed(prices_df=small_prices, signals_df=small_signals) - small_engine = Engine( - small_feed, - BenchmarkStrategy(), - initial_cash=100_000.0, - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.SAME_BAR, - ) - _ = small_engine.run() - - gc.collect() - tracemalloc.start() - start_time = time.perf_counter() - - feed = DataFeed(prices_df=prices_pl, signals_df=signals_pl) - strategy = BenchmarkStrategy() - - engine = Engine( - feed, - strategy, - initial_cash=100_000.0, - allow_short_selling=False, - commission_model=NoCommission(), - slippage_model=NoSlippage(), - execution_mode=ExecutionMode.SAME_BAR, - ) - - results = engine.run() - num_trades = results["num_trades"] - - end_time = time.perf_counter() - current, peak = tracemalloc.get_traced_memory() - tracemalloc.stop() - - return { - "framework": "ml4t.backtest", - "runtime_sec": end_time - start_time, - "num_trades": num_trades, - "memory_mb": peak / 1024 / 1024, - } - - -def run_benchmark(n_bars: int, n_assets: int) -> dict: - """Run benchmark for specific configuration.""" - print(f"\n Generating data: {n_bars} bars x {n_assets} assets...") - asset_data, entries, exits, dates = generate_benchmark_data(n_bars, n_assets) - - print(" Running Zipline...") - zipline_results = benchmark_zipline(asset_data, entries, exits, dates) - - print(" Running ml4t.backtest...") - ml4t_results = benchmark_ml4t_backtest(asset_data, entries, exits, dates) - - # Calculate speedup - if ml4t_results["runtime_sec"] > 0 and zipline_results.get("success", False): - speedup = zipline_results["runtime_sec"] / ml4t_results["runtime_sec"] - else: - speedup = 0 - - return { - "n_bars": n_bars, - "n_assets": n_assets, - "zipline_runtime": zipline_results.get("runtime_sec", 0), - "zipline_trades": zipline_results.get("num_trades", 0), - "zipline_memory": zipline_results.get("memory_mb", 0), - "zipline_success": zipline_results.get("success", False), - "zipline_error": zipline_results.get("error", None), - "ml4t_runtime": ml4t_results["runtime_sec"], - "ml4t_trades": ml4t_results["num_trades"], - "ml4t_memory": ml4t_results["memory_mb"], - "speedup": speedup, - } - - -def main(): - print("=" * 70) - print("Performance Benchmark: ml4t.backtest vs Zipline-Reloaded") - print("=" * 70) - - # Test configurations (reduced from VBT benchmark due to Zipline overhead) - configs = [ - (100, 1), - (500, 1), - (1000, 1), - (500, 5), - (1000, 10), - ] - - results = [] - - for n_bars, n_assets in configs: - print(f"\nBenchmark: {n_bars} bars x {n_assets} assets") - try: - result = run_benchmark(n_bars, n_assets) - results.append(result) - - if result["zipline_success"]: - print( - f" Zipline: {result['zipline_runtime']:.3f}s, {result['zipline_trades']} trades, {result['zipline_memory']:.1f} MB" - ) - else: - err = result.get("zipline_error", "Unknown error") - print(f" Zipline: FAILED - {err}") - print( - f" ML4T: {result['ml4t_runtime']:.3f}s, {result['ml4t_trades']} trades, {result['ml4t_memory']:.1f} MB" - ) - if result["speedup"] > 0: - print( - f" Speedup: {result['speedup']:.2f}x {'(Zipline faster)' if result['speedup'] > 1 else '(ML4T faster)'}" - ) - except Exception as e: - print(f" ERROR: {e}") - traceback.print_exc() - - # Summary table - print("\n" + "=" * 70) - print("SUMMARY") - print("=" * 70) - print(f"{'Config':<20} {'Zipline (s)':<12} {'ML4T (s)':<12} {'Speedup':<12} {'Winner'}") - print("-" * 70) - - for r in results: - config = f"{r['n_bars']}x{r['n_assets']}" - if r["zipline_success"] and r["speedup"] > 0: - winner = "Zipline" if r["speedup"] > 1 else "ML4T" - speedup_str = f"{r['speedup']:.2f}x" if r["speedup"] > 1 else f"{1/r['speedup']:.2f}x" - print( - f"{config:<20} {r['zipline_runtime']:<12.3f} {r['ml4t_runtime']:<12.3f} {speedup_str:<12} {winner}" - ) - else: - print(f"{config:<20} {'FAILED':<12} {r['ml4t_runtime']:<12.3f} {'N/A':<12} {'N/A'}") - - print("=" * 70) - - return 0 +VALIDATION_DIR = Path(__file__).parents[1] +sys.path.insert(0, str(VALIDATION_DIR)) +from cross_framework_performance import main # noqa: E402 if __name__ == "__main__": - sys.exit(main()) + raise SystemExit(main()) From ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 08:20:54 -0400 Subject: [PATCH 32/44] docs(validation): align retained evidence claims --- README.md | 8 +++- docs/index.md | 10 ++++- docs/user-guide/profiles.md | 13 +++--- validation/README.md | 25 +++++++---- validation/claim_inventory.toml | 77 +++++++-------------------------- 5 files changed, 56 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 517dee5d..301efd88 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ opt-in. ## Cross-Framework Validation Profiles configure framework-specific execution behavior. The generated table below reports only -claims supported by the retained release-candidate evidence. +claims supported by retained accepted evidence. @@ -334,6 +334,12 @@ Workload definitions and expected checksums are retained in `validation/performance_baselines.json`. The project does not publish hardware-dependent runtime, throughput, memory, or cross-framework ratios as stable claims. +Cross-framework performance evidence uses a common 50-asset, 252-session controlled workload. +Each runner receives one isolated warm-up followed by ten isolated measurements. The retained +artifact contains raw samples, whole-process wall time, process-tree peak RSS, deterministic 95% +bootstrap intervals, output checksums, framework identities, and semantic disclosures for the +idiomatic view. The results remain audit evidence pending a separate publication decision. + ## Documentation - [Getting Started](docs/getting-started/quickstart.md) — your first backtest diff --git a/docs/index.md b/docs/index.md index 106f0281..88fb4bf1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -82,8 +82,9 @@ which pinned framework scenarios currently match exactly. **Quote-aware when you need it.** The feed can cache bid, ask, midpoint, and quote sizes additively. Market execution and position marking can use `price`, `bid`, `ask`, `quote_mid`, or `quote_side`. -**Validated at scale.** The retained 250-asset, 20-year VectorBT Pro workload compares 225,844 -trades with zero canonical gap. +**Validated at scale.** One reconstructable 250-asset, 5,040-session workload has retained exact +canonical output evidence for current VectorBT Pro, VectorBT OSS, Backtrader, Zipline Reloaded, +and LEAN targets. | Feature | Description | |---------|-------------| @@ -129,6 +130,11 @@ reported for diagnosis, while the instrument-free hotpath benchmark enforces the runtime regression limit. The project does not publish hardware-dependent performance ratios as stable claims. +The separate cross-framework performance artifact retains ten isolated measurements per runner +after one warm-up. It reports complete-process wall time, process-tree and LEAN-container peak RSS, +raw samples, 95% bootstrap intervals, exact output checksums, and semantic disclosures. It is +retained as audit evidence without stable speed or memory ratios pending a publication decision. + ## Installation ```bash diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index 6e2b44e9..b46ad927 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -145,8 +145,9 @@ Framework profiles are validated on the workloads each retained artifact declare VectorBT, Backtrader, and Zipline. Capability declarations identify reconstructed and unavailable result surfaces. -2. **Large-scale**: Trade-by-trade comparison on a retained real-data workload. A claim is omitted - when no passing artifact is retained for that framework. +2. **Large-scale**: Exact target-intent, native-fill, fill-derived closed-trade, and terminal-state + comparison on a reconstructable 250-asset, 5,040-session workload. Each framework row states + the surface it exposes; the claim does not include unavailable order-lifecycle fields. LEAN has separate native-behavior and Chapter 16 case-study evidence. The frozen engine produced 47,652 fills across three case studies; ML4T matched every canonical fill and each terminal value @@ -176,9 +177,11 @@ No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN ## Performance -The stable release does not publish cross-framework speed ratios. Release performance evidence is -limited to the deterministic workloads and measurement boundaries in -`validation/performance_baselines.json`; framework parity uses correctness evidence instead. +The stable release does not publish cross-framework speed ratios. ML4T-only regression evidence is +defined in `validation/performance_baselines.json`. The separate retained cross-framework artifact +uses one warm-up and ten process-isolated measurements per runner, with raw samples, median and 95% +intervals, process-tree peak RSS, exact output checksums, and an idiomatic view that makes no +equivalence claim. ## Listing Profiles diff --git a/validation/README.md b/validation/README.md index d41070be..a66d8aeb 100644 --- a/validation/README.md +++ b/validation/README.md @@ -84,16 +84,24 @@ runtime identity, input digests, adapter identity, and source provenance. Compar unavailable environments, adapter failures, subprocess failures, timeouts, skips, malformed records, missing pairs, duplicates, and incorrect required or unsupported counts fail the gate. -### Large-scale benchmarks +### Retained large-scale and performance evidence ```bash -# Framework benchmark -python validation/benchmark_suite.py --profile backtrader_strict --framework backtrader +# Validate retained reconstructable scale evidence +uv run python validation/large_scale_evidence.py --check --verify-input -# Full validation (correctness + benchmarks) -python validation/run_full_validation.py +# Validate repeated cross-framework performance evidence +uv run python validation/cross_framework_performance.py --check + +# Regenerate the complete controlled performance artifact +uv run python validation/cross_framework_performance.py --samples 10 ``` +The performance runner uses one isolated warm-up and ten isolated measurements per runner. It +retains complete-process wall time, process-tree peak RSS including the LEAN container, raw +samples, deterministic 95% bootstrap intervals, exact output checksums, immutable framework +identities, and semantic disclosures for an idiomatic view. No stable ratio claim is generated. + ## Virtual Environment Setup ```bash @@ -134,9 +142,10 @@ validation/ ├── frameworks/ # Parameterized framework drivers (4 modules) ├── run_scenario.py # Unified CLI runner ├── run_all_correctness.py # Isolated release-gate correctness runner -├── run_all_benchmarks.py # Framework benchmark loop -├── benchmark_suite.py # Large-scale benchmark runner -├── run_full_validation.py # Complete validation pipeline +├── large_scale_evidence.py # Reconstructable exact scale matrix +├── cross_framework_performance.py # Repeated controlled and idiomatic evidence +├── run_all_benchmarks.py # Compatibility route to the retained performance runner +├── benchmark_suite.py # Shared framework workload adapters ├── lean/ # LEAN integration ├── trade_logs/ # Golden file CSVs (gitignored) └── nautilus/ # Nautilus Trader evaluation diff --git a/validation/claim_inventory.toml b/validation/claim_inventory.toml index 9ce9f86d..cd07aa66 100644 --- a/validation/claim_inventory.toml +++ b/validation/claim_inventory.toml @@ -9,7 +9,7 @@ paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validatio type = "correctness" frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline"] required_evidence = ["executed_matrix", "canonical_trade_log", "canonical_fill_log", "equity_curve", "environment_identity"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#3" [[claim]] @@ -19,7 +19,7 @@ paths = ["README.md", "docs/concepts/how-it-works.md", "docs/getting-started/qui type = "behavioral" frameworks = ["vectorbt_pro", "vectorbt_oss"] required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#5" [[claim]] @@ -29,7 +29,7 @@ paths = ["README.md", "docs/concepts/how-it-works.md", "docs/getting-started/qui type = "behavioral" frameworks = ["backtrader"] required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#6" [[claim]] @@ -39,7 +39,7 @@ paths = ["README.md", "docs/concepts/how-it-works.md", "docs/getting-started/qui type = "behavioral" frameworks = ["zipline"] required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#7" [[claim]] @@ -49,37 +49,37 @@ paths = ["README.md", "docs/concepts/how-it-works.md", "docs/user-guide/accounts type = "behavioral" frameworks = ["lean"] required_evidence = ["native_microtests", "upstream_source_reference", "adapter_contract"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#8" [[claim]] id = "library-large-scale-equivalence" repository = "ml4t/backtest" -paths = ["README.md", "docs/index.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/vectorbt_pro/large_scale_parity.json"] +paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/LARGE_SCALE_RESULTS.json"] type = "correctness" -frameworks = ["vectorbt_pro"] +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] required_evidence = ["public_workload", "canonical_trade_log", "canonical_fill_log", "equity_curve", "environment_identity"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#10" [[claim]] id = "library-controlled-performance" repository = "ml4t/backtest" -paths = ["validation/benchmark_suite.py", "validation/run_all_benchmarks.py", "validation/performance_baseline.py", "validation/performance_baselines.json"] +paths = ["validation/cross_framework_performance.py", "validation/PERFORMANCE_RESULTS.json", "validation/run_all_benchmarks.py"] type = "performance" frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] required_evidence = ["controlled_workload", "warmup_policy", "repetitions", "machine_identity", "raw_timings"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#11" [[claim]] id = "library-idiomatic-performance" repository = "ml4t/backtest" -paths = ["validation/vectorbt_pro/benchmark_performance.py", "validation/backtrader/benchmark_performance.py", "validation/zipline/benchmark_performance.py"] +paths = ["validation/cross_framework_performance.py", "validation/PERFORMANCE_RESULTS.json", "validation/vectorbt_pro/benchmark_performance.py", "validation/backtrader/benchmark_performance.py", "validation/zipline/benchmark_performance.py"] type = "performance" frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] required_evidence = ["idiomatic_workload", "declared_scope", "warmup_policy", "repetitions", "machine_identity", "raw_timings"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#12" [[claim]] @@ -89,7 +89,7 @@ paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validatio type = "qualitative" frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] required_evidence = ["upstream_source_reference", "scope_qualification"] -status = "unresolved" +status = "verified" issue = "ml4t/backtest-dev#13" [[claim]] @@ -153,51 +153,6 @@ status = "unresolved" issue = "ml4t/backtest-dev#15" [[unresolved]] -id = "zipline-defaults-table" -finding = "Zipline commission and slippage defaults are misstated." -issue = "ml4t/backtest-dev#7" - -[[unresolved]] -id = "defaults-not-exercised" -finding = "Configured-equivalence scenarios do not test upstream defaults." -issue = "ml4t/backtest-dev#5" - -[[unresolved]] -id = "empty-correctness-details" -finding = "Retained pass records omit compared measurements." -issue = "ml4t/backtest-dev#3" - -[[unresolved]] -id = "stale-correctness-artifact" -finding = "The retained matrix predates current engine and framework targets." -issue = "ml4t/backtest-dev#13" - -[[unresolved]] -id = "scenario-scale-language" -finding = "The scenario matrix covers conventions, not high trade volume." -issue = "ml4t/backtest-dev#9" - -[[unresolved]] -id = "partial-ci-matrix" -finding = "CI does not execute every required framework and scenario pair." -issue = "ml4t/backtest-dev#4" - -[[unresolved]] -id = "mutable-install-ranges" -finding = "Comparison environments use version floors while claims name exact versions." -issue = "ml4t/backtest-dev#4" - -[[unresolved]] -id = "missing-vectorbt-oss-environment" -finding = "The documented VectorBT OSS interpreter path is not provisioned." -issue = "ml4t/backtest-dev#4" - -[[unresolved]] -id = "exact-means-quantized" -finding = "Exact comparisons mean equality after canonical quantization, not bit identity." -issue = "ml4t/backtest-dev#3" - -[[unresolved]] -id = "nonportable-large-scale-data" -finding = "The retained large-scale artifact points to a temporary local dataset path." -issue = "ml4t/backtest-dev#10" +id = "performance-publication-decision" +finding = "Whether to publish dated cross-framework runtime or memory ratios is deferred until the audit results are reviewed." +issue = "ml4t/backtest-dev#15" From 1b5131161f65fb42d0374cb182e04e42c654d114 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 09:17:06 -0400 Subject: [PATCH 33/44] test(validation): refresh clean scale evidence --- validation/LARGE_SCALE_RESULTS.json | 46 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/validation/LARGE_SCALE_RESULTS.json b/validation/LARGE_SCALE_RESULTS.json index 6bab2a0f..fcd06857 100644 --- a/validation/LARGE_SCALE_RESULTS.json +++ b/validation/LARGE_SCALE_RESULTS.json @@ -532,7 +532,7 @@ "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" }, "ml4t": { - "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "commit": "ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a", "dirty": false }, "python": { @@ -540,14 +540,14 @@ "version": "3.12.11" }, "runtime_seconds": { - "framework": 62.88472085003741, - "ml4t": 85.68690094188787, + "framework": 67.83662832411937, + "ml4t": 122.52686988189816, "not_a_performance_claim": true }, "source_digests": { "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", - "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" }, "target": { @@ -1098,7 +1098,7 @@ "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" }, "ml4t": { - "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "commit": "ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a", "dirty": false }, "python": { @@ -1106,14 +1106,14 @@ "version": "3.12.11" }, "runtime_seconds": { - "framework": 41.441031792899594, - "ml4t": 84.64774281391874, + "framework": 72.04599663615227, + "ml4t": 185.34229934494942, "not_a_performance_claim": true }, "source_digests": { "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", - "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" }, "target": { @@ -1321,22 +1321,22 @@ "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" }, "ml4t": { - "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "commit": "ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "runtime_seconds": { - "framework": 729.4739102870226, - "ml4t": 145.95089966920204, + "framework": 588.8566795079969, + "ml4t": 177.4460704110097, "not_a_performance_claim": true }, "source_digests": { "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", - "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" }, "target": { @@ -1561,22 +1561,22 @@ "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" }, "ml4t": { - "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "commit": "ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a", "dirty": false }, "python": { "implementation": "cpython", - "version": "3.11.13" + "version": "3.12.11" }, "runtime_seconds": { - "framework": 297.3190433611162, - "ml4t": 132.85931095900014, + "framework": 313.67492819414474, + "ml4t": 109.66853755200282, "not_a_performance_claim": true }, "source_digests": { "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", - "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" }, "target": { @@ -1766,7 +1766,7 @@ "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" }, "ml4t": { - "commit": "e1bf3602b5fba83c1ada88675fed86e0e0c4afe8", + "commit": "ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a", "dirty": false }, "python": { @@ -1774,14 +1774,14 @@ "version": "3.12.11" }, "runtime_seconds": { - "framework": 137.2150160910096, - "ml4t": 195.11730115604587, + "framework": 170.06328585091978, + "ml4t": 229.72061479417607, "not_a_performance_claim": true }, "source_digests": { "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", - "large_scale_runner": "d9112b55aa719dd119b822f76ba73e053a24ea95a55c848269ddb3bd727b5b43", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" }, "target": { @@ -1803,7 +1803,7 @@ } } ], - "generated_at": "2026-08-14T11:35:28.393203+00:00", + "generated_at": "2026-08-14T13:16:45.765518+00:00", "release_gate_passed": true, "schema_version": 1, "workload": { From 127893dc58ed2857706a3802798b07fd1a46a48c Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 09:23:28 -0400 Subject: [PATCH 34/44] test(validation): retain VectorBT Pro historical replay --- .../controlled_replay-2025.12.31.json | 1209 +++++++++++++++++ 1 file changed, 1209 insertions(+) create mode 100644 validation/vectorbt_pro/controlled_replay-2025.12.31.json diff --git a/validation/vectorbt_pro/controlled_replay-2025.12.31.json b/validation/vectorbt_pro/controlled_replay-2025.12.31.json new file mode 100644 index 00000000..7f3ef9ef --- /dev/null +++ b/validation/vectorbt_pro/controlled_replay-2025.12.31.json @@ -0,0 +1,1209 @@ +{ + "audit_trigger": { + "cause": "vectorbt collateral semantics missing from the ML4T comparison profile", + "external_fill_count": 390369, + "external_final_value": 716785.408089, + "ml4t_commit": "488c05d84e74156aba71c4f7ffac28df3881fea9", + "ml4t_fill_count": 418825, + "ml4t_final_value": 1162222.354417 + }, + "current": { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[vectorbt_strict]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 390369, + "actual_sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1", + "expected_count": 390369, + "expected_sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 188549, + "actual_sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242", + "expected_count": 188549, + "expected_sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 188549, + "canonical_actual": 188549.0, + "canonical_difference": 0.0, + "canonical_expected": 188549.0, + "expected": 188549, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": -283214.59191072755, + "canonical_actual": -283214.591911, + "canonical_difference": 0.0, + "canonical_expected": -283214.591911, + "expected": -283214.59191072907, + "name": "total_pnl", + "passed": true, + "raw_difference": 1.5133991837501526e-09 + }, + { + "actual": 716785.4080892724, + "canonical_actual": 716785.408089, + "canonical_difference": 0.0, + "canonical_expected": 716785.408089, + "expected": 716785.4080892709, + "name": "final_value", + "passed": true, + "raw_difference": 1.5133991837501526e-09 + }, + { + "actual": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "actual_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "expected": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "expected_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "VectorBT Pro", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "vectorbt_pro", + "input": { + "conversion": "none", + "effective_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "ad62d2bd30f9e3a25a9a205ae60df6b0309ca89a", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runtime_seconds": { + "framework": 67.83662832411937, + "ml4t": 122.52686988189816, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "licensed", + "actual_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "actual_version": "2026.6.27", + "commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "display_name": "VectorBT Pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2026.6.27" + } + }, + "framework_output_comparison": { + "current": { + "fills": { + "count": 390369, + "sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1" + }, + "final_value": 716785.408089, + "order_intents": { + "count": 427790, + "sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c" + }, + "terminal_state": { + "count": null, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "total_pnl": -283214.591911, + "trade_count": 188549.0, + "trades": { + "count": 188549, + "sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242" + } + }, + "historical": { + "fills": { + "count": 390369, + "sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1" + }, + "final_value": 716785.408089, + "order_intents": { + "count": 427790, + "sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c" + }, + "terminal_state": { + "count": null, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "total_pnl": -283214.591911, + "trade_count": 188549.0, + "trades": { + "count": 188549, + "sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242" + } + }, + "passed": true + }, + "generated_at": "2026-08-14T13:22:45.011801+00:00", + "historical": { + "capabilities": { + "closed_trades": "reconstructed from canonical native fills", + "fill_order": "session, asset, side, quantity, price", + "fills": "native", + "intents": "canonical strategy trace", + "terminal_state": "reconstructed from native fills and final marks" + }, + "comparison": { + "actual_error": null, + "actual_framework": "ml4t.backtest[vectorbt_strict]", + "canonical_money_quantum": "0.000001", + "canonical_record_quantum": "1E-8", + "checks": [ + { + "actual_count": 427790, + "actual_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "expected_count": 427790, + "expected_sha256": "b87edd7321d4be2307d8db968004ebd7e12edf47a3955003f42d0e974c8f369c", + "first_difference": null, + "name": "order_intents", + "passed": true + }, + { + "actual_count": 390369, + "actual_sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1", + "expected_count": 390369, + "expected_sha256": "83af0bc6cb77d931349349093a611cb645e1503c2c33aef9e626c293630cf0c1", + "first_difference": null, + "name": "fills", + "passed": true + }, + { + "actual_count": 188549, + "actual_sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242", + "expected_count": 188549, + "expected_sha256": "7055c62444c54eb5f5191358b187641ad7de019c3c182ce7f088d460ec59a242", + "first_difference": null, + "name": "trades", + "passed": true + }, + { + "actual": 188549, + "canonical_actual": 188549.0, + "canonical_difference": 0.0, + "canonical_expected": 188549.0, + "expected": 188549, + "name": "trade_count", + "passed": true, + "raw_difference": 0 + }, + { + "actual": -283214.59191072755, + "canonical_actual": -283214.591911, + "canonical_difference": 0.0, + "canonical_expected": -283214.591911, + "expected": -283214.59191072907, + "name": "total_pnl", + "passed": true, + "raw_difference": 1.5133991837501526e-09 + }, + { + "actual": 716785.4080892724, + "canonical_actual": 716785.408089, + "canonical_difference": 0.0, + "canonical_expected": 716785.408089, + "expected": 716785.4080892709, + "name": "final_value", + "passed": true, + "raw_difference": 1.5133991837501526e-09 + }, + { + "actual": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "actual_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "expected": { + "cash_from_fill_ledger": 786065.409828, + "holdings_from_fill_ledger": -69280.005398, + "positions": { + "ASSET_000": 0.0, + "ASSET_001": -100.0, + "ASSET_002": 0.0, + "ASSET_004": -0.0, + "ASSET_005": -100.0, + "ASSET_006": 10.74397, + "ASSET_007": 0.0, + "ASSET_008": -0.0, + "ASSET_009": -0.0, + "ASSET_010": 0.0, + "ASSET_011": -0.0, + "ASSET_014": 0.0, + "ASSET_015": -0.0, + "ASSET_017": 0.0, + "ASSET_019": 0.0, + "ASSET_020": -100.0, + "ASSET_021": -0.0, + "ASSET_023": -0.0, + "ASSET_024": -0.0, + "ASSET_025": -0.0, + "ASSET_026": 0.0, + "ASSET_027": 0.0, + "ASSET_028": 100.0, + "ASSET_029": 100.0, + "ASSET_030": -0.477202, + "ASSET_032": 0.0, + "ASSET_033": -0.0, + "ASSET_034": -0.0, + "ASSET_035": -0.0, + "ASSET_036": 0.0, + "ASSET_037": 0.0, + "ASSET_038": -0.0, + "ASSET_039": 0.0, + "ASSET_040": 0.0, + "ASSET_042": -0.0, + "ASSET_043": -0.0, + "ASSET_044": -0.0, + "ASSET_046": -0.0, + "ASSET_047": 0.0, + "ASSET_048": 0.0, + "ASSET_049": -0.0, + "ASSET_051": 0.0, + "ASSET_052": 0.0, + "ASSET_053": 0.0, + "ASSET_054": 0.0, + "ASSET_055": -0.0, + "ASSET_057": -0.0, + "ASSET_058": 0.0, + "ASSET_059": 0.0, + "ASSET_060": 0.0, + "ASSET_062": 0.0, + "ASSET_065": -0.0, + "ASSET_066": -100.0, + "ASSET_067": -0.0, + "ASSET_068": 0.0, + "ASSET_069": 0.0, + "ASSET_070": -100.0, + "ASSET_071": 100.0, + "ASSET_072": 0.0, + "ASSET_073": -0.0, + "ASSET_074": 0.0, + "ASSET_075": -80.307178, + "ASSET_076": -0.0, + "ASSET_077": -0.0, + "ASSET_078": 0.0, + "ASSET_079": -0.0, + "ASSET_081": 0.0, + "ASSET_082": 0.0, + "ASSET_084": -0.0, + "ASSET_085": 0.0, + "ASSET_086": -0.0, + "ASSET_087": -0.0, + "ASSET_089": 0.0, + "ASSET_090": 0.0, + "ASSET_091": 0.0, + "ASSET_092": -0.0, + "ASSET_093": 0.0, + "ASSET_094": 0.0, + "ASSET_096": -0.0, + "ASSET_097": 0.0, + "ASSET_098": 0.0, + "ASSET_099": -0.0, + "ASSET_101": -0.0, + "ASSET_102": 0.0, + "ASSET_103": -0.0, + "ASSET_104": 0.0, + "ASSET_105": 0.0, + "ASSET_106": -0.0, + "ASSET_107": 0.0, + "ASSET_108": -0.0, + "ASSET_109": 0.0, + "ASSET_110": -0.0, + "ASSET_111": 0.0, + "ASSET_112": 0.0, + "ASSET_113": -0.0, + "ASSET_114": -0.0, + "ASSET_115": 0.0, + "ASSET_116": -0.0, + "ASSET_117": -0.0, + "ASSET_118": 0.0, + "ASSET_119": -0.0, + "ASSET_120": 0.0, + "ASSET_121": -0.0, + "ASSET_122": 0.0, + "ASSET_123": -0.0, + "ASSET_124": 0.0, + "ASSET_125": -0.0, + "ASSET_126": -0.0, + "ASSET_127": 0.0, + "ASSET_130": 0.0, + "ASSET_131": -0.0, + "ASSET_132": 0.0, + "ASSET_134": 0.0, + "ASSET_135": -0.0, + "ASSET_136": 0.0, + "ASSET_137": 0.0, + "ASSET_138": -100.0, + "ASSET_139": 100.0, + "ASSET_140": -65.731089, + "ASSET_142": -0.0, + "ASSET_143": 0.0, + "ASSET_146": 0.0, + "ASSET_147": -0.0, + "ASSET_148": -0.0, + "ASSET_150": 0.0, + "ASSET_151": -0.0, + "ASSET_152": 0.0, + "ASSET_153": 11.479909, + "ASSET_154": -0.0, + "ASSET_155": -0.0, + "ASSET_156": 4.275139, + "ASSET_157": 0.0, + "ASSET_158": -0.0, + "ASSET_159": 9.819309, + "ASSET_160": -0.0, + "ASSET_161": 100.0, + "ASSET_162": 0.0, + "ASSET_163": 0.0, + "ASSET_164": 0.0, + "ASSET_165": 0.0, + "ASSET_166": -0.0, + "ASSET_168": 0.0, + "ASSET_169": -0.0, + "ASSET_170": -0.0, + "ASSET_171": 0.0, + "ASSET_173": 54.074946, + "ASSET_174": -0.0, + "ASSET_175": 0.0, + "ASSET_176": 0.0, + "ASSET_177": -0.0, + "ASSET_178": -0.0, + "ASSET_179": 0.0, + "ASSET_180": 0.0, + "ASSET_181": -0.0, + "ASSET_182": -0.0, + "ASSET_183": 0.0, + "ASSET_184": 100.0, + "ASSET_185": 0.0, + "ASSET_186": 0.0, + "ASSET_187": 0.0, + "ASSET_188": -0.0, + "ASSET_189": -0.0, + "ASSET_190": 0.0, + "ASSET_191": 0.0, + "ASSET_192": -0.0, + "ASSET_193": 0.0, + "ASSET_194": 0.0, + "ASSET_195": -100.0, + "ASSET_196": -0.0, + "ASSET_197": 0.0, + "ASSET_198": 0.0, + "ASSET_199": 0.0, + "ASSET_200": 0.0, + "ASSET_201": -23.687792, + "ASSET_202": 0.0, + "ASSET_203": -0.0, + "ASSET_205": 100.0, + "ASSET_206": -10.740523, + "ASSET_207": -0.0, + "ASSET_208": -0.0, + "ASSET_209": 0.0, + "ASSET_210": -34.019116, + "ASSET_212": 0.0, + "ASSET_213": -0.0, + "ASSET_214": 0.0, + "ASSET_218": 0.0, + "ASSET_219": 0.0, + "ASSET_220": 0.0, + "ASSET_221": -0.0, + "ASSET_222": -0.0, + "ASSET_223": -0.0, + "ASSET_224": 0.0, + "ASSET_225": -0.0, + "ASSET_226": 0.0, + "ASSET_227": -0.0, + "ASSET_228": -0.0, + "ASSET_229": -100.0, + "ASSET_230": -0.0, + "ASSET_231": -0.0, + "ASSET_232": -0.0, + "ASSET_233": 0.0, + "ASSET_235": 0.0, + "ASSET_236": 0.0, + "ASSET_237": 0.0, + "ASSET_239": -0.0, + "ASSET_240": 0.0, + "ASSET_241": -100.0, + "ASSET_243": 0.0, + "ASSET_244": -0.0, + "ASSET_246": -100.0, + "ASSET_247": -0.0, + "ASSET_249": -0.0 + }, + "reported_final_value": 716785.408089, + "sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c" + }, + "expected_sha256": "30e0db027af83e0fd83dcbc47fcd4f069d3a04b61139be45d4b2492bf9e8f88c", + "name": "terminal_state", + "passed": true + } + ], + "expected_error": null, + "expected_framework": "VectorBT Pro", + "passed": true, + "scenario": "controlled_250_assets_5040_sessions", + "schema_version": 1, + "timestamp_domain": "session_date" + }, + "framework": "vectorbt_pro", + "input": { + "conversion": "none", + "effective_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09", + "raw_sha256": "1d1ef383884bb9db1aad484f2dc9b6b4fb72ade02c41c8d9c8f44055e9580d09" + }, + "ml4t": { + "commit": "1b5131161f65fb42d0374cb182e04e42c654d114", + "dirty": false + }, + "python": { + "implementation": "cpython", + "version": "3.12.11" + }, + "runtime_seconds": { + "framework": 73.64496127492748, + "ml4t": 93.83954169694334, + "not_a_performance_claim": true + }, + "source_digests": { + "benchmark_suite": "dcafa42216566ff5e83ae0788d53d9789c2b7980956ea656c874684730b40523", + "framework_manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", + "large_scale_runner": "31620bd2b07466f733a6060676707e664881e7b6d4c3ea3f09d8f47354e86706", + "profiles": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505" + }, + "target": { + "access": "licensed", + "actual_commit": "1305a1e1974325db9382eaeacc6452e9b075ca71", + "actual_immutable_id": "git:1305a1e1974325db9382eaeacc6452e9b075ca71", + "actual_version": "2025.12.31", + "commit": "1305a1e1974325db9382eaeacc6452e9b075ca71", + "display_name": "VectorBT Pro", + "immutable_id": "git:1305a1e1974325db9382eaeacc6452e9b075ca71", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "source": "https://github.com/polakowo/vectorbt.pro", + "version": "2025.12.31" + } + }, + "release_gate_passed": true, + "schema_version": 1, + "workload": { + "data_points": 1260000, + "generator": "validation.benchmark_suite.generate_benchmark_data", + "recipe": { + "assets": 250, + "bars": 5040, + "bottom_n": 25, + "end_session": "2025-12-31", + "initial_cash": 1000000.0, + "long_target_shares": 100.0, + "name": "controlled_250_assets_5040_sessions", + "rebalance_frequency": 1, + "seed": 42, + "short_target_shares": -100.0, + "top_n": 25 + }, + "recipe_sha256": "5de81aacdda2ee7f08b2cc1549e64a974b19693967ac2fe1fdb0f1a6370d0ba5", + "redistributable": true + } +} From 2288b33af8ab46d750ea5c86e474ed0ffd1f3b44 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 09:27:28 -0400 Subject: [PATCH 35/44] test(validation): retain final scenario matrix --- validation/CORRECTNESS_RESULTS.json | 270 ++++++++++++++-------------- 1 file changed, 135 insertions(+), 135 deletions(-) diff --git a/validation/CORRECTNESS_RESULTS.json b/validation/CORRECTNESS_RESULTS.json index 0815ca77..e43aa180 100644 --- a/validation/CORRECTNESS_RESULTS.json +++ b/validation/CORRECTNESS_RESULTS.json @@ -63,7 +63,7 @@ "version": "3.1.1" } }, - "generated_at": "2026-08-14T11:53:11.693665+00:00", + "generated_at": "2026-08-14T13:27:15.212023+00:00", "records": [ { "comparison": { @@ -698,7 +698,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.9022904271259904, + "duration_seconds": 7.501915743108839, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -1368,7 +1368,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -2028,7 +2028,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.635350476950407, + "duration_seconds": 2.840228463988751, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -2698,7 +2698,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -2855,7 +2855,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.3570660441182554, + "duration_seconds": 2.3966822780203074, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3016,7 +3016,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -3173,7 +3173,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.3704132658895105, + "duration_seconds": 2.5000631511211395, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3334,7 +3334,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -4004,7 +4004,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.29961962508969, + "duration_seconds": 2.286233191145584, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -4678,7 +4678,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -5348,7 +5348,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.3205984868109226, + "duration_seconds": 2.3263101370539516, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -6022,7 +6022,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -6682,7 +6682,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.2875159040559083, + "duration_seconds": 2.317743237130344, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -7352,7 +7352,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -8012,7 +8012,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.3487607061397284, + "duration_seconds": 2.34586147707887, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -8682,7 +8682,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -8886,7 +8886,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.3469194669742137, + "duration_seconds": 2.326087640132755, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9100,7 +9100,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -9361,7 +9361,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 2.341246779076755, + "duration_seconds": 2.3380940959323198, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9632,7 +9632,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -10292,7 +10292,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.3152057118713856, + "duration_seconds": 2.3777460800483823, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -10962,7 +10962,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -11166,7 +11166,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.3157475090119988, + "duration_seconds": 2.3402557659428567, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11380,7 +11380,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -11527,7 +11527,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.3186875029932708, + "duration_seconds": 2.555546288844198, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11684,7 +11684,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -11831,7 +11831,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.3047236069105566, + "duration_seconds": 2.3249323240015656, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11988,7 +11988,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -12135,7 +12135,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.3098256271332502, + "duration_seconds": 2.6894931280985475, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -12292,7 +12292,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -12895,7 +12895,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.355546784121543, + "duration_seconds": 4.062867257045582, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -13508,7 +13508,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -47798,7 +47798,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.431329692946747, + "duration_seconds": 5.095168989850208, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -82098,7 +82098,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -82758,7 +82758,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 3.2446235159877688, + "duration_seconds": 6.141330576967448, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -83428,7 +83428,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -84088,7 +84088,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 3.259092109045014, + "duration_seconds": 3.2873797880019993, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -84758,7 +84758,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -84915,7 +84915,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 3.2769843318965286, + "duration_seconds": 3.2958020658697933, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85076,7 +85076,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -85233,7 +85233,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 3.2421666071750224, + "duration_seconds": 3.363994016079232, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85394,7 +85394,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -86064,7 +86064,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 3.239228632999584, + "duration_seconds": 3.432345259003341, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -86738,7 +86738,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -86768,7 +86768,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 4.461035132408142e-06, + "duration_seconds": 6.026122719049454e-06, "framework": "vectorbt_oss", "framework_result": null, "ml4t_result": null, @@ -87412,7 +87412,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 3.2395296881441027, + "duration_seconds": 4.475219384999946, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -88082,7 +88082,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -88742,7 +88742,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 3.2616704050451517, + "duration_seconds": 5.516745209228247, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89412,7 +89412,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -89616,7 +89616,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 3.2567403968423605, + "duration_seconds": 6.654169207904488, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89830,7 +89830,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -90091,7 +90091,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 3.253674411214888, + "duration_seconds": 4.621487139957026, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -90362,7 +90362,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -91022,7 +91022,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 3.2487299130298197, + "duration_seconds": 3.383543036878109, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -91692,7 +91692,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -91896,7 +91896,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 3.238377473084256, + "duration_seconds": 3.2667726040817797, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92110,7 +92110,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -92257,7 +92257,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 3.245127772912383, + "duration_seconds": 3.2741870610043406, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92414,7 +92414,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -92561,7 +92561,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 3.248155200853944, + "duration_seconds": 3.25988736608997, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92718,7 +92718,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -92865,7 +92865,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 3.238037460949272, + "duration_seconds": 3.309515391010791, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -93022,7 +93022,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -93625,7 +93625,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 3.3207258789334446, + "duration_seconds": 3.356127813225612, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -94238,7 +94238,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -128528,7 +128528,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.3899817462079227, + "duration_seconds": 3.4004109750967473, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -162828,7 +162828,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -163508,7 +163508,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 0.1908741348888725, + "duration_seconds": 0.23361050290986896, "framework": "backtrader", "framework_result": { "capabilities": { @@ -164200,7 +164200,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -164880,7 +164880,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 0.21065902104601264, + "duration_seconds": 0.19563005398958921, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165572,7 +165572,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -165730,7 +165730,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 0.1838237678166479, + "duration_seconds": 0.19277043011970818, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165892,7 +165892,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -166050,7 +166050,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 0.18742704903706908, + "duration_seconds": 0.194934471976012, "framework": "backtrader", "framework_result": { "capabilities": { @@ -166212,7 +166212,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -166902,7 +166902,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 0.1971568139269948, + "duration_seconds": 0.19258566293865442, "framework": "backtrader", "framework_result": { "capabilities": { @@ -167596,7 +167596,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -168286,7 +168286,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 0.19473743089474738, + "duration_seconds": 0.1937738349661231, "framework": "backtrader", "framework_result": { "capabilities": { @@ -168980,7 +168980,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -169660,7 +169660,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 0.1950578459072858, + "duration_seconds": 0.20525822788476944, "framework": "backtrader", "framework_result": { "capabilities": { @@ -170352,7 +170352,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -171032,7 +171032,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 0.20610000379383564, + "duration_seconds": 0.2269916799850762, "framework": "backtrader", "framework_result": { "capabilities": { @@ -171724,7 +171724,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -171930,7 +171930,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 0.1911431299522519, + "duration_seconds": 0.18469420308247209, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172146,7 +172146,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -172410,7 +172410,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 0.1928136378992349, + "duration_seconds": 0.20107836206443608, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172684,7 +172684,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -173354,7 +173354,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 0.20458918204531074, + "duration_seconds": 0.20415085786953568, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174034,7 +174034,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -174240,7 +174240,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 0.19500821898691356, + "duration_seconds": 0.18680671812035143, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174456,7 +174456,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -174604,7 +174604,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 0.19571567000821233, + "duration_seconds": 0.18279441795311868, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174762,7 +174762,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -174910,7 +174910,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 0.19319700193591416, + "duration_seconds": 0.18729107710532844, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175068,7 +175068,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -175216,7 +175216,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 0.18348273797892034, + "duration_seconds": 0.1859756710473448, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175374,7 +175374,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -175986,7 +175986,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 0.31646846095100045, + "duration_seconds": 0.30610309494659305, "framework": "backtrader", "framework_result": { "capabilities": { @@ -176608,7 +176608,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -212098,7 +212098,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 0.5051041629631072, + "duration_seconds": 0.5112261681351811, "framework": "backtrader", "framework_result": { "capabilities": { @@ -247600,7 +247600,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -247975,7 +247975,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.0575591980013996, + "duration_seconds": 2.262881443137303, "framework": "zipline", "framework_result": { "capabilities": { @@ -248364,7 +248364,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -248739,7 +248739,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.1073191261384636, + "duration_seconds": 2.0361781888641417, "framework": "zipline", "framework_result": { "capabilities": { @@ -249128,7 +249128,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -249285,7 +249285,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.1081440050620586, + "duration_seconds": 2.0433920649811625, "framework": "zipline", "framework_result": { "capabilities": { @@ -249450,7 +249450,7 @@ }, "input_digest": "c35f1e258ae4d0cd8eed9125a530bea473632a5bb3f4558583c0818700906e96", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -249607,7 +249607,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 1.9919104760047048, + "duration_seconds": 2.0167545839212835, "framework": "zipline", "framework_result": { "capabilities": { @@ -249772,7 +249772,7 @@ }, "input_digest": "9f43427f7ad70fc963aeec58cf8867b5646e88bd608ec489964f802a2c98a57d", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -250157,7 +250157,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.0461016981862485, + "duration_seconds": 2.077527143061161, "framework": "zipline", "framework_result": { "capabilities": { @@ -250550,7 +250550,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -250935,7 +250935,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.044092816999182, + "duration_seconds": 2.0570383958984166, "framework": "zipline", "framework_result": { "capabilities": { @@ -251328,7 +251328,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -251703,7 +251703,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.0859753768891096, + "duration_seconds": 2.1204512647818774, "framework": "zipline", "framework_result": { "capabilities": { @@ -252092,7 +252092,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -252467,7 +252467,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.0675931749865413, + "duration_seconds": 2.0525962188839912, "framework": "zipline", "framework_result": { "capabilities": { @@ -252856,7 +252856,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -253060,7 +253060,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.194376523140818, + "duration_seconds": 2.066368675092235, "framework": "zipline", "framework_result": { "capabilities": { @@ -253278,7 +253278,7 @@ }, "input_digest": "de6e2060eccdf8f068669911169eb7a3d28af0622a7a840f637acb82db930a7e", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -253308,7 +253308,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 4.029134288430214e-06, + "duration_seconds": 3.6580022424459457e-06, "framework": "zipline", "framework_result": null, "ml4t_result": null, @@ -253667,7 +253667,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.1975450550671667, + "duration_seconds": 2.0734922022093087, "framework": "zipline", "framework_result": { "capabilities": { @@ -254056,7 +254056,7 @@ }, "input_digest": "517a65764277b104abf7848a9875d5f09febfddffb82d8fd9318f724ff1aaa86", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -254260,7 +254260,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.162331265863031, + "duration_seconds": 2.1155651970766485, "framework": "zipline", "framework_result": { "capabilities": { @@ -254478,7 +254478,7 @@ }, "input_digest": "b211286d7dde78c905f246c3d56fb3c84b7f7de3c5f4a124c6b33680c37aa37d", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -254625,7 +254625,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.2323906030505896, + "duration_seconds": 2.061369979986921, "framework": "zipline", "framework_result": { "capabilities": { @@ -254786,7 +254786,7 @@ }, "input_digest": "79590cf03ef0f3e90985c032e8f555ecdf9add3fc21908924a49e7d706b5f041", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -254933,7 +254933,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.15216267388314, + "duration_seconds": 2.0505735501646996, "framework": "zipline", "framework_result": { "capabilities": { @@ -255094,7 +255094,7 @@ }, "input_digest": "939287c002cf7b640b21c5859335249e1db1400c7d94dd37f62a7f078ba31fad", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -255241,7 +255241,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.19005371700041, + "duration_seconds": 2.122095908038318, "framework": "zipline", "framework_result": { "capabilities": { @@ -255402,7 +255402,7 @@ }, "input_digest": "935e7e58b70b2ff5c2181016ceae955c9aa4986a9e1d7653b63043d3be82a524", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -255777,7 +255777,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.576013322919607, + "duration_seconds": 2.5553077140357345, "framework": "zipline", "framework_result": { "capabilities": { @@ -256166,7 +256166,7 @@ }, "input_digest": "fc4132bd3907c4367265ff478960830680f88ab7df440ad0ec317ff5136c039c", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { @@ -275465,7 +275465,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 2.777995100012049, + "duration_seconds": 3.027164909057319, "framework": "zipline", "framework_result": { "capabilities": { @@ -294778,7 +294778,7 @@ }, "input_digest": "d8119bff0157cd31258a444fec247040af62a78f46aff8b484ad1b9ef8915516", "ml4t": { - "commit": "ef0d052cc45e041a3bc503256412f892a99bb2cb", + "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", "dirty": false }, "python": { From dce83244c20430122b5f1b865dbcae1d0fb91d37 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 09:28:59 -0400 Subject: [PATCH 36/44] test(validation): refresh LEAN case-study evidence --- validation/lean/case_study_evidence.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/validation/lean/case_study_evidence.json b/validation/lean/case_study_evidence.json index 3e540feb..a67a2073 100644 --- a/validation/lean/case_study_evidence.json +++ b/validation/lean/case_study_evidence.json @@ -55,8 +55,8 @@ "validation/lean/workspace/chapter16_etfs/ml4t_daily_equity.csv": "20bc4a28ad04fdc458bd8f5031fbf976623caddd819da70f2e51ddb45dea6609", "validation/lean/workspace/chapter16_etfs/ml4t_order_events.csv.xz": "63535bec501d36e4f1eae501917e0000e636c03a19d637b05cdda1428bc80421" }, - "runtime_seconds": 12.904603295959532, - "summary_sha256": "12152c20f2efe5d81c33f096b191ffb65a1d5adb9049ae4a6add5556324ef45b" + "runtime_seconds": 13.234417018014938, + "summary_sha256": "cd22ab3fa5622aca202ea043b9093d77de5767b83642a6f5ed7308b22f02f25e" }, { "case": "chapter16_sp500_equity_option_analytics", @@ -114,8 +114,8 @@ "validation/lean/workspace/chapter16_sp500_equity_option_analytics/ml4t_daily_equity.csv": "83a98f50053b12dd4baa37484b0b268cb8ec83ebdf633ee2e6ee790db0bb73ad", "validation/lean/workspace/chapter16_sp500_equity_option_analytics/ml4t_order_events.csv": "334cd463affb3d23f074882fe1d8131861ec67ca5203fbdfb86cae4d8da64917" }, - "runtime_seconds": 8.380864966893569, - "summary_sha256": "4d70220734079022632eb155f18ac74456da89be2fb1c75b40a1263475006b00" + "runtime_seconds": 8.005312403896824, + "summary_sha256": "1feecc15e43549a949584b266bd55c7413ccea8fc812267c2ab09bf355d98f6f" }, { "case": "chapter16_us_equities_panel", @@ -203,8 +203,8 @@ "validation/lean/workspace/chapter16_us_equities_panel/ml4t_order_events.csv.part01.xz": "9aea6ff30791dc06cd9b917e6f0c639d1b6f17883012b9c5190d7be6a899d980", "validation/lean/workspace/chapter16_us_equities_panel/ml4t_order_events.csv.part02.xz": "915bef2036b7d49535eb81a458a1af891f8f15c249bb413831771ea52e982a26" }, - "runtime_seconds": 21.599902898073196, - "summary_sha256": "f928254197da712f32d74f3c9c4325ebe50da2da7cb21e8f38dad7adbb9a13cd" + "runtime_seconds": 22.688339818036184, + "summary_sha256": "1ed0ef6c680a8069789ccbf9e7862c8dee8baffe860512989dca5a7f63e98575" } ], "cli_observed": "lean 1.0.228", @@ -234,7 +234,7 @@ "producer_files": { "src/ml4t/backtest/_validation/case_study_lean.py": "62247f66db5ae118e7089ab4dfeca5a7251b1f3f4238b9aceeb55384df447cfd", "src/ml4t/backtest/_validation/lean_runner.py": "30efdb8018cc949c991dee856a7007d0dfdc635397a208f98a6dd094af20fce1", - "src/ml4t/backtest/profiles.py": "ee37ca6157367ceda4e4f3619c217d753c5d8a577a906ef7f63e515e3c78fa5c", + "src/ml4t/backtest/profiles.py": "5a8cd8b2568e7e9f524e96fef6bb00ade3310a6f4a71c0c4f7de2f95bbfdb505", "validation/run_lean_case_studies.py": "5bf91f8d98f8bfd9a88eb72071c392ff23ad4583184b28165e7511d9e0d1901e" }, "promoted": true, From c6a1066d64bf84101474ea12e383c281c73af555 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 09:29:18 -0400 Subject: [PATCH 37/44] docs(validation): publish final accepted parity claims --- README.md | 18 ++++++++++-------- docs/index.md | 18 ++++++++++-------- docs/user-guide/profiles.md | 18 ++++++++++-------- validation/METHODOLOGY.md | 18 ++++++++++-------- validation/README.md | 18 ++++++++++-------- 5 files changed, 50 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 301efd88..c79d29e4 100644 --- a/README.md +++ b/README.md @@ -282,22 +282,24 @@ claims supported by retained accepted evidence. -Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. +Scenario claims use the retained accepted matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization. Each record declares whether a surface is native, reconstructed, aggregate-only, input-only, or unavailable; the claim does not extend to unavailable order-lifecycle fields. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| | `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -Large-scale claims are published only when a retained workload has zero canonical gap. +The controlled scale workload contains 250 assets and 5,040 daily sessions (1,260,000 bars). Every row has zero canonical gap for target intents, native fills, closed trades reconstructed from those fills, and terminal state reconstructed from the fill ledger and final marks. -| Profile | Pinned framework | Compared | Trade gap | Terminal value | Evidence | -|---|---|---:|---:|---:|---| -| `vectorbt_strict` | VectorBT Pro 2025.12.31 (`1305a1e19743`) | 225,844 trades | 0 | 685179.007330 | [large-scale evidence](https://github.com/ml4t/backtest/blob/main/validation/vectorbt_pro/large_scale_parity.json) | - -No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN without a passing retained artifact. +| Profile | Current framework | Target intents | Native fills | Fill-derived closed trades | Terminal value | Evidence | +|---|---|---:|---:|---:|---:|---| +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 427,790 | 343,813 | 182,019 | -9,166,273.555954 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 427,790 | 427,696 | 226,434 | 10,504,095.900000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `lean` | [LEAN 18001](https://github.com/QuantConnect/Lean) | 427,790 | 361,297 | 191,297 | 184,538.130000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | See [validation/README.md](validation/README.md) for methodology and detailed results. diff --git a/docs/index.md b/docs/index.md index 88fb4bf1..e80b889d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -104,22 +104,24 @@ claims additionally require a retained workload with canonical record hashes and -Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. +Scenario claims use the retained accepted matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization. Each record declares whether a surface is native, reconstructed, aggregate-only, input-only, or unavailable; the claim does not extend to unavailable order-lifecycle fields. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| | `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -Large-scale claims are published only when a retained workload has zero canonical gap. +The controlled scale workload contains 250 assets and 5,040 daily sessions (1,260,000 bars). Every row has zero canonical gap for target intents, native fills, closed trades reconstructed from those fills, and terminal state reconstructed from the fill ledger and final marks. -| Profile | Pinned framework | Compared | Trade gap | Terminal value | Evidence | -|---|---|---:|---:|---:|---| -| `vectorbt_strict` | VectorBT Pro 2025.12.31 (`1305a1e19743`) | 225,844 trades | 0 | 685179.007330 | [large-scale evidence](https://github.com/ml4t/backtest/blob/main/validation/vectorbt_pro/large_scale_parity.json) | - -No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN without a passing retained artifact. +| Profile | Current framework | Target intents | Native fills | Fill-derived closed trades | Terminal value | Evidence | +|---|---|---:|---:|---:|---:|---| +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 427,790 | 343,813 | 182,019 | -9,166,273.555954 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 427,790 | 427,696 | 226,434 | 10,504,095.900000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `lean` | [LEAN 18001](https://github.com/QuantConnect/Lean) | 427,790 | 361,297 | 191,297 | 184,538.130000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | Release performance evidence runs deterministic single-asset, 250-asset daily, quote-aware, diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index b46ad927..33b599d2 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -157,22 +157,24 @@ at the declared $0.0001 quantum. See `validation/native/evidence/lean-18001.json -Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. +Scenario claims use the retained accepted matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization. Each record declares whether a surface is native, reconstructed, aggregate-only, input-only, or unavailable; the claim does not extend to unavailable order-lifecycle fields. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| | `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -Large-scale claims are published only when a retained workload has zero canonical gap. +The controlled scale workload contains 250 assets and 5,040 daily sessions (1,260,000 bars). Every row has zero canonical gap for target intents, native fills, closed trades reconstructed from those fills, and terminal state reconstructed from the fill ledger and final marks. -| Profile | Pinned framework | Compared | Trade gap | Terminal value | Evidence | -|---|---|---:|---:|---:|---| -| `vectorbt_strict` | VectorBT Pro 2025.12.31 (`1305a1e19743`) | 225,844 trades | 0 | 685179.007330 | [large-scale evidence](https://github.com/ml4t/backtest/blob/main/validation/vectorbt_pro/large_scale_parity.json) | - -No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN without a passing retained artifact. +| Profile | Current framework | Target intents | Native fills | Fill-derived closed trades | Terminal value | Evidence | +|---|---|---:|---:|---:|---:|---| +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 427,790 | 343,813 | 182,019 | -9,166,273.555954 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 427,790 | 427,696 | 226,434 | 10,504,095.900000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `lean` | [LEAN 18001](https://github.com/QuantConnect/Lean) | 427,790 | 361,297 | 191,297 | 184,538.130000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | ## Performance diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index 44f4c26e..e29f658d 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -329,22 +329,24 @@ The scenario suite separately compares each framework's native trade records. -Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. +Scenario claims use the retained accepted matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization. Each record declares whether a surface is native, reconstructed, aggregate-only, input-only, or unavailable; the claim does not extend to unavailable order-lifecycle fields. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| | `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -Large-scale claims are published only when a retained workload has zero canonical gap. +The controlled scale workload contains 250 assets and 5,040 daily sessions (1,260,000 bars). Every row has zero canonical gap for target intents, native fills, closed trades reconstructed from those fills, and terminal state reconstructed from the fill ledger and final marks. -| Profile | Pinned framework | Compared | Trade gap | Terminal value | Evidence | -|---|---|---:|---:|---:|---| -| `vectorbt_strict` | VectorBT Pro 2025.12.31 (`1305a1e19743`) | 225,844 trades | 0 | 685179.007330 | [large-scale evidence](https://github.com/ml4t/backtest/blob/main/validation/vectorbt_pro/large_scale_parity.json) | - -No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN without a passing retained artifact. +| Profile | Current framework | Target intents | Native fills | Fill-derived closed trades | Terminal value | Evidence | +|---|---|---:|---:|---:|---:|---| +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 427,790 | 343,813 | 182,019 | -9,166,273.555954 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 427,790 | 427,696 | 226,434 | 10,504,095.900000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `lean` | [LEAN 18001](https://github.com/QuantConnect/Lean) | 427,790 | 361,297 | 191,297 | 184,538.130000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | --- diff --git a/validation/README.md b/validation/README.md index a66d8aeb..2aec745f 100644 --- a/validation/README.md +++ b/validation/README.md @@ -21,22 +21,24 @@ environment cannot reproduce the current target set. -Scenario claims use the retained release-candidate matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization for every retained surface the framework exposes. +Scenario claims use the retained accepted matrix. "Exact" means terminal values, ordered closed trades, and ordered fills match after 1e-8 quantization. Each record declares whether a surface is native, reconstructed, aggregate-only, input-only, or unavailable; the claim does not extend to unavailable order-lifecycle fields. | Profile | Pinned framework | Required scenarios | Evidence | |---|---|---:|---| | `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -| `vectorbt` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 17/17 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | | `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 16/16 exact | [scenario evidence](https://github.com/ml4t/backtest/blob/main/validation/CORRECTNESS_RESULTS.json) | -Large-scale claims are published only when a retained workload has zero canonical gap. +The controlled scale workload contains 250 assets and 5,040 daily sessions (1,260,000 bars). Every row has zero canonical gap for target intents, native fills, closed trades reconstructed from those fills, and terminal state reconstructed from the fill ledger and final marks. -| Profile | Pinned framework | Compared | Trade gap | Terminal value | Evidence | -|---|---|---:|---:|---:|---| -| `vectorbt_strict` | VectorBT Pro 2025.12.31 (`1305a1e19743`) | 225,844 trades | 0 | 685179.007330 | [large-scale evidence](https://github.com/ml4t/backtest/blob/main/validation/vectorbt_pro/large_scale_parity.json) | - -No large-scale claim is published for Backtrader, Zipline, VectorBT OSS, or LEAN without a passing retained artifact. +| Profile | Current framework | Target intents | Native fills | Fill-derived closed trades | Terminal value | Evidence | +|---|---|---:|---:|---:|---:|---| +| `vectorbt_strict` | [VectorBT Pro 2026.6.27](https://github.com/polakowo/vectorbt.pro) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `vectorbt_oss_strict` | [VectorBT OSS 1.1.0](https://pypi.org/project/vectorbt/1.1.0/) | 427,790 | 390,369 | 188,549 | 716,785.408089 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `backtrader_strict` | [Backtrader 1.9.78.123](https://pypi.org/project/backtrader/1.9.78.123/) | 427,790 | 343,813 | 182,019 | -9,166,273.555954 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `zipline_strict` | [Zipline Reloaded 3.1.1](https://pypi.org/project/zipline-reloaded/3.1.1/) | 427,790 | 427,696 | 226,434 | 10,504,095.900000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | +| `lean` | [LEAN 18001](https://github.com/QuantConnect/Lean) | 427,790 | 361,297 | 191,297 | 184,538.130000 | [scale evidence](https://github.com/ml4t/backtest/blob/main/validation/LARGE_SCALE_RESULTS.json) | ## How to Run From 98483c88c37247cbc17525fb5e803f6fca1ee4fd Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 15:51:23 -0400 Subject: [PATCH 38/44] fix(validation): hash tracked engine sources --- tests/contracts/test_correctness_evidence.py | 23 +++++++++++++++++- validation/common/provenance.py | 25 +++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/tests/contracts/test_correctness_evidence.py b/tests/contracts/test_correctness_evidence.py index 5f857430..4b100656 100644 --- a/tests/contracts/test_correctness_evidence.py +++ b/tests/contracts/test_correctness_evidence.py @@ -4,6 +4,7 @@ import copy import json +import subprocess import sys from pathlib import Path from typing import Any, cast @@ -23,7 +24,12 @@ promote_candidate, ) from common.framework_registry import load_framework_manifest # noqa: E402 -from common.provenance import generate_inputs, input_digest, static_digests # noqa: E402 +from common.provenance import ( # noqa: E402 + _tree_digest, + generate_inputs, + input_digest, + static_digests, +) from common.types import FrameworkResult, ValidationRecord, ValidationStatus # noqa: E402 from scenarios.definitions import SCENARIOS # noqa: E402 @@ -206,6 +212,21 @@ def test_source_commit_change_without_behavior_change_is_not_stale() -> None: assert correctness_report_failures(report) == [] +def test_tree_digest_excludes_untracked_generated_python(tmp_path: Path) -> None: + source = tmp_path / "src" / "package" + source.mkdir(parents=True) + (source / "engine.py").write_text("VALUE = 1\n", encoding="utf-8") + subprocess.run(["git", "init", "-q"], cwd=tmp_path, check=True) + subprocess.run(["git", "add", "src/package/engine.py"], cwd=tmp_path, check=True) + + _tree_digest.cache_clear() + expected = _tree_digest(source) + (source / "_version.py").write_text("VERSION = 'generated'\n", encoding="utf-8") + _tree_digest.cache_clear() + + assert _tree_digest(source) == expected + + def test_dirty_source_is_not_acceptable() -> None: report = _full_report() _first_required_record(report)["provenance"]["ml4t"]["dirty"] = True diff --git a/validation/common/provenance.py b/validation/common/provenance.py index 82fc12a4..374f93cf 100644 --- a/validation/common/provenance.py +++ b/validation/common/provenance.py @@ -40,8 +40,31 @@ def _json_digest(value: object) -> str: @cache def _tree_digest(root: Path) -> str: + try: + git_root = Path( + subprocess.run( + ["git", "-C", str(root), "rev-parse", "--show-toplevel"], + check=True, + capture_output=True, + text=True, + ).stdout.strip() + ) + relative_root = root.resolve().relative_to(git_root.resolve()) + tracked = subprocess.run( + ["git", "-C", str(git_root), "ls-files", "-z", "--", relative_root.as_posix()], + check=True, + capture_output=True, + ).stdout + paths = sorted( + git_root / value.decode("utf-8") + for value in tracked.split(b"\0") + if value and value.endswith(b".py") + ) + except (OSError, subprocess.CalledProcessError, ValueError): + paths = sorted(root.rglob("*.py")) + digest = hashlib.sha256() - for path in sorted(root.rglob("*.py")): + for path in paths: digest.update(path.relative_to(root).as_posix().encode("utf-8")) digest.update(b"\0") digest.update(path.read_bytes()) From ed4a5835ad436d5d90c3336ce6b1df6d27871219 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 15:54:50 -0400 Subject: [PATCH 39/44] test(validation): refresh portable scenario evidence --- validation/CORRECTNESS_RESULTS.json | 402 ++++++++++++++-------------- 1 file changed, 201 insertions(+), 201 deletions(-) diff --git a/validation/CORRECTNESS_RESULTS.json b/validation/CORRECTNESS_RESULTS.json index e43aa180..d9042112 100644 --- a/validation/CORRECTNESS_RESULTS.json +++ b/validation/CORRECTNESS_RESULTS.json @@ -63,7 +63,7 @@ "version": "3.1.1" } }, - "generated_at": "2026-08-14T13:27:15.212023+00:00", + "generated_at": "2026-08-14T19:54:35.713047+00:00", "records": [ { "comparison": { @@ -698,7 +698,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 7.501915743108839, + "duration_seconds": 2.5833668319974095, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -1355,7 +1355,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -1368,7 +1368,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -2028,7 +2028,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.840228463988751, + "duration_seconds": 2.5786483350675553, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -2685,7 +2685,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -2698,7 +2698,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -2855,7 +2855,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.3966822780203074, + "duration_seconds": 2.637149689020589, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3003,7 +3003,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", @@ -3016,7 +3016,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -3173,7 +3173,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.5000631511211395, + "duration_seconds": 2.465967547148466, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -3321,7 +3321,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", @@ -3334,7 +3334,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -4004,7 +4004,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.286233191145584, + "duration_seconds": 2.628178286133334, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -4665,7 +4665,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -4678,7 +4678,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -5348,7 +5348,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.3263101370539516, + "duration_seconds": 2.563997716875747, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -6009,7 +6009,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -6022,7 +6022,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -6682,7 +6682,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.317743237130344, + "duration_seconds": 2.4722915049642324, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -7339,7 +7339,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -7352,7 +7352,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -8012,7 +8012,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.34586147707887, + "duration_seconds": 2.507237384095788, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -8669,7 +8669,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -8682,7 +8682,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -8886,7 +8886,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.326087640132755, + "duration_seconds": 2.585157000925392, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9087,7 +9087,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", @@ -9100,7 +9100,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -9361,7 +9361,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 2.3380940959323198, + "duration_seconds": 2.4881120228674263, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -9619,7 +9619,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "592c4ca3a782275c61f3fc2123e30c9055c3dcaec49a4b0202feafbc9821f1f3", @@ -9632,7 +9632,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -10292,7 +10292,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.3777460800483823, + "duration_seconds": 2.615277051925659, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -10949,7 +10949,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -10962,7 +10962,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -11166,7 +11166,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.3402557659428567, + "duration_seconds": 2.5031831508968025, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11367,7 +11367,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "ed38e0bc2ef5eae08a4d0d71c4d646cde827805bcfb346f2c85d92295040a29f", @@ -11380,7 +11380,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -11527,7 +11527,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.555546288844198, + "duration_seconds": 2.4922204778995365, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11671,7 +11671,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", @@ -11684,7 +11684,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -11831,7 +11831,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.3249323240015656, + "duration_seconds": 2.4836581491399556, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -11975,7 +11975,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", @@ -11988,7 +11988,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -12135,7 +12135,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.6894931280985475, + "duration_seconds": 2.481939998921007, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -12279,7 +12279,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", @@ -12292,7 +12292,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -12895,7 +12895,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 4.062867257045582, + "duration_seconds": 2.5283554480411112, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -13495,7 +13495,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "71cd4215e29c1c85892b66ea019173b0f05f6dbf1b5c03eb2b9a436c4259cae3", @@ -13508,7 +13508,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -47798,7 +47798,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 5.095168989850208, + "duration_seconds": 2.591943276114762, "framework": "vectorbt_pro", "framework_result": { "capabilities": { @@ -82085,7 +82085,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -82098,7 +82098,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -82758,7 +82758,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 6.141330576967448, + "duration_seconds": 3.596386168152094, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -83415,7 +83415,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -83428,7 +83428,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -84088,7 +84088,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 3.2873797880019993, + "duration_seconds": 3.5662843890022486, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -84745,7 +84745,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -84758,7 +84758,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -84915,7 +84915,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 3.2958020658697933, + "duration_seconds": 3.6028757761232555, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85063,7 +85063,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", @@ -85076,7 +85076,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -85233,7 +85233,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 3.363994016079232, + "duration_seconds": 3.461432676995173, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -85381,7 +85381,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "9de5c47a372a7ab97c36bfaa81bb522deb6a4ea2c77f8ecd01945d92b7dc61c5", @@ -85394,7 +85394,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -86064,7 +86064,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 3.432345259003341, + "duration_seconds": 3.4984702998772264, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -86725,7 +86725,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -86738,7 +86738,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -86768,7 +86768,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 6.026122719049454e-06, + "duration_seconds": 4.0549784898757935e-06, "framework": "vectorbt_oss", "framework_result": null, "ml4t_result": null, @@ -87412,7 +87412,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 4.475219384999946, + "duration_seconds": 3.4741068419534713, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -88069,7 +88069,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -88082,7 +88082,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -88742,7 +88742,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 5.516745209228247, + "duration_seconds": 3.574992704903707, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89399,7 +89399,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -89412,7 +89412,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -89616,7 +89616,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 6.654169207904488, + "duration_seconds": 3.4778857689816505, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -89817,7 +89817,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", @@ -89830,7 +89830,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -90091,7 +90091,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 4.621487139957026, + "duration_seconds": 3.447144745849073, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -90349,7 +90349,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "592c4ca3a782275c61f3fc2123e30c9055c3dcaec49a4b0202feafbc9821f1f3", @@ -90362,7 +90362,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -91022,7 +91022,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 3.383543036878109, + "duration_seconds": 3.5083857520949095, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -91679,7 +91679,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -91692,7 +91692,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -91896,7 +91896,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 3.2667726040817797, + "duration_seconds": 3.4584382749162614, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92097,7 +92097,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "932435fd79f122599609991a33af8e129883b9fdcb0262599f224890feee0f0c", @@ -92110,7 +92110,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -92257,7 +92257,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 3.2741870610043406, + "duration_seconds": 3.456861233804375, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92401,7 +92401,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", @@ -92414,7 +92414,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -92561,7 +92561,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 3.25988736608997, + "duration_seconds": 3.52237769914791, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -92705,7 +92705,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", @@ -92718,7 +92718,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -92865,7 +92865,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 3.309515391010791, + "duration_seconds": 3.5497171320021152, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -93009,7 +93009,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", @@ -93022,7 +93022,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -93625,7 +93625,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 3.356127813225612, + "duration_seconds": 4.819242513040081, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -94225,7 +94225,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "2239ef5dfd2ca79f8cf4b7d6b6f991dbfdc0b7393efab316c6eba29edbdb6829", @@ -94238,7 +94238,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -128528,7 +128528,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.4004109750967473, + "duration_seconds": 3.6247302379924804, "framework": "vectorbt_oss", "framework_result": { "capabilities": { @@ -162815,7 +162815,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -162828,7 +162828,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -163508,7 +163508,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 0.23361050290986896, + "duration_seconds": 0.2181082998868078, "framework": "backtrader", "framework_result": { "capabilities": { @@ -164187,7 +164187,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -164200,7 +164200,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -164880,7 +164880,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 0.19563005398958921, + "duration_seconds": 0.22164393798448145, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165559,7 +165559,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -165572,7 +165572,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -165730,7 +165730,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 0.19277043011970818, + "duration_seconds": 0.19068946689367294, "framework": "backtrader", "framework_result": { "capabilities": { @@ -165879,7 +165879,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -165892,7 +165892,7 @@ }, "input_digest": "c450f8db901151f953d81b05845db8cad686ca7c619cfe7e881485a2228972a7", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -166050,7 +166050,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 0.194934471976012, + "duration_seconds": 0.19105158699676394, "framework": "backtrader", "framework_result": { "capabilities": { @@ -166199,7 +166199,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -166212,7 +166212,7 @@ }, "input_digest": "d62c3c2d015f1ead6bff9d1d3ed7e92b396ddf9e4f7c808cf3ebe3eb7ae7491b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -166902,7 +166902,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 0.19258566293865442, + "duration_seconds": 0.24581945384852588, "framework": "backtrader", "framework_result": { "capabilities": { @@ -167583,7 +167583,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -167596,7 +167596,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -168286,7 +168286,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 0.1937738349661231, + "duration_seconds": 0.21445027412846684, "framework": "backtrader", "framework_result": { "capabilities": { @@ -168967,7 +168967,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -168980,7 +168980,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -169660,7 +169660,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 0.20525822788476944, + "duration_seconds": 0.23931146087124944, "framework": "backtrader", "framework_result": { "capabilities": { @@ -170339,7 +170339,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -170352,7 +170352,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -171032,7 +171032,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 0.2269916799850762, + "duration_seconds": 0.2054341621696949, "framework": "backtrader", "framework_result": { "capabilities": { @@ -171711,7 +171711,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -171724,7 +171724,7 @@ }, "input_digest": "fa1946cbf9ef0bb21ff45ffeb8a251d50b24f15e8240155e87d22ad9a84cccbd", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -171930,7 +171930,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 0.18469420308247209, + "duration_seconds": 0.19329984905198216, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172133,7 +172133,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -172146,7 +172146,7 @@ }, "input_digest": "0ab00a6cfc6f76a1d74f0617186a4d5c95d27cb4fd62bd5c535b3b191965369d", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -172410,7 +172410,7 @@ "scenario_id": "10" }, "detail": null, - "duration_seconds": 0.20107836206443608, + "duration_seconds": 0.19371586805209517, "framework": "backtrader", "framework_result": { "capabilities": { @@ -172671,7 +172671,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -172684,7 +172684,7 @@ }, "input_digest": "c46f13757f77a357bcf860856d78551fd3d0b5a707fc379bb9be724a04e1d219", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -173354,7 +173354,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 0.20415085786953568, + "duration_seconds": 0.19985837815329432, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174021,7 +174021,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -174034,7 +174034,7 @@ }, "input_digest": "e0efe74473f286a7ddeb3a4e39d9eb7a2443b69474480e9e4fcf97459672b93b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -174240,7 +174240,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 0.18680671812035143, + "duration_seconds": 0.1941849859431386, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174443,7 +174443,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4dc2ca9d958a93592d8d31cfc054fccac9f460314cad187d221981191d6a9898", @@ -174456,7 +174456,7 @@ }, "input_digest": "3057fb1181d8b6bde3b0f0c71860dca5701293bcd956920c618e911bce7d0c67", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -174604,7 +174604,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 0.18279441795311868, + "duration_seconds": 0.18681644089519978, "framework": "backtrader", "framework_result": { "capabilities": { @@ -174749,7 +174749,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -174762,7 +174762,7 @@ }, "input_digest": "6868775136fad190c5e2fffe0cb05f259b244161572731b86777972b78ea5fb5", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -174910,7 +174910,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 0.18729107710532844, + "duration_seconds": 0.21248964685946703, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175055,7 +175055,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -175068,7 +175068,7 @@ }, "input_digest": "515cb2ead81157a5d033173889d2a47af873b49bb750c0fedf91036506520aa2", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -175216,7 +175216,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 0.1859756710473448, + "duration_seconds": 0.30493300617672503, "framework": "backtrader", "framework_result": { "capabilities": { @@ -175361,7 +175361,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -175374,7 +175374,7 @@ }, "input_digest": "0e9ac5d663e87ef8d9d42db148ea6b689902b2533884263ccde90d5ba20fc135", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -175986,7 +175986,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 0.30610309494659305, + "duration_seconds": 0.3116491751279682, "framework": "backtrader", "framework_result": { "capabilities": { @@ -176595,7 +176595,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "6f82ba4bceb1436137d9a4d844fa16973426eacd177ec088ab0f1e40ec12288d", @@ -176608,7 +176608,7 @@ }, "input_digest": "8b4829a04d740fe6087782188f15eb27044961db12acbcb5f5fdd227e83fde41", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -212098,7 +212098,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 0.5112261681351811, + "duration_seconds": 0.5533595648594201, "framework": "backtrader", "framework_result": { "capabilities": { @@ -247587,7 +247587,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -247600,7 +247600,7 @@ }, "input_digest": "dd491bc06ca31652f04962d8927c33330abf1b3bedaf108f9d9b222834fb9c4b", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -247975,7 +247975,7 @@ "scenario_id": "01" }, "detail": null, - "duration_seconds": 2.262881443137303, + "duration_seconds": 2.7036192659288645, "framework": "zipline", "framework_result": { "capabilities": { @@ -248351,7 +248351,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -248364,7 +248364,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -248739,7 +248739,7 @@ "scenario_id": "02" }, "detail": null, - "duration_seconds": 2.0361781888641417, + "duration_seconds": 2.135877769207582, "framework": "zipline", "framework_result": { "capabilities": { @@ -249115,7 +249115,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -249128,7 +249128,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -249285,7 +249285,7 @@ "scenario_id": "03" }, "detail": null, - "duration_seconds": 2.0433920649811625, + "duration_seconds": 3.6171961941290647, "framework": "zipline", "framework_result": { "capabilities": { @@ -249437,7 +249437,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "28b180f9c05b5422cd2c453999768d0d8b12915b1cf2946fa4b7d912f7ced322", @@ -249450,7 +249450,7 @@ }, "input_digest": "c35f1e258ae4d0cd8eed9125a530bea473632a5bb3f4558583c0818700906e96", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -249607,7 +249607,7 @@ "scenario_id": "04" }, "detail": null, - "duration_seconds": 2.0167545839212835, + "duration_seconds": 2.403656671056524, "framework": "zipline", "framework_result": { "capabilities": { @@ -249759,7 +249759,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "28b180f9c05b5422cd2c453999768d0d8b12915b1cf2946fa4b7d912f7ced322", @@ -249772,7 +249772,7 @@ }, "input_digest": "9f43427f7ad70fc963aeec58cf8867b5646e88bd608ec489964f802a2c98a57d", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -250157,7 +250157,7 @@ "scenario_id": "05" }, "detail": null, - "duration_seconds": 2.077527143061161, + "duration_seconds": 2.3504011258482933, "framework": "zipline", "framework_result": { "capabilities": { @@ -250537,7 +250537,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -250550,7 +250550,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -250935,7 +250935,7 @@ "scenario_id": "06" }, "detail": null, - "duration_seconds": 2.0570383958984166, + "duration_seconds": 2.277756383875385, "framework": "zipline", "framework_result": { "capabilities": { @@ -251315,7 +251315,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -251328,7 +251328,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -251703,7 +251703,7 @@ "scenario_id": "07" }, "detail": null, - "duration_seconds": 2.1204512647818774, + "duration_seconds": 2.1697013170924038, "framework": "zipline", "framework_result": { "capabilities": { @@ -252079,7 +252079,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -252092,7 +252092,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -252467,7 +252467,7 @@ "scenario_id": "08" }, "detail": null, - "duration_seconds": 2.0525962188839912, + "duration_seconds": 2.1856515100225806, "framework": "zipline", "framework_result": { "capabilities": { @@ -252843,7 +252843,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -252856,7 +252856,7 @@ }, "input_digest": "d4db92ee3483537d94893b614a21dcffdd4896daceb1d31cddd8e6343384e690", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -253060,7 +253060,7 @@ "scenario_id": "09" }, "detail": null, - "duration_seconds": 2.066368675092235, + "duration_seconds": 2.099665637128055, "framework": "zipline", "framework_result": { "capabilities": { @@ -253265,7 +253265,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", @@ -253278,7 +253278,7 @@ }, "input_digest": "de6e2060eccdf8f068669911169eb7a3d28af0622a7a840f637acb82db930a7e", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -253308,7 +253308,7 @@ { "comparison": null, "detail": "Scenario explicitly excludes this framework", - "duration_seconds": 3.6580022424459457e-06, + "duration_seconds": 3.6640558391809464e-06, "framework": "zipline", "framework_result": null, "ml4t_result": null, @@ -253667,7 +253667,7 @@ "scenario_id": "11" }, "detail": null, - "duration_seconds": 2.0734922022093087, + "duration_seconds": 2.155129101825878, "framework": "zipline", "framework_result": { "capabilities": { @@ -254043,7 +254043,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "be4345288348f6a276f38cb4a364261003c925cddc5d9423b667fb82c34cff1b", @@ -254056,7 +254056,7 @@ }, "input_digest": "517a65764277b104abf7848a9875d5f09febfddffb82d8fd9318f724ff1aaa86", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -254260,7 +254260,7 @@ "scenario_id": "12" }, "detail": null, - "duration_seconds": 2.1155651970766485, + "duration_seconds": 2.3570257059764117, "framework": "zipline", "framework_result": { "capabilities": { @@ -254465,7 +254465,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "1959f1b057e8b49dd44d9c7d7252eb2d9b40d1d7e035752ca4794fd596d502fd", @@ -254478,7 +254478,7 @@ }, "input_digest": "b211286d7dde78c905f246c3d56fb3c84b7f7de3c5f4a124c6b33680c37aa37d", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -254625,7 +254625,7 @@ "scenario_id": "13" }, "detail": null, - "duration_seconds": 2.061369979986921, + "duration_seconds": 2.314784521004185, "framework": "zipline", "framework_result": { "capabilities": { @@ -254773,7 +254773,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", @@ -254786,7 +254786,7 @@ }, "input_digest": "79590cf03ef0f3e90985c032e8f555ecdf9add3fc21908924a49e7d706b5f041", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -254933,7 +254933,7 @@ "scenario_id": "14" }, "detail": null, - "duration_seconds": 2.0505735501646996, + "duration_seconds": 2.0954640838317573, "framework": "zipline", "framework_result": { "capabilities": { @@ -255081,7 +255081,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", @@ -255094,7 +255094,7 @@ }, "input_digest": "939287c002cf7b640b21c5859335249e1db1400c7d94dd37f62a7f078ba31fad", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -255241,7 +255241,7 @@ "scenario_id": "15" }, "detail": null, - "duration_seconds": 2.122095908038318, + "duration_seconds": 2.0427074190229177, "framework": "zipline", "framework_result": { "capabilities": { @@ -255389,7 +255389,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", @@ -255402,7 +255402,7 @@ }, "input_digest": "935e7e58b70b2ff5c2181016ceae955c9aa4986a9e1d7653b63043d3be82a524", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -255777,7 +255777,7 @@ "scenario_id": "16" }, "detail": null, - "duration_seconds": 2.5553077140357345, + "duration_seconds": 2.5611570989713073, "framework": "zipline", "framework_result": { "capabilities": { @@ -256153,7 +256153,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "d7768c1dbc7e300243ff0eac676d628b4af4e347896a67b1623a5f0aa6c053a3", @@ -256166,7 +256166,7 @@ }, "input_digest": "fc4132bd3907c4367265ff478960830680f88ab7df440ad0ec317ff5136c039c", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { @@ -275465,7 +275465,7 @@ "scenario_id": "17" }, "detail": null, - "duration_seconds": 3.027164909057319, + "duration_seconds": 2.8268574259709567, "framework": "zipline", "framework_result": { "capabilities": { @@ -294765,7 +294765,7 @@ "canonical_records": "fa1d9846bdc895cf62e6435097a8953d131ac16f6ae910d41ba81a5090c43707", "capabilities": "dd0f50965982db8aae711f850740fc1d26c5f09d8b7c3d24221b347a7e14c8aa", "comparator": "de6683dd96cab7fc9ce005f4651b7de359b8ddfcd6402b543960133ca35b0f5e", - "engine": "95da708bd05229cf763d2a74d9e33666471504ae195ac4a9a7524583f0aa695b", + "engine": "9a423b1f58d81bded0545cf0d4572d8c0c2a41129d41a33c59ea7649f6c051b1", "manifest": "38e64faa733ac8412b0a1cabec5357be229852f19b432f2f215a7bf20f3a2780", "ml4t_runner": "6e9753811241863f59fc6607f315237aa1caec673372ef3b3a85fc959cf426e0", "profile": "4c1b7206fe55cebbe9f41acb88a30dac343e4ce973e92ad60c236a27ef021548", @@ -294778,7 +294778,7 @@ }, "input_digest": "d8119bff0157cd31258a444fec247040af62a78f46aff8b484ad1b9ef8915516", "ml4t": { - "commit": "127893dc58ed2857706a3802798b07fd1a46a48c", + "commit": "98483c88c37247cbc17525fb5e803f6fca1ee4fd", "dirty": false }, "python": { From 4d1ae7b4473c9dd58bcfc8fcf88d9878d72dec25 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 16:06:41 -0400 Subject: [PATCH 40/44] feat(validation): inventory real strategy corpus --- tests/contracts/test_real_strategy_corpus.py | 136 ++++++++++ validation/real_strategy_cases.toml | 28 ++ validation/real_strategy_corpus.py | 272 +++++++++++++++++++ validation/release_checks.txt | 1 + 4 files changed, 437 insertions(+) create mode 100644 tests/contracts/test_real_strategy_corpus.py create mode 100644 validation/real_strategy_cases.toml create mode 100644 validation/real_strategy_corpus.py diff --git a/tests/contracts/test_real_strategy_corpus.py b/tests/contracts/test_real_strategy_corpus.py new file mode 100644 index 00000000..571eeb5f --- /dev/null +++ b/tests/contracts/test_real_strategy_corpus.py @@ -0,0 +1,136 @@ +"""Contracts for the bounded current real-strategy inventory.""" + +from __future__ import annotations + +import importlib.util +import json +import sys +from pathlib import Path + +import polars as pl +import pytest + + +def _load_module(): + path = Path(__file__).parents[2] / "validation" / "real_strategy_corpus.py" + spec = importlib.util.spec_from_file_location("ml4t_real_strategy_corpus", path) + assert spec is not None + assert spec.loader is not None + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +def _artifact_tree(tmp_path: Path, case_id: str = "etfs") -> tuple[Path, dict[str, str]]: + artifact_root = tmp_path / "artifacts" + run_log = artifact_root / "case_studies" / case_id / "run_log" + backtest_hash = "a" * 12 + prediction_hash = "b" * 12 + backtest = run_log / "backtest" / backtest_hash + prediction = run_log / "predictions" / prediction_hash + backtest.mkdir(parents=True) + prediction.mkdir(parents=True) + (run_log / "registry.db").write_bytes(b"registry") + pl.DataFrame({"timestamp": ["2024-01-01"], "symbol": ["SPY"], "y_score": [0.1]}).write_parquet( + prediction / "predictions.parquet" + ) + spec = { + "backtest_config": { + "metadata": {"prediction_hash": prediction_hash}, + "execution": {"execution_mode": "next_bar"}, + "commission": {"model": "none"}, + "slippage": {"model": "none"}, + "position_sizing": {"share_type": "integer"}, + }, + "strategy": { + "signal": {"method": "equal_weight_top_k", "top_k": 1}, + "rebalance": {"mode": "engine", "cadence": "daily_close"}, + }, + } + (backtest / "spec.json").write_text(json.dumps(spec), encoding="utf-8") + for name in ( + "daily_returns.parquet", + "equity.parquet", + "fills.parquet", + "portfolio_state.parquet", + "trades.parquet", + "weights.parquet", + ): + pl.DataFrame({"value": [1.0]}).write_parquet(backtest / name) + return artifact_root, { + "val_backtest_hash": backtest_hash, + "val_prediction_hash": prediction_hash, + "val_stage": "signal", + "label": "fwd_ret_1d", + } + + +def test_case_contract_contains_selected_real_case_studies() -> None: + module = _load_module() + + cases = module.load_case_contract() + + assert len(cases) == 4 + assert {case["id"] for case in cases} == { + "cme_futures", + "crypto_perps_funding", + "etfs", + "us_equities_panel", + } + assert all(case["production_path"] == "event_driven" for case in cases) + + +def test_case_record_retains_predictions_spec_and_outputs(tmp_path: Path) -> None: + module = _load_module() + artifact_root, lineage = _artifact_tree(tmp_path) + case = next(case for case in module.load_case_contract() if case["id"] == "etfs") + + record = module.build_case_record(case, lineage, artifact_root=artifact_root) + + assert record["case_study"] == "etfs" + assert record["production_path"] == "event_driven" + assert record["inputs"]["predictions.parquet"]["rows"] == 1 + assert record["backtest_artifacts"]["fills.parquet"]["rows"] == 1 + assert record["strategy"]["execution"] == {"execution_mode": "next_bar"} + assert all("sha256" in value for value in record["backtest_artifacts"].values()) + + +def test_case_record_fails_when_required_output_is_missing(tmp_path: Path) -> None: + module = _load_module() + artifact_root, lineage = _artifact_tree(tmp_path) + case = next(case for case in module.load_case_contract() if case["id"] == "etfs") + missing = ( + artifact_root + / "case_studies" + / "etfs" + / "run_log" + / "backtest" + / lineage["val_backtest_hash"] + / "fills.parquet" + ) + missing.unlink() + + with pytest.raises(FileNotFoundError, match="fills.parquet"): + module.build_case_record(case, lineage, artifact_root=artifact_root) + + +def test_case_record_detects_prediction_mismatch(tmp_path: Path) -> None: + module = _load_module() + artifact_root, lineage = _artifact_tree(tmp_path) + case = next(case for case in module.load_case_contract() if case["id"] == "etfs") + spec_path = ( + artifact_root + / "case_studies" + / "etfs" + / "run_log" + / "backtest" + / lineage["val_backtest_hash"] + / "spec.json" + ) + spec = json.loads(spec_path.read_text(encoding="utf-8")) + spec["backtest_config"]["metadata"]["prediction_hash"] = "wrong" + spec_path.write_text(json.dumps(spec), encoding="utf-8") + + with pytest.raises(ValueError, match="does not name selected prediction"): + module.build_case_record(case, lineage, artifact_root=artifact_root) diff --git a/validation/real_strategy_cases.toml b/validation/real_strategy_cases.toml new file mode 100644 index 00000000..36a5b1cf --- /dev/null +++ b/validation/real_strategy_cases.toml @@ -0,0 +1,28 @@ +[metadata] +schema_version = 1 +selection = "current canonical validation rank-1" +source = "ml4t/public case-study registry and artifacts" + +[[case]] +id = "cme_futures" +asset_class = "futures" +production_path = "event_driven" +required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] + +[[case]] +id = "crypto_perps_funding" +asset_class = "crypto_perpetual_futures" +production_path = "event_driven" +required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] + +[[case]] +id = "etfs" +asset_class = "etf" +production_path = "event_driven" +required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] + +[[case]] +id = "us_equities_panel" +asset_class = "equity" +production_path = "event_driven" +required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] diff --git a/validation/real_strategy_corpus.py b/validation/real_strategy_corpus.py new file mode 100644 index 00000000..1319cb5d --- /dev/null +++ b/validation/real_strategy_corpus.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python3 +"""Inventory the current canonical real-strategy corpus without rerunning a backtest.""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib +import json +import os +import subprocess +import sys +import tempfile +import tomllib +from collections.abc import Callable, Mapping +from datetime import UTC, datetime +from pathlib import Path +from typing import Any, cast + +import polars as pl + +VALIDATION_DIR = Path(__file__).parent +PROJECT_ROOT = VALIDATION_DIR.parent +DEFAULT_CASES_PATH = VALIDATION_DIR / "real_strategy_cases.toml" +SCHEMA_VERSION = 1 + + +def file_digest(path: Path) -> str: + """Return a streaming SHA-256 digest for an artifact.""" + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def git_identity(root: Path) -> dict[str, object]: + """Return the full commit and tracked-file status for a repository.""" + commit = subprocess.run( + ["git", "-C", str(root), "rev-parse", "HEAD"], + check=True, + capture_output=True, + text=True, + ).stdout.strip() + status = subprocess.run( + ["git", "-C", str(root), "status", "--porcelain", "--untracked-files=no"], + check=True, + capture_output=True, + text=True, + ).stdout + return {"commit": commit, "dirty": bool(status.strip())} + + +def load_case_contract(path: Path = DEFAULT_CASES_PATH) -> list[dict[str, Any]]: + """Load and validate the bounded real-strategy corpus contract.""" + payload = tomllib.loads(path.read_text(encoding="utf-8")) + metadata = payload.get("metadata") + if not isinstance(metadata, dict) or metadata.get("schema_version") != SCHEMA_VERSION: + raise ValueError("Unsupported real-strategy case contract schema") + cases = payload.get("case") + if not isinstance(cases, list): + raise ValueError("Real-strategy case contract must contain [[case]] records") + required_keys = { + "id", + "asset_class", + "production_path", + "required_backtest_artifacts", + } + case_ids: list[str] = [] + for index, case in enumerate(cases): + if not isinstance(case, dict) or not required_keys <= case.keys(): + raise ValueError(f"Invalid real-strategy case contract record {index}") + if case["production_path"] not in {"event_driven", "vectorized"}: + raise ValueError(f"Invalid production path for {case['id']}") + if not isinstance(case["required_backtest_artifacts"], list): + raise ValueError(f"Invalid artifact list for {case['id']}") + case_ids.append(str(case["id"])) + if not 3 <= len(case_ids) <= 5 or len(set(case_ids)) != len(case_ids): + raise ValueError("Real-strategy corpus must contain three to five unique case studies") + return cases + + +def _parquet_identity(path: Path) -> dict[str, object]: + schema = pl.scan_parquet(path).collect_schema() + count_frame = cast( + pl.DataFrame, + pl.scan_parquet(path).select(pl.len().alias("row_count")).collect(engine="streaming"), + ) + row_count = int(count_frame["row_count"][0]) + return { + "sha256": file_digest(path), + "bytes": path.stat().st_size, + "rows": int(row_count), + "schema": {name: str(dtype) for name, dtype in schema.items()}, + } + + +def _artifact_identity(path: Path) -> dict[str, object]: + identity: dict[str, object] = { + "sha256": file_digest(path), + "bytes": path.stat().st_size, + } + if path.suffix == ".parquet": + identity.update(_parquet_identity(path)) + return identity + + +def _strategy_summary(spec: Mapping[str, Any]) -> dict[str, object]: + strategy = spec.get("strategy") + backtest = spec.get("backtest_config") + if not isinstance(strategy, Mapping) or not isinstance(backtest, Mapping): + raise ValueError("Selected backtest spec lacks strategy or backtest_config") + execution = backtest.get("execution") + commission = backtest.get("commission") + slippage = backtest.get("slippage") + sizing = backtest.get("position_sizing") + rebalance = strategy.get("rebalance") + risk = strategy.get("risk") + signal = strategy.get("signal") + allocation = strategy.get("allocation") + return { + "signal": signal, + "allocation": allocation, + "risk": risk, + "rebalance": rebalance, + "execution": execution, + "commission": commission, + "slippage": slippage, + "position_sizing": sizing, + } + + +def build_case_record( + case: Mapping[str, Any], + lineage: Mapping[str, Any], + *, + artifact_root: Path, +) -> dict[str, object]: + """Build one immutable inventory record from a resolved canonical lineage.""" + case_id = str(case["id"]) + backtest_hash = str(lineage["val_backtest_hash"]) + prediction_hash = str(lineage["val_prediction_hash"]) + case_root = artifact_root / "case_studies" / case_id / "run_log" + backtest_dir = case_root / "backtest" / backtest_hash + prediction_dir = case_root / "predictions" / prediction_hash + registry_path = case_root / "registry.db" + prediction_path = prediction_dir / "predictions.parquet" + required_paths = [backtest_dir / str(name) for name in case["required_backtest_artifacts"]] + inputs = [registry_path, prediction_path, *required_paths] + missing = [path for path in inputs if not path.is_file()] + if missing: + relative = [path.relative_to(artifact_root).as_posix() for path in missing] + raise FileNotFoundError(f"{case_id} lacks required artifacts: {relative}") + + spec_path = backtest_dir / "spec.json" + spec = json.loads(spec_path.read_text(encoding="utf-8")) + if ( + spec.get("backtest_config", {}).get("metadata", {}).get("prediction_hash") + != prediction_hash + ): + raise ValueError(f"{case_id} selected spec does not name selected prediction") + recorded_mode = spec.get("strategy", {}).get("rebalance", {}).get("mode") + expected_mode = "engine" if case["production_path"] == "event_driven" else "vectorized" + if recorded_mode != expected_mode: + raise ValueError( + f"{case_id} production path differs: expected {expected_mode}, got {recorded_mode}" + ) + + artifacts = { + path.name: _artifact_identity(path) + for path in sorted(required_paths, key=lambda value: value.name) + } + return { + "case_study": case_id, + "asset_class": case["asset_class"], + "production_path": case["production_path"], + "selection": dict(lineage), + "strategy": _strategy_summary(spec), + "inputs": { + "registry": _artifact_identity(registry_path), + "predictions.parquet": _artifact_identity(prediction_path), + }, + "backtest_artifacts": artifacts, + } + + +def build_report( + *, + public_root: Path, + artifact_root: Path, + resolver: Callable[[str], Mapping[str, Any]], + cases_path: Path = DEFAULT_CASES_PATH, +) -> dict[str, object]: + """Build a complete current corpus inventory using the publication resolver.""" + cases = load_case_contract(cases_path) + records = [ + build_case_record(case, resolver(str(case["id"])), artifact_root=artifact_root) + for case in cases + ] + return { + "schema_version": SCHEMA_VERSION, + "generated_at": datetime.now(UTC).isoformat(), + "selection_contract": ( + "current canonical validation rank-1 resolved by " + "case_studies.utils.strategy_analysis.resolve_canonical_rank1_lineage" + ), + "repositories": { + "ml4t_backtest": git_identity(PROJECT_ROOT), + "publication": git_identity(public_root), + }, + "artifact_root": { + "kind": "external_case_study_run_log", + "retained_absolute_path": False, + }, + "summary": { + "case_studies": len(records), + "event_driven": sum(r["production_path"] == "event_driven" for r in records), + "vectorized": sum(r["production_path"] == "vectorized" for r in records), + }, + "records": records, + } + + +def write_report(report: Mapping[str, object], output: Path) -> None: + """Atomically write a deterministic JSON candidate.""" + output.parent.mkdir(parents=True, exist_ok=True) + payload = json.dumps(report, indent=2, sort_keys=True, default=str) + "\n" + descriptor, temporary_name = tempfile.mkstemp(prefix=f".{output.name}.", dir=output.parent) + temporary = Path(temporary_name) + try: + with os.fdopen(descriptor, "w", encoding="utf-8") as stream: + stream.write(payload) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, output) + finally: + temporary.unlink(missing_ok=True) + + +def _load_public_resolver(public_root: Path) -> Callable[[str], Mapping[str, Any]]: + sys.path.insert(0, str(public_root)) + os.chdir(public_root) + module = importlib.import_module("case_studies.utils.strategy_analysis") + return cast(Callable[[str], Mapping[str, Any]], module.resolve_canonical_rank1_lineage) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--public-root", type=Path, required=True) + parser.add_argument("--artifact-root", type=Path, required=True) + parser.add_argument( + "--output", + type=Path, + default=VALIDATION_DIR / "candidates" / "REAL_STRATEGY_CORPUS.candidate.json", + ) + args = parser.parse_args() + public_root = args.public_root.resolve() + artifact_root = args.artifact_root.resolve() + resolver = _load_public_resolver(public_root) + report = build_report( + public_root=public_root, + artifact_root=artifact_root, + resolver=resolver, + ) + write_report(report, args.output) + summary = cast(Mapping[str, object], report["summary"]) + print(f"Inventoried {summary['case_studies']} current case studies to {args.output}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 895397e1..8a148a13 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -20,6 +20,7 @@ validation/common/framework_registry.py validation/common/ml4t_runner.py validation/common/provenance.py validation/large_scale_evidence.py +validation/real_strategy_corpus.py validation/common/types.py validation/native/vectorbt_behavior.py validation/native/backtrader_behavior.py From 1cede6f8adf2d89a45ada365bd37d70bde0c0d36 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 16:14:38 -0400 Subject: [PATCH 41/44] feat(validation): materialize real strategy inputs --- tests/contracts/test_real_strategy_corpus.py | 30 +++ validation/real_strategy_cases.toml | 16 ++ validation/real_strategy_corpus.py | 246 +++++++++++++++++++ 3 files changed, 292 insertions(+) diff --git a/tests/contracts/test_real_strategy_corpus.py b/tests/contracts/test_real_strategy_corpus.py index 571eeb5f..8e4fc497 100644 --- a/tests/contracts/test_real_strategy_corpus.py +++ b/tests/contracts/test_real_strategy_corpus.py @@ -134,3 +134,33 @@ def test_case_record_detects_prediction_mismatch(tmp_path: Path) -> None: with pytest.raises(ValueError, match="does not name selected prediction"): module.build_case_record(case, lineage, artifact_root=artifact_root) + + +def test_content_addressed_bundle_is_reused_and_mutations_change_identity(tmp_path: Path) -> None: + module = _load_module() + market = pl.DataFrame( + { + "timestamp": ["2024-01-01", "2024-01-02"], + "symbol": ["SPY", "SPY"], + "open": [100.0, 101.0], + "close": [101.0, 102.0], + } + ) + targets = pl.DataFrame({"timestamp": ["2024-01-01"], "symbol": ["SPY"], "weight": [1.0]}) + kwargs = { + "case_id": "etfs", + "selection": {"val_backtest_hash": "a" * 12}, + "source_prediction_sha256": "b" * 64, + "spec": {"strategy": {"rebalance": {"mode": "engine"}}}, + "market": market, + "targets": targets, + "output_root": tmp_path, + } + + first = module.write_bundle(**kwargs) + second = module.write_bundle(**kwargs) + changed = module.write_bundle(**{**kwargs, "targets": targets.with_columns(weight=0.5)}) + + assert first == second + assert first["bundle_sha256"] != changed["bundle_sha256"] + assert (tmp_path / "etfs" / first["bundle_sha256"] / "manifest.json").is_file() diff --git a/validation/real_strategy_cases.toml b/validation/real_strategy_cases.toml index 36a5b1cf..ab08da96 100644 --- a/validation/real_strategy_cases.toml +++ b/validation/real_strategy_cases.toml @@ -7,22 +7,38 @@ source = "ml4t/public case-study registry and artifacts" id = "cme_futures" asset_class = "futures" production_path = "event_driven" +warmup = true +timestamp_shift_hours = 0 +contract_specs = true +funding = false required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] [[case]] id = "crypto_perps_funding" asset_class = "crypto_perpetual_futures" production_path = "event_driven" +warmup = true +timestamp_shift_hours = 8 +contract_specs = false +funding = true required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] [[case]] id = "etfs" asset_class = "etf" production_path = "event_driven" +warmup = false +timestamp_shift_hours = 0 +contract_specs = false +funding = false required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] [[case]] id = "us_equities_panel" asset_class = "equity" production_path = "event_driven" +warmup = false +timestamp_shift_hours = 0 +contract_specs = false +funding = false required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] diff --git a/validation/real_strategy_corpus.py b/validation/real_strategy_corpus.py index 1319cb5d..d5cff7d3 100644 --- a/validation/real_strategy_corpus.py +++ b/validation/real_strategy_corpus.py @@ -4,6 +4,9 @@ from __future__ import annotations import argparse +import dataclasses +import enum +import gc import hashlib import importlib import json @@ -65,6 +68,10 @@ def load_case_contract(path: Path = DEFAULT_CASES_PATH) -> list[dict[str, Any]]: "asset_class", "production_path", "required_backtest_artifacts", + "warmup", + "timestamp_shift_hours", + "contract_specs", + "funding", } case_ids: list[str] = [] for index, case in enumerate(cases): @@ -237,6 +244,234 @@ def write_report(report: Mapping[str, object], output: Path) -> None: temporary.unlink(missing_ok=True) +def _json_value(value: object) -> object: + if dataclasses.is_dataclass(value) and not isinstance(value, type): + return {key: _json_value(item) for key, item in dataclasses.asdict(value).items()} + if isinstance(value, enum.Enum): + return value.value + if isinstance(value, Mapping): + return {str(key): _json_value(item) for key, item in value.items()} + if isinstance(value, (list, tuple)): + return [_json_value(item) for item in value] + return value + + +def _sanitize_spec(spec: Mapping[str, Any]) -> dict[str, Any]: + sanitized = json.loads(json.dumps(spec, default=str)) + sanitized.pop("_runtime_backtest_config", None) + metadata = sanitized.get("backtest_config", {}).get("metadata", {}) + metadata.pop("preset_path", None) + return sanitized + + +def _frame_identity(frame: pl.DataFrame) -> dict[str, object]: + return { + "rows": frame.height, + "schema": {name: str(dtype) for name, dtype in frame.schema.items()}, + } + + +def _bundle_digest( + *, + selection: Mapping[str, Any], + source_prediction_sha256: str, + spec: Mapping[str, Any], + frames: Mapping[str, pl.DataFrame], + contracts: Mapping[str, object] | None, +) -> str: + digest = hashlib.sha256() + metadata = { + "selection": selection, + "source_prediction_sha256": source_prediction_sha256, + "spec": spec, + "contracts": contracts, + } + digest.update(json.dumps(metadata, sort_keys=True, separators=(",", ":"), default=str).encode()) + for name, frame in sorted(frames.items()): + digest.update(name.encode()) + digest.update(frame.serialize(format="binary")) + return digest.hexdigest() + + +def write_bundle( + *, + case_id: str, + selection: Mapping[str, Any], + source_prediction_sha256: str, + spec: Mapping[str, Any], + market: pl.DataFrame, + targets: pl.DataFrame, + output_root: Path, + funding: pl.DataFrame | None = None, + contracts: Mapping[str, object] | None = None, +) -> dict[str, object]: + """Write one content-addressed engine-input bundle and return its manifest.""" + frames = {"market.parquet": market, "targets.parquet": targets} + if funding is not None: + frames["funding.parquet"] = funding + normalized_contracts = cast(Mapping[str, object] | None, _json_value(contracts)) + sanitized_spec = _sanitize_spec(spec) + digest = _bundle_digest( + selection=selection, + source_prediction_sha256=source_prediction_sha256, + spec=sanitized_spec, + frames=frames, + contracts=normalized_contracts, + ) + destination = output_root / case_id / digest + manifest: dict[str, object] = { + "schema_version": SCHEMA_VERSION, + "case_study": case_id, + "bundle_sha256": digest, + "selection": dict(selection), + "source_prediction_sha256": source_prediction_sha256, + "files": {}, + } + if destination.is_dir(): + retained = json.loads((destination / "manifest.json").read_text(encoding="utf-8")) + if retained.get("bundle_sha256") != digest: + raise ValueError(f"Retained {case_id} bundle has the wrong identity") + return retained + + destination.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{case_id}.", dir=destination.parent)) + try: + for name, frame in frames.items(): + frame.write_parquet(staging / name, compression="zstd", statistics=True) + (staging / "spec.json").write_text( + json.dumps(sanitized_spec, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if normalized_contracts is not None: + (staging / "contracts.json").write_text( + json.dumps(normalized_contracts, indent=2, sort_keys=True) + "\n", + encoding="utf-8", + ) + files = { + path.name: _artifact_identity(path) + for path in sorted(staging.iterdir()) + if path.name != "manifest.json" + } + manifest["files"] = files + (staging / "manifest.json").write_text( + json.dumps(manifest, indent=2, sort_keys=True, default=str) + "\n", + encoding="utf-8", + ) + os.replace(staging, destination) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + return manifest + + +def materialize_bundles( + *, + corpus_report: Mapping[str, object], + artifact_root: Path, + output_root: Path, +) -> dict[str, object]: + """Precompute engine inputs for every selected production strategy.""" + loaders = importlib.import_module("case_studies.utils.backtest_loaders") + runner = importlib.import_module("case_studies.utils.backtest_runner") + registry = importlib.import_module("case_studies.utils.registry") + cv_window = importlib.import_module("case_studies.utils.cv_window") + contract_by_id = {case["id"]: case for case in load_case_contract()} + records = cast(list[dict[str, Any]], corpus_report["records"]) + manifests: list[dict[str, object]] = [] + for record in records: + case_id = str(record["case_study"]) + print(f"Preparing {case_id}", flush=True) + contract = contract_by_id[case_id] + selection = cast(dict[str, Any], record["selection"]) + label = str(selection["label"]) + prediction_hash = str(selection["val_prediction_hash"]) + backtest_hash = str(selection["val_backtest_hash"]) + spec_path = ( + artifact_root + / "case_studies" + / case_id + / "run_log" + / "backtest" + / backtest_hash + / "spec.json" + ) + spec = json.loads(spec_path.read_text(encoding="utf-8")) + warmup = int(loaders.warmup_periods_for(case_id)) if contract["warmup"] else 0 + market = loaders.load_backtest_prices_for( + case_id, + label, + split="validation", + warmup_periods=warmup, + max_symbols=0, + ) + predictions = registry.read_predictions(case_id, prediction_hash) + shift_hours = int(contract["timestamp_shift_hours"]) + if shift_hours: + window = cv_window.canonical_window(case_id, label, split="validation") + if window is None: + raise ValueError(f"{case_id} lacks a canonical validation window") + validation_end = window[1] + market = market.with_columns( + pl.col("timestamp") + pl.duration(hours=shift_hours) + ).filter(pl.col("timestamp").dt.date() <= validation_end) + predictions = predictions.with_columns( + pl.col("timestamp") + pl.duration(hours=shift_hours) + ).filter(pl.col("timestamp").dt.date() <= validation_end) + targets = runner.precompute_weights( + predictions, + spec, + market, + label=label, + case_study=case_id, + prediction_hash=prediction_hash, + ).sort("timestamp", "symbol") + market = market.sort("timestamp", "symbol") + funding = None + if contract["funding"]: + funding_module = importlib.import_module( + "case_studies.crypto_perps_funding.funding_data" + ) + funding = ( + funding_module.load_funding_rates(symbols=market["symbol"].unique().to_list()) + .with_columns(pl.col("timestamp").cast(market.schema["timestamp"])) + .filter( + (pl.col("timestamp") >= market["timestamp"].min()) + & (pl.col("timestamp") <= market["timestamp"].max()) + ) + .sort("timestamp", "symbol") + ) + contracts = None + if contract["contract_specs"]: + contracts = loaders.load_contract_specs_from_yaml() + prediction_identity = cast(dict[str, Any], record["inputs"])["predictions.parquet"] + bundle = write_bundle( + case_id=case_id, + selection=selection, + source_prediction_sha256=str(prediction_identity["sha256"]), + spec=spec, + market=market, + targets=targets, + output_root=output_root, + funding=funding, + contracts=contracts, + ) + manifests.append(bundle) + print( + f"Prepared {case_id}: {market.height:,} market rows, " + f"{targets.height:,} targets, {str(bundle['bundle_sha256'])[:12]}", + flush=True, + ) + del market, predictions, targets, funding + gc.collect() + return { + "schema_version": SCHEMA_VERSION, + "generated_at": datetime.now(UTC).isoformat(), + "bundle_root": {"retained_absolute_path": False}, + "records": manifests, + } + + def _load_public_resolver(public_root: Path) -> Callable[[str], Mapping[str, Any]]: sys.path.insert(0, str(public_root)) os.chdir(public_root) @@ -253,6 +488,7 @@ def main() -> int: type=Path, default=VALIDATION_DIR / "candidates" / "REAL_STRATEGY_CORPUS.candidate.json", ) + parser.add_argument("--materialize", type=Path) args = parser.parse_args() public_root = args.public_root.resolve() artifact_root = args.artifact_root.resolve() @@ -263,6 +499,16 @@ def main() -> int: resolver=resolver, ) write_report(report, args.output) + if args.materialize is not None: + bundle_report = materialize_bundles( + corpus_report=report, + artifact_root=artifact_root, + output_root=args.materialize.resolve(), + ) + bundle_output = args.output.with_name("REAL_STRATEGY_INPUTS.candidate.json") + write_report(bundle_report, bundle_output) + bundle_records = cast(list[dict[str, object]], bundle_report["records"]) + print(f"Materialized {len(bundle_records)} engine input bundles") summary = cast(Mapping[str, object], report["summary"]) print(f"Inventoried {summary['case_studies']} current case studies to {args.output}") return 0 From fb98012d1d70a8fd4ec58e558259b70c221bea44 Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 16:32:59 -0400 Subject: [PATCH 42/44] feat(validation): execute frozen real strategies --- pyproject.toml | 2 +- tests/contracts/test_real_strategy_corpus.py | 45 ++- tests/test_calendar.py | 4 + uv.lock | 14 +- validation/real_strategy_cases.toml | 10 - validation/real_strategy_corpus.py | 54 +++- validation/real_strategy_runner.py | 319 +++++++++++++++++++ validation/release_checks.txt | 1 + 8 files changed, 416 insertions(+), 33 deletions(-) create mode 100644 validation/real_strategy_runner.py diff --git a/pyproject.toml b/pyproject.toml index f6f4a7fc..f94d65d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,7 +81,7 @@ dependencies = [ "pandas>=3.0.5; python_version >= '3.15'", "numpy>=2.3.2", "PyYAML>=6.0.3", - "pandas-market-calendars>=5.2.4", + "pandas-market-calendars>=5.4.0", ] [project.optional-dependencies] diff --git a/tests/contracts/test_real_strategy_corpus.py b/tests/contracts/test_real_strategy_corpus.py index 8e4fc497..b3634f94 100644 --- a/tests/contracts/test_real_strategy_corpus.py +++ b/tests/contracts/test_real_strategy_corpus.py @@ -71,12 +71,11 @@ def test_case_contract_contains_selected_real_case_studies() -> None: cases = module.load_case_contract() - assert len(cases) == 4 + assert len(cases) == 3 assert {case["id"] for case in cases} == { "cme_futures", "crypto_perps_funding", "etfs", - "us_equities_panel", } assert all(case["production_path"] == "event_driven" for case in cases) @@ -164,3 +163,45 @@ def test_content_addressed_bundle_is_reused_and_mutations_change_identity(tmp_pa assert first == second assert first["bundle_sha256"] != changed["bundle_sha256"] assert (tmp_path / "etfs" / first["bundle_sha256"] / "manifest.json").is_file() + + +def test_funding_is_limited_to_timestamps_presented_by_market() -> None: + module = _load_module() + market = pl.DataFrame( + { + "timestamp": ["2024-01-01T08:00:00", "2024-01-03T08:00:00"], + "symbol": ["BTCUSDT", "BTCUSDT"], + } + ).with_columns(pl.col("timestamp").str.to_datetime()) + funding = pl.DataFrame( + { + "timestamp": [ + "2024-01-01T08:00:00", + "2024-01-02T08:00:00", + "2024-01-03T08:00:00", + ], + "symbol": ["BTCUSDT", "BTCUSDT", "ETHUSDT"], + "funding_rate": [0.0001, 0.0002, -0.0001], + } + ).with_columns(pl.col("timestamp").str.to_datetime(time_unit="ms")) + + aligned = module.align_funding_to_market_events(funding, market) + + assert aligned["timestamp"].to_list() == market["timestamp"].to_list() + assert aligned["symbol"].to_list() == ["BTCUSDT", "ETHUSDT"] + + +def test_targets_are_limited_to_production_engine_schedule() -> None: + module = _load_module() + targets = pl.DataFrame( + { + "timestamp": ["2024-01-01", "2024-01-02", "2024-01-03"], + "symbol": ["SPY", "SPY", "QQQ"], + "weight": [1.0, 0.5, 1.0], + } + ).with_columns(pl.col("timestamp").str.to_datetime()) + schedule = pl.Series("timestamp", ["2024-01-01", "2024-01-03"]).str.to_datetime(time_unit="ms") + + aligned = module.align_targets_to_engine_schedule(targets, schedule) + + assert aligned["symbol"].to_list() == ["SPY", "QQQ"] diff --git a/tests/test_calendar.py b/tests/test_calendar.py index a367ef77..0fbe411a 100644 --- a/tests/test_calendar.py +++ b/tests/test_calendar.py @@ -138,6 +138,10 @@ def test_is_trading_day_holiday(self): assert is_trading_day("NYSE", date(2024, 7, 4)) is False # Independence Day assert is_trading_day("NYSE", date(2024, 12, 25)) is False # Christmas + def test_cme_good_friday_early_close_is_a_session(self): + """CME equity futures traded an abbreviated session on Good Friday 2021.""" + assert is_trading_day("CME", date(2021, 4, 2)) is True + def test_is_trading_day_with_string(self): """Test with string date input.""" assert is_trading_day("NYSE", "2024-06-03") is True diff --git a/uv.lock b/uv.lock index 7c772815..e0ecbd45 100644 --- a/uv.lock +++ b/uv.lock @@ -735,7 +735,7 @@ wheels = [ [[package]] name = "exchange-calendars" -version = "4.11.3" +version = "4.13.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "korean-lunar-calendar" }, @@ -746,9 +746,9 @@ dependencies = [ { name = "toolz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/14/a9de4bb3b86ce661d33b9d862562eba6aad2ade629a0a821627604a108b5/exchange_calendars-4.11.3.tar.gz", hash = "sha256:53a8f68f86edaf265b0b20cb3641ce34c4b9205b039b0a50f36fc99d114b77bd", size = 4090661, upload-time = "2025-11-10T14:44:16.009Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/73/460b0ece4e7444e3098b7738974c822787e134578d069d3a88b4be17d50a/exchange_calendars-4.13.2.tar.gz", hash = "sha256:a9459425dd64142cd54fbc639847403c7e0c33d60fbc326c94fc1d6bd127f002", size = 4137321, upload-time = "2026-03-10T03:24:38.536Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/dd/b30915627128b388c235ee047ca721a40a4960e8b55ea9fa4a005466774b/exchange_calendars-4.11.3-py3-none-any.whl", hash = "sha256:c40d9f1b50238f578f9f8c772aa895533ab03db4910da43825ca59f7ebd9e82f", size = 209667, upload-time = "2025-11-10T14:44:14.694Z" }, + { url = "https://files.pythonhosted.org/packages/c8/4c/0469b40057bc9f8d9594dcc6024202626b981ae4b52dfcd304552e8e1c3a/exchange_calendars-4.13.2-py3-none-any.whl", hash = "sha256:fc5a2ad0d61b5c3a6539a3061cd4cbb55c59f4a903455cec7926e4b798919996", size = 213306, upload-time = "2026-03-10T03:24:37.055Z" }, ] [[package]] @@ -1908,7 +1908,7 @@ requires-dist = [ { name = "numpy", specifier = ">=2.3.2" }, { name = "pandas", marker = "python_full_version < '3.15'", specifier = ">=2.3.3" }, { name = "pandas", marker = "python_full_version >= '3.15'", specifier = ">=3.0.5" }, - { name = "pandas-market-calendars", specifier = ">=5.2.4" }, + { name = "pandas-market-calendars", specifier = ">=5.4.0" }, { name = "plotly", marker = "extra == 'all'", specifier = ">=5.15.0" }, { name = "plotly", marker = "extra == 'viz'", specifier = ">=5.15.0" }, { name = "polars", specifier = ">=1.36.1" }, @@ -2594,16 +2594,16 @@ wheels = [ [[package]] name = "pandas-market-calendars" -version = "5.2.4" +version = "5.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exchange-calendars" }, { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.15'" }, { name = "pandas", version = "3.0.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.15'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/86/3f6f1325dbbd948150e683aa9735c34493954b525c1efd453c47beb46f9c/pandas_market_calendars-5.2.4.tar.gz", hash = "sha256:7cbb7de0e1652f08db4d5185f9429486fd3a6e050c4fc8d1f51a5eaad2fabdb0", size = 162701, upload-time = "2026-01-07T12:50:33.48Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/4c/98067cb91b37a137389f978f52410975915268d394c09cf941c490565297/pandas_market_calendars-5.4.0.tar.gz", hash = "sha256:b02f3a0e9bcb4b9e82a5060bf260ef0060ccd398f989b5e6f8208f4352967806", size = 175213, upload-time = "2026-05-27T02:42:05.249Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/de/f9940c57937720f07f5cd3acf4b4e1208520e1321ed5576d928121e2dae3/pandas_market_calendars-5.2.4-py3-none-any.whl", hash = "sha256:82998eeaed52a554d88ca98c2ff799c329d72c77630502ced74487a951bb2e86", size = 127819, upload-time = "2026-01-07T12:50:34.614Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d3/59b999f7f6a1d173572d3e8f8b07ded7e256c691d02b3b5cacb26479895a/pandas_market_calendars-5.4.0-py3-none-any.whl", hash = "sha256:bb2b93b28d496cab173b41c7d120fd5cd9d506b31f3bb0ad3d1d9f2b60d9d9e3", size = 134904, upload-time = "2026-05-27T02:42:06.35Z" }, ] [[package]] diff --git a/validation/real_strategy_cases.toml b/validation/real_strategy_cases.toml index ab08da96..206ce892 100644 --- a/validation/real_strategy_cases.toml +++ b/validation/real_strategy_cases.toml @@ -32,13 +32,3 @@ timestamp_shift_hours = 0 contract_specs = false funding = false required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] - -[[case]] -id = "us_equities_panel" -asset_class = "equity" -production_path = "event_driven" -warmup = false -timestamp_shift_hours = 0 -contract_specs = false -funding = false -required_backtest_artifacts = ["daily_returns.parquet", "equity.parquet", "fills.parquet", "portfolio_state.parquet", "spec.json", "trades.parquet", "weights.parquet"] diff --git a/validation/real_strategy_corpus.py b/validation/real_strategy_corpus.py index d5cff7d3..faa1c532 100644 --- a/validation/real_strategy_corpus.py +++ b/validation/real_strategy_corpus.py @@ -271,6 +271,26 @@ def _frame_identity(frame: pl.DataFrame) -> dict[str, object]: } +def align_funding_to_market_events(funding: pl.DataFrame, market: pl.DataFrame) -> pl.DataFrame: + """Retain funding settlements that the frozen engine timeline can present.""" + market_timestamps = market.select("timestamp").unique() + if funding.schema["timestamp"] != market_timestamps.schema["timestamp"]: + funding = funding.with_columns( + pl.col("timestamp").cast(market_timestamps.schema["timestamp"]) + ) + return funding.join(market_timestamps, on="timestamp", how="semi").sort("timestamp", "symbol") + + +def align_targets_to_engine_schedule(targets: pl.DataFrame, schedule: pl.Series) -> pl.DataFrame: + """Retain target rows that the production engine schedule can submit.""" + schedule_frame = schedule.alias("timestamp").to_frame().unique() + if targets.schema["timestamp"] != schedule_frame.schema["timestamp"]: + schedule_frame = schedule_frame.with_columns( + pl.col("timestamp").cast(targets.schema["timestamp"]) + ) + return targets.join(schedule_frame, on="timestamp", how="semi").sort("timestamp", "symbol") + + def _bundle_digest( *, selection: Mapping[str, Any], @@ -426,20 +446,26 @@ def materialize_bundles( case_study=case_id, prediction_hash=prediction_hash, ).sort("timestamp", "symbol") + cadence = spec["strategy"]["rebalance"]["cadence"] + calendar = spec["backtest_config"]["calendar"]["calendar"] + schedule = loaders.resolve_rebalance_timestamps( + pl.Series("timestamp", predictions["timestamp"].unique().sort().to_list()), + cadence, + calendar, + ) + step = int(loaders.get_rebalance_step(case_id, label)) + if step > 1: + schedule = schedule.gather_every(step) + targets = align_targets_to_engine_schedule(targets, schedule) market = market.sort("timestamp", "symbol") funding = None if contract["funding"]: funding_module = importlib.import_module( "case_studies.crypto_perps_funding.funding_data" ) - funding = ( - funding_module.load_funding_rates(symbols=market["symbol"].unique().to_list()) - .with_columns(pl.col("timestamp").cast(market.schema["timestamp"])) - .filter( - (pl.col("timestamp") >= market["timestamp"].min()) - & (pl.col("timestamp") <= market["timestamp"].max()) - ) - .sort("timestamp", "symbol") + funding = align_funding_to_market_events( + funding_module.load_funding_rates(symbols=market["symbol"].unique().to_list()), + market, ) contracts = None if contract["contract_specs"]: @@ -492,25 +518,27 @@ def main() -> int: args = parser.parse_args() public_root = args.public_root.resolve() artifact_root = args.artifact_root.resolve() + output = args.output.resolve() + materialize_root = args.materialize.resolve() if args.materialize is not None else None resolver = _load_public_resolver(public_root) report = build_report( public_root=public_root, artifact_root=artifact_root, resolver=resolver, ) - write_report(report, args.output) - if args.materialize is not None: + write_report(report, output) + if materialize_root is not None: bundle_report = materialize_bundles( corpus_report=report, artifact_root=artifact_root, - output_root=args.materialize.resolve(), + output_root=materialize_root, ) - bundle_output = args.output.with_name("REAL_STRATEGY_INPUTS.candidate.json") + bundle_output = output.with_name("REAL_STRATEGY_INPUTS.candidate.json") write_report(bundle_report, bundle_output) bundle_records = cast(list[dict[str, object]], bundle_report["records"]) print(f"Materialized {len(bundle_records)} engine input bundles") summary = cast(Mapping[str, object], report["summary"]) - print(f"Inventoried {summary['case_studies']} current case studies to {args.output}") + print(f"Inventoried {summary['case_studies']} current case studies to {output}") return 0 diff --git a/validation/real_strategy_runner.py b/validation/real_strategy_runner.py new file mode 100644 index 00000000..877eb626 --- /dev/null +++ b/validation/real_strategy_runner.py @@ -0,0 +1,319 @@ +#!/usr/bin/env python3 +"""Execute a frozen real-strategy input bundle with ml4t.backtest.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import math +import os +import tempfile +import time +from collections.abc import Mapping +from datetime import UTC, datetime +from functools import wraps +from pathlib import Path +from typing import Any + +import polars as pl + +from ml4t.backtest import ( + AssetClass, + BacktestConfig, + ContractSpec, + DataFeed, + Engine, + RebalanceConfig, + Strategy, + TargetWeightExecutor, +) +from ml4t.backtest.risk import RuleChain, StopLoss, TimeExit, TrailingStop + +SCHEMA_VERSION = 1 + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _as_utc(value: datetime) -> datetime: + return value.replace(tzinfo=UTC) if value.tzinfo is None else value.astimezone(UTC) + + +class FundingSettlementLedger: + """Apply frozen perpetual-futures funding during engine mark updates.""" + + def __init__(self, funding: pl.DataFrame) -> None: + required = {"symbol", "timestamp", "funding_rate"} + missing = required - set(funding.columns) + if missing: + raise ValueError(f"Funding input lacks columns: {sorted(missing)}") + selected = funding.select("symbol", "timestamp", "funding_rate") + if selected.null_count().row(0) != (0, 0, 0): + raise ValueError("Funding input contains null keys or rates") + if selected.n_unique(["symbol", "timestamp"]) != selected.height: + raise ValueError("Funding input contains duplicate settlement keys") + self._rates: dict[datetime, dict[str, float]] = {} + for row in selected.sort("timestamp", "symbol").iter_rows(named=True): + rate = float(row["funding_rate"]) + if not math.isfinite(rate): + raise ValueError("Funding rates must be finite") + timestamp = _as_utc(row["timestamp"]) + self._rates.setdefault(timestamp, {})[str(row["symbol"])] = rate + self._rate_count = selected.height + self._settled_timestamps: set[datetime] = set() + self.funding_pnl = 0.0 + self.funding_events = 0 + self.funding_settlements = 0 + + def install(self, broker: Any) -> None: + original_update_time = broker._update_time + + @wraps(original_update_time) + def update_time_with_funding(timestamp, *args, **kwargs): + result = original_update_time(timestamp, *args, **kwargs) + self.settle(timestamp, broker) + return result + + broker._update_time = update_time_with_funding + + def settle(self, timestamp: datetime, broker: Any) -> None: + normalized = _as_utc(timestamp) + if normalized in self._settled_timestamps: + return + rates = self._rates.get(normalized) + if rates is None: + return + self._settled_timestamps.add(normalized) + self.funding_settlements += len(rates) + event_cash = 0.0 + for symbol, rate in rates.items(): + position = broker.positions.get(symbol) + if position is None or float(position.quantity) == 0.0: + continue + mark = broker.get_mark_price(symbol, quantity=position.quantity) + if mark is None: + raise RuntimeError(f"Funding settlement lacks a mark for {symbol!r}") + event_cash -= ( + float(position.quantity) + * float(mark) + * float(getattr(position, "multiplier", 1.0)) + * rate + ) + if event_cash: + broker.cash = float(broker.cash) + event_cash + self.funding_pnl += event_cash + self.funding_events += 1 + + def metrics(self) -> dict[str, int | float]: + if self.funding_settlements != self._rate_count: + raise RuntimeError( + "Funding coverage is incomplete: " + f"{self.funding_settlements}/{self._rate_count} settlements" + ) + return { + "funding_pnl": self.funding_pnl, + "funding_events": self.funding_events, + "funding_settlements": self.funding_settlements, + } + + +def _position_rules(risk: Mapping[str, Any]) -> object | None: + rules = [] + for rule in risk.get("position_rules", []): + rule_type = rule["type"] + if rule_type == "stop_loss": + rules.append(StopLoss(pct=float(rule["threshold"]))) + elif rule_type == "trailing_stop": + rules.append(TrailingStop(pct=float(rule["threshold"]))) + elif rule_type == "time_exit": + rules.append(TimeExit(max_bars=int(rule["bars"]))) + else: + raise ValueError(f"Unsupported frozen position rule: {rule_type}") + if len(rules) == 1: + return rules[0] + return RuleChain(rules) if rules else None + + +def _contract_specs(path: Path) -> dict[str, ContractSpec] | None: + if not path.is_file(): + return None + payload = json.loads(path.read_text(encoding="utf-8")) + return { + symbol: ContractSpec( + symbol=symbol, + asset_class=AssetClass(item["asset_class"]), + multiplier=float(item["multiplier"]), + tick_size=float(item["tick_size"]), + margin=None if item["margin"] is None else float(item["margin"]), + margin_pct=( + None + if item["margin_pct"] is None + else (float(item["margin_pct"][0]), float(item["margin_pct"][1])) + ), + currency=str(item["currency"]), + ) + for symbol, item in payload.items() + } + + +def _target_map(targets: pl.DataFrame) -> dict[datetime, dict[str, float]]: + duplicates = targets.select(pl.struct("timestamp", "symbol").is_duplicated().sum()).item() + if duplicates: + raise ValueError(f"Targets contain {duplicates} duplicate timestamp-symbol rows") + result: dict[datetime, dict[str, float]] = {} + for row in targets.sort("timestamp", "symbol").iter_rows(named=True): + result.setdefault(row["timestamp"], {})[str(row["symbol"])] = float(row["weight"]) + return result + + +def load_bundle(bundle: Path) -> dict[str, Any]: + """Load and verify one content-addressed bundle before engine timing begins.""" + manifest = json.loads((bundle / "manifest.json").read_text(encoding="utf-8")) + for name, identity in manifest["files"].items(): + path = bundle / name + if not path.is_file() or _sha256(path) != identity["sha256"]: + raise ValueError(f"Bundle file identity mismatch: {name}") + spec = json.loads((bundle / "spec.json").read_text(encoding="utf-8")) + return { + "manifest": manifest, + "spec": spec, + "market": pl.read_parquet(bundle / "market.parquet"), + "targets": pl.read_parquet(bundle / "targets.parquet"), + "funding": ( + pl.read_parquet(bundle / "funding.parquet") + if (bundle / "funding.parquet").is_file() + else None + ), + "contracts": _contract_specs(bundle / "contracts.json"), + } + + +def execute_bundle(inputs: Mapping[str, Any]) -> tuple[Any, float, dict[str, int | float]]: + """Run the engine once and return its native result and engine-only runtime.""" + spec = inputs["spec"] + config = BacktestConfig.from_dict(spec["backtest_config"]) + targets = _target_map(inputs["targets"]) + rebalance = spec["strategy"]["rebalance"] + rules = _position_rules(spec["strategy"].get("risk", {})) + funding = inputs["funding"] + funding_ledger = FundingSettlementLedger(funding) if funding is not None else None + + class FrozenTargetStrategy(Strategy): + def __init__(self) -> None: + self._rules_set = False + self._executor = TargetWeightExecutor( + RebalanceConfig( + min_trade_value=float(rebalance["min_trade_value"]), + min_weight_change=float(rebalance["min_weight_change"]), + allow_fractional=None, + allow_short=bool(config.allow_short_selling), + rebalance_mode=config.rebalance_mode, + ) + ) + + def on_start(self, broker) -> None: + if funding_ledger is not None: + funding_ledger.install(broker) + + def on_data(self, timestamp, data, context, broker) -> None: + if not self._rules_set: + if rules is not None: + broker.set_position_rules(rules) + self._rules_set = True + target = targets.get(timestamp) + if target is not None: + available = {symbol: weight for symbol, weight in target.items() if symbol in data} + if available: + self._executor.execute(available, data, broker) + + feed = DataFeed(prices_df=inputs["market"], feed_spec=config.feed_spec) + engine = Engine.from_config( + feed, + FrozenTargetStrategy(), + config, + contract_specs=inputs["contracts"], + ) + started = time.perf_counter() + result = engine.run() + engine_seconds = time.perf_counter() - started + funding_metrics = funding_ledger.metrics() if funding_ledger is not None else {} + return result, engine_seconds, funding_metrics + + +def _write_evidence( + *, + output: Path, + inputs: Mapping[str, Any], + result: Any, + engine_seconds: float, + funding_metrics: Mapping[str, int | float], +) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) + try: + frames = { + "fills.parquet": result.to_fills_dataframe(), + "trades.parquet": result.to_trades_dataframe(), + "equity.parquet": result.to_equity_dataframe(), + "portfolio_state.parquet": result.to_portfolio_state_dataframe(), + } + for name, frame in frames.items(): + frame.write_parquet(staging / name, compression="zstd", statistics=True) + manifest = { + "schema_version": SCHEMA_VERSION, + "case_study": inputs["manifest"]["case_study"], + "framework": "ml4t_backtest", + "input_bundle_sha256": inputs["manifest"]["bundle_sha256"], + "engine_seconds": engine_seconds, + "final_value": float(result.metrics["final_value"]), + "num_fills": len(result.fills), + "num_trades": len(result.trades), + "funding": dict(funding_metrics), + "files": {}, + } + manifest["files"] = { + path.name: {"sha256": _sha256(path), "bytes": path.stat().st_size} + for path in sorted(staging.iterdir()) + } + (staging / "manifest.json").write_text( + json.dumps(manifest, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if output.exists(): + raise FileExistsError(f"Evidence output already exists: {output}") + os.replace(staging, output) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + inputs = load_bundle(args.bundle.resolve()) + result, engine_seconds, funding_metrics = execute_bundle(inputs) + _write_evidence( + output=args.output.resolve(), + inputs=inputs, + result=result, + engine_seconds=engine_seconds, + funding_metrics=funding_metrics, + ) + print( + f"{inputs['manifest']['case_study']}: {len(result.fills):,} fills, " + f"{len(result.trades):,} trades, {engine_seconds:.6f}s engine time" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 8a148a13..7cfa55e6 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -21,6 +21,7 @@ validation/common/ml4t_runner.py validation/common/provenance.py validation/large_scale_evidence.py validation/real_strategy_corpus.py +validation/real_strategy_runner.py validation/common/types.py validation/native/vectorbt_behavior.py validation/native/backtrader_behavior.py From ae6eadfb3de3b5cd00425ae8598c839bb2eddcec Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 17:50:11 -0400 Subject: [PATCH 43/44] feat(validation): compare frozen real strategies --- src/ml4t/backtest/config.py | 12 +- src/ml4t/backtest/execution/rebalancer.py | 16 +- src/ml4t/backtest/profiles.py | 1 + tests/compatibility/snapshots/v0.1.json | 28 +- tests/contracts/test_python_support_policy.py | 2 +- .../test_real_strategy_applicability.py | 25 + tests/contracts/test_real_strategy_runner.py | 130 +++++ .../contracts/test_static_analysis_policy.py | 3 + tests/execution/test_rebalancer.py | 19 +- tests/test_config_wiring.py | 1 + validation/behavior_coverage.toml | 2 +- validation/real_strategy_applicability.toml | 109 +++++ validation/real_strategy_backtrader.py | 246 ++++++++++ validation/real_strategy_evidence.py | 446 ++++++++++++++++++ validation/real_strategy_lean.py | 281 +++++++++++ validation/real_strategy_lean_crypto.py | 328 +++++++++++++ validation/real_strategy_runner.py | 194 +++++++- validation/real_strategy_vectorbt.py | 160 +++++++ validation/real_strategy_zipline.py | 292 ++++++++++++ validation/release_checks.txt | 3 + 20 files changed, 2268 insertions(+), 30 deletions(-) create mode 100644 tests/contracts/test_real_strategy_applicability.py create mode 100644 tests/contracts/test_real_strategy_runner.py create mode 100644 validation/real_strategy_applicability.toml create mode 100644 validation/real_strategy_backtrader.py create mode 100644 validation/real_strategy_evidence.py create mode 100644 validation/real_strategy_lean.py create mode 100644 validation/real_strategy_lean_crypto.py create mode 100644 validation/real_strategy_vectorbt.py create mode 100644 validation/real_strategy_zipline.py diff --git a/src/ml4t/backtest/config.py b/src/ml4t/backtest/config.py index 76c98ee1..9d903d30 100644 --- a/src/ml4t/backtest/config.py +++ b/src/ml4t/backtest/config.py @@ -87,6 +87,13 @@ class ShareType(str, Enum): INTEGER = "integer" # Round down to whole shares (like most real brokers) +class ShareRounding(str, Enum): + """Integer-share rounding used during target-weight sizing.""" + + NEAREST = "nearest" + TRUNCATE = "truncate" + + class FillOrdering(str, Enum): """Order processing sequence within a single bar. @@ -712,6 +719,7 @@ def get_effective_account_type(self) -> str: # === Position Sizing === share_type: ShareType = ShareType.INTEGER + share_rounding: ShareRounding = ShareRounding.NEAREST # === Commission === commission_type: CommissionType = CommissionType.NONE @@ -910,6 +918,7 @@ def to_dict(self) -> dict: }, "position_sizing": { "share_type": self.share_type.value, + "share_rounding": self.share_rounding.value, }, "commission": { "model": self.commission_type.value, @@ -1021,7 +1030,7 @@ def from_dict( "initial_hwm_source", "trail_stop_timing", }, - "position_sizing": {"share_type"}, + "position_sizing": {"share_type", "share_rounding"}, "commission": {"model", "rate", "per_share", "per_trade", "minimum"}, "slippage": { "model", @@ -1157,6 +1166,7 @@ def from_dict( trail_stop_timing=TrailStopTiming(stops_cfg.get("trail_stop_timing", "lagged")), # Sizing share_type=ShareType(sizing_cfg.get("share_type", "integer")), + share_rounding=ShareRounding(sizing_cfg.get("share_rounding", "nearest")), # Commission commission_type=CommissionType(comm_cfg.get("model", "none")), commission_rate=comm_cfg.get("rate", 0.0), diff --git a/src/ml4t/backtest/execution/rebalancer.py b/src/ml4t/backtest/execution/rebalancer.py index 813c129a..6903cc77 100644 --- a/src/ml4t/backtest/execution/rebalancer.py +++ b/src/ml4t/backtest/execution/rebalancer.py @@ -30,7 +30,13 @@ from ml4t.specs.market_data import TimestampSemantics -from ..config import DataFrequency, ExecutionPrice, RebalanceMode, ShareType +from ..config import ( + DataFrequency, + ExecutionPrice, + RebalanceMode, + ShareRounding, + ShareType, +) from ..core.shared import SubmitOrderOptions from ..types import OrderSide from .schedule import RebalanceSchedule, _OnlineRebalanceEvaluator @@ -105,6 +111,7 @@ class RebalanceConfig: cancel_before_rebalance: bool = True account_for_pending: bool = True rebalance_mode: RebalanceMode = RebalanceMode.SNAPSHOT + share_rounding: ShareRounding | str = ShareRounding.NEAREST schedule: RebalanceSchedule | None = None calendar: str | None = None timezone: str | None = None @@ -113,6 +120,7 @@ class RebalanceConfig: timestamp_semantics: TimestampSemantics | str | None = None def __post_init__(self) -> None: + self.share_rounding = ShareRounding(self.share_rounding) if self.session_start_time is None: return from ..sessions import _validate_session_start_time @@ -411,9 +419,7 @@ def _process_asset( # Compute shares (account for contract multiplier for futures) multiplier = broker.get_multiplier(asset) - shares = delta_value / (price * multiplier) - - shares = self._quantize_shares(shares, broker) + shares = self._quantize_shares(delta_value / (price * multiplier), broker) if shares == 0: return None @@ -449,6 +455,8 @@ def _quantize_shares(self, shares: float, broker: Broker) -> float: return int(rounded_lots) if use_fractional: return shares + if self.config.share_rounding is ShareRounding.TRUNCATE: + return int(shares) rounded = math.copysign(math.floor(abs(shares) + 0.5), shares) return int(rounded) diff --git a/src/ml4t/backtest/profiles.py b/src/ml4t/backtest/profiles.py index d11f8740..29794e76 100644 --- a/src/ml4t/backtest/profiles.py +++ b/src/ml4t/backtest/profiles.py @@ -69,6 +69,7 @@ }, "position_sizing": { "share_type": "integer", + "share_rounding": "truncate", }, "commission": { "model": "none", diff --git a/tests/compatibility/snapshots/v0.1.json b/tests/compatibility/snapshots/v0.1.json index a84f95a6..59ef3404 100644 --- a/tests/compatibility/snapshots/v0.1.json +++ b/tests/compatibility/snapshots/v0.1.json @@ -167,6 +167,15 @@ "keyword_only": false, "name": "share_type" }, + { + "annotation": "ShareRounding", + "default": { + "enum": "ml4t.backtest.config.ShareRounding.NEAREST", + "value": "nearest" + }, + "keyword_only": false, + "name": "share_rounding" + }, { "annotation": "CommissionType", "default": { @@ -535,6 +544,7 @@ "skip_cash_validation": false }, "position_sizing": { + "share_rounding": "nearest", "share_type": "integer" }, "result": { @@ -821,6 +831,16 @@ "value": "hybrid" } ], + "ml4t.backtest.config.ShareRounding": [ + { + "name": "NEAREST", + "value": "nearest" + }, + { + "name": "TRUNCATE", + "value": "truncate" + } + ], "ml4t.backtest.config.ShareType": [ { "name": "FRACTIONAL", @@ -1253,6 +1273,7 @@ "reject_on_insufficient_cash": true }, "position_sizing": { + "share_rounding": "truncate", "share_type": "integer" }, "slippage": { @@ -1299,6 +1320,7 @@ "reject_on_insufficient_cash": true }, "position_sizing": { + "share_rounding": "truncate", "share_type": "integer" }, "slippage": { @@ -2571,7 +2593,7 @@ }, "module": "ml4t.backtest.execution.rebalancer", "qualname": "RebalanceConfig", - "signature": "(min_trade_value: 'float' = 0.0, min_weight_change: 'float' = 0.0, allow_fractional: 'bool | None' = None, round_lots: 'bool' = False, lot_size: 'int' = 100, allow_short: 'bool' = False, max_single_weight: 'float' = 1.0, max_gross_leverage: 'float | None' = None, cancel_before_rebalance: 'bool' = True, account_for_pending: 'bool' = True, rebalance_mode: 'RebalanceMode' = , schedule: 'RebalanceSchedule | None' = None, calendar: 'str | None' = None, timezone: 'str | None' = None, session_start_time: 'str | None' = None, data_frequency: 'DataFrequency | str | None' = None, timestamp_semantics: 'TimestampSemantics | str | None' = None) -> None" + "signature": "(min_trade_value: 'float' = 0.0, min_weight_change: 'float' = 0.0, allow_fractional: 'bool | None' = None, round_lots: 'bool' = False, lot_size: 'int' = 100, allow_short: 'bool' = False, max_single_weight: 'float' = 1.0, max_gross_leverage: 'float | None' = None, cancel_before_rebalance: 'bool' = True, account_for_pending: 'bool' = True, rebalance_mode: 'RebalanceMode' = , share_rounding: 'ShareRounding | str' = , schedule: 'RebalanceSchedule | None' = None, calendar: 'str | None' = None, timezone: 'str | None' = None, session_start_time: 'str | None' = None, data_frequency: 'DataFrequency | str | None' = None, timestamp_semantics: 'TimestampSemantics | str | None' = None) -> None" }, "ml4t.backtest.execution.rebalancer:TargetWeightExecutor": { "kind": "class", @@ -2643,7 +2665,7 @@ }, "module": "ml4t.backtest.execution.rebalancer", "qualname": "RebalanceConfig", - "signature": "(min_trade_value: 'float' = 0.0, min_weight_change: 'float' = 0.0, allow_fractional: 'bool | None' = None, round_lots: 'bool' = False, lot_size: 'int' = 100, allow_short: 'bool' = False, max_single_weight: 'float' = 1.0, max_gross_leverage: 'float | None' = None, cancel_before_rebalance: 'bool' = True, account_for_pending: 'bool' = True, rebalance_mode: 'RebalanceMode' = , schedule: 'RebalanceSchedule | None' = None, calendar: 'str | None' = None, timezone: 'str | None' = None, session_start_time: 'str | None' = None, data_frequency: 'DataFrequency | str | None' = None, timestamp_semantics: 'TimestampSemantics | str | None' = None) -> None" + "signature": "(min_trade_value: 'float' = 0.0, min_weight_change: 'float' = 0.0, allow_fractional: 'bool | None' = None, round_lots: 'bool' = False, lot_size: 'int' = 100, allow_short: 'bool' = False, max_single_weight: 'float' = 1.0, max_gross_leverage: 'float | None' = None, cancel_before_rebalance: 'bool' = True, account_for_pending: 'bool' = True, rebalance_mode: 'RebalanceMode' = , share_rounding: 'ShareRounding | str' = , schedule: 'RebalanceSchedule | None' = None, calendar: 'str | None' = None, timezone: 'str | None' = None, session_start_time: 'str | None' = None, data_frequency: 'DataFrequency | str | None' = None, timestamp_semantics: 'TimestampSemantics | str | None' = None) -> None" }, "ml4t.backtest.execution:SquareRootImpact": { "kind": "class", @@ -3974,7 +3996,7 @@ }, "module": "ml4t.backtest.execution.rebalancer", "qualname": "RebalanceConfig", - "signature": "(min_trade_value: 'float' = 0.0, min_weight_change: 'float' = 0.0, allow_fractional: 'bool | None' = None, round_lots: 'bool' = False, lot_size: 'int' = 100, allow_short: 'bool' = False, max_single_weight: 'float' = 1.0, max_gross_leverage: 'float | None' = None, cancel_before_rebalance: 'bool' = True, account_for_pending: 'bool' = True, rebalance_mode: 'RebalanceMode' = , schedule: 'RebalanceSchedule | None' = None, calendar: 'str | None' = None, timezone: 'str | None' = None, session_start_time: 'str | None' = None, data_frequency: 'DataFrequency | str | None' = None, timestamp_semantics: 'TimestampSemantics | str | None' = None) -> None" + "signature": "(min_trade_value: 'float' = 0.0, min_weight_change: 'float' = 0.0, allow_fractional: 'bool | None' = None, round_lots: 'bool' = False, lot_size: 'int' = 100, allow_short: 'bool' = False, max_single_weight: 'float' = 1.0, max_gross_leverage: 'float | None' = None, cancel_before_rebalance: 'bool' = True, account_for_pending: 'bool' = True, rebalance_mode: 'RebalanceMode' = , share_rounding: 'ShareRounding | str' = , schedule: 'RebalanceSchedule | None' = None, calendar: 'str | None' = None, timezone: 'str | None' = None, session_start_time: 'str | None' = None, data_frequency: 'DataFrequency | str | None' = None, timestamp_semantics: 'TimestampSemantics | str | None' = None) -> None" }, "ml4t.backtest:RebalanceSchedule": { "kind": "class", diff --git a/tests/contracts/test_python_support_policy.py b/tests/contracts/test_python_support_policy.py index b11c79e0..c62af951 100644 --- a/tests/contracts/test_python_support_policy.py +++ b/tests/contracts/test_python_support_policy.py @@ -103,7 +103,7 @@ def test_minimum_dependency_matrix_proves_declared_lower_bounds() -> None: "pandas>=2.3.3; python_version < '3.15'", "numpy>=2.3.2", "PyYAML>=6.0.3", - "pandas-market-calendars>=5.2.4", + "pandas-market-calendars>=5.4.0", } specs_dependencies = [ requirement diff --git a/tests/contracts/test_real_strategy_applicability.py b/tests/contracts/test_real_strategy_applicability.py new file mode 100644 index 00000000..20876e03 --- /dev/null +++ b/tests/contracts/test_real_strategy_applicability.py @@ -0,0 +1,25 @@ +"""Contracts for the bounded real-strategy framework matrix.""" + +from __future__ import annotations + +import tomllib +from itertools import product +from pathlib import Path + + +def test_every_selected_case_framework_pair_has_one_disposition() -> None: + path = Path(__file__).parents[2] / "validation" / "real_strategy_applicability.toml" + payload = tomllib.loads(path.read_text(encoding="utf-8")) + metadata = payload["metadata"] + pairs = payload["pair"] + + expected = set(product(metadata["case_studies"], metadata["frameworks"])) + actual = {(pair["case_study"], pair["framework"]) for pair in pairs} + + assert len(pairs) == len(actual) + assert actual == expected + assert {pair["status"] for pair in pairs} == {"required", "unsupported"} + assert sum(pair["status"] == "required" for pair in pairs) == 8 + assert sum(pair["status"] == "unsupported" for pair in pairs) == 7 + assert all(pair["native_contract"] for pair in pairs) + assert all(pair["source"].startswith("https://") for pair in pairs) diff --git a/tests/contracts/test_real_strategy_runner.py b/tests/contracts/test_real_strategy_runner.py new file mode 100644 index 00000000..053a9726 --- /dev/null +++ b/tests/contracts/test_real_strategy_runner.py @@ -0,0 +1,130 @@ +"""Behavior contracts for the frozen real-strategy ML4T runner.""" + +from __future__ import annotations + +import importlib.util +from datetime import UTC, datetime +from pathlib import Path +from types import SimpleNamespace + +import polars as pl + + +def _load_runner(): + path = Path(__file__).parents[2] / "validation" / "real_strategy_runner.py" + spec = importlib.util.spec_from_file_location("ml4t_real_strategy_runner", path) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def _load_evidence(): + path = Path(__file__).parents[2] / "validation" / "real_strategy_evidence.py" + spec = importlib.util.spec_from_file_location("ml4t_real_strategy_evidence", path) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +class _Broker: + def __init__(self) -> None: + self.cash = 1_000.0 + self.positions = {"PERP": SimpleNamespace(quantity=2.0, multiplier=3.0)} + + @staticmethod + def get_mark_price(_symbol: str, *, quantity: float) -> float: + assert quantity == 2.0 + return 10.0 + + +def test_lean_funding_schedule_skips_entry_boundary_then_settles() -> None: + runner = _load_runner() + funding = pl.DataFrame( + { + "symbol": ["PERP", "PERP"], + "timestamp": [ + datetime(2024, 1, 1, 8, tzinfo=UTC), + datetime(2024, 1, 1, 16, tzinfo=UTC), + ], + "funding_rate": [0.01, 0.02], + } + ) + ledger = runner.FundingSettlementLedger(funding, skip_first_after_entry=True) + broker = _Broker() + + ledger.settle(datetime(2024, 1, 1, 8, tzinfo=UTC), broker) + assert broker.cash == 1_000.0 + + ledger.settle(datetime(2024, 1, 1, 16, tzinfo=UTC), broker) + assert broker.cash == 998.8 + assert ledger.metrics() == { + "funding_pnl": -1.2, + "funding_events": 1, + "funding_settlements": 2, + } + + +def test_lean_funding_schedule_observes_flat_positions_between_settlements() -> None: + runner = _load_runner() + funding = pl.DataFrame( + { + "symbol": ["PERP", "PERP"], + "timestamp": [ + datetime(2024, 1, 1, 8, tzinfo=UTC), + datetime(2024, 1, 1, 16, tzinfo=UTC), + ], + "funding_rate": [0.01, 0.02], + } + ) + ledger = runner.FundingSettlementLedger(funding, skip_first_after_entry=True) + broker = _Broker() + + ledger.settle(datetime(2024, 1, 1, 8, tzinfo=UTC), broker) + broker.positions["PERP"].quantity = 0.0 + ledger.settle(datetime(2024, 1, 1, 12, tzinfo=UTC), broker) + broker.positions["PERP"].quantity = 2.0 + ledger.settle(datetime(2024, 1, 1, 16, tzinfo=UTC), broker) + + assert broker.cash == 1_000.0 + assert ledger.metrics()["funding_events"] == 0 + + +def test_lean_comparison_preserves_margin_account_and_disables_equity_costs() -> None: + runner = _load_runner() + source = { + "account": {"allow_short_selling": True, "allow_leverage": False}, + "cash": {"initial": 125_000.0}, + "calendar": {"calendar": "NYSE", "data_frequency": "daily"}, + "feed": {"calendar": "NYSE", "data_frequency": "daily"}, + "commission": {"model": "percentage", "rate": 0.001}, + "slippage": {"model": "percentage", "rate": 0.001}, + "orders": {"rebalance_headroom_pct": 0.99}, + "metadata": {}, + } + + config = runner._comparison_config({"backtest_config": source}, "lean") + + assert config.allow_leverage is True + assert config.commission_rate == 0.0 + assert config.slippage_rate == 0.0 + assert config.rebalance_headroom_pct == 1.0 + + +def test_real_strategy_comparator_detects_one_quantum_mutation() -> None: + evidence = _load_evidence() + framework = [{"timestamp": "2024-01-01", "price": "10.00000000"}] + mutated = [{"timestamp": "2024-01-01", "price": "10.00000001"}] + + result = evidence.compare_records(framework, mutated, numeric_fields=("price",)) + + assert result["passed"] is False + assert result["first_divergence"] == { + "kind": "record", + "index": 0, + "field": "price", + "framework": framework[0], + "ml4t": mutated[0], + "canonical_gap": "0.00000001", + } diff --git a/tests/contracts/test_static_analysis_policy.py b/tests/contracts/test_static_analysis_policy.py index fdac71f1..e886b39e 100644 --- a/tests/contracts/test_static_analysis_policy.py +++ b/tests/contracts/test_static_analysis_policy.py @@ -104,6 +104,9 @@ def test_ci_checks_every_release_validation_script() -> None: "validation/frameworks/vectorbt_oss.py", "validation/frameworks/vectorbt_pro.py", "validation/frameworks/zipline.py", + "validation/real_strategy_backtrader.py", + "validation/real_strategy_vectorbt.py", + "validation/real_strategy_zipline.py", } candidate_files = subprocess.run( [ diff --git a/tests/execution/test_rebalancer.py b/tests/execution/test_rebalancer.py index 8990c828..639f3bff 100644 --- a/tests/execution/test_rebalancer.py +++ b/tests/execution/test_rebalancer.py @@ -9,7 +9,11 @@ Broker, OrderSide, ) -from ml4t.backtest.config import ExecutionPrice, RebalanceMode +from ml4t.backtest.config import ( + ExecutionPrice, + RebalanceMode, + ShareRounding, +) from ml4t.backtest.execution.rebalancer import RebalanceConfig, TargetWeightExecutor from ml4t.backtest.execution.schedule import RebalanceSchedule, resolve_rebalance_timestamps from ml4t.backtest.models import NoCommission, NoSlippage @@ -266,6 +270,19 @@ def test_fractional_shares(self, broker, sample_data): # Should be approximately 66.67 assert 66.6 < orders[0].quantity < 66.7 + def test_truncation_matches_target_percent_brokers(self, broker, sample_data): + executor = TargetWeightExecutor( + config=RebalanceConfig( + allow_fractional=False, + share_rounding=ShareRounding.TRUNCATE, + ) + ) + + orders = executor.execute({"AAPL": 0.1}, sample_data, broker) + + assert len(orders) == 1 + assert orders[0].quantity == 66 + def test_lot_rounding(self, broker, sample_data): """Test rounding to lot sizes.""" executor = TargetWeightExecutor(config=RebalanceConfig(round_lots=True, lot_size=100)) diff --git a/tests/test_config_wiring.py b/tests/test_config_wiring.py index b7a629d3..03f8fa4e 100644 --- a/tests/test_config_wiring.py +++ b/tests/test_config_wiring.py @@ -588,6 +588,7 @@ def test_backtrader_strict_profile_enables_submission_precheck(self): config = BacktestConfig.from_preset("backtrader_strict") assert config.next_bar_submission_precheck is True assert config.next_bar_simple_cash_check is True + assert config.share_rounding.value == "truncate" def test_lean_profile_uses_margin_next_bar_open(self): config = BacktestConfig.from_preset("lean") diff --git a/validation/behavior_coverage.toml b/validation/behavior_coverage.toml index 3edfaf14..8b1ed6c6 100644 --- a/validation/behavior_coverage.toml +++ b/validation/behavior_coverage.toml @@ -98,7 +98,7 @@ published = true [[framework.backtrader]] name = "sizing" -fields = ["position_sizing.share_type"] +fields = ["position_sizing.share_type", "position_sizing.share_rounding"] native_checks = ["integer_target_percent"] scenarios = [] published = false diff --git a/validation/real_strategy_applicability.toml b/validation/real_strategy_applicability.toml new file mode 100644 index 00000000..70d8ce80 --- /dev/null +++ b/validation/real_strategy_applicability.toml @@ -0,0 +1,109 @@ +[metadata] +schema_version = 1 +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +case_studies = ["etfs", "cme_futures", "crypto_perps_funding"] + +[[pair]] +case_study = "etfs" +framework = "vectorbt_pro" +status = "required" +native_contract = "multi-asset target allocation and cash sharing" +source = "https://vectorbt.pro/features/portfolio/" + +[[pair]] +case_study = "etfs" +framework = "vectorbt_oss" +status = "required" +native_contract = "multi-asset target allocation and cash sharing" +source = "https://vectorbt.dev/api/portfolio/base/" + +[[pair]] +case_study = "etfs" +framework = "backtrader" +status = "required" +native_contract = "multi-data target-percent orders" +source = "https://www.backtrader.com/docu/order_target/order_target/" + +[[pair]] +case_study = "etfs" +framework = "zipline" +status = "required" +native_contract = "equity assets and target-percent orders" +source = "https://zipline.ml4trading.io/api-reference.html" + +[[pair]] +case_study = "etfs" +framework = "lean" +status = "required" +native_contract = "equity margin accounts and market-on-open orders" +source = "https://www.quantconnect.com/docs/v2/writing-algorithms/trading-and-orders/position-sizing" + +[[pair]] +case_study = "cme_futures" +framework = "vectorbt_pro" +status = "required" +native_contract = "contract multipliers and eager leverage on target-percent orders" +source = "https://vectorbt.pro/features/portfolio/" + +[[pair]] +case_study = "cme_futures" +framework = "vectorbt_oss" +status = "unsupported" +native_contract = "no native futures contract multiplier and margin-account model" +source = "https://vectorbt.dev/api/portfolio/base/" + +[[pair]] +case_study = "cme_futures" +framework = "backtrader" +status = "required" +native_contract = "futures-like commission scheme with margin and contract multiplier" +source = "https://www.backtrader.com/docu/commission-schemes/commission-schemes/" + +[[pair]] +case_study = "cme_futures" +framework = "zipline" +status = "unsupported" +native_contract = "the frozen workload has continuous root series but no dated contract chain or roll map" +source = "https://zipline.ml4trading.io/api-reference.html" + +[[pair]] +case_study = "cme_futures" +framework = "lean" +status = "unsupported" +native_contract = "the frozen workload has continuous root series but no dated contract chain or roll map" +source = "https://www.quantconnect.com/docs/v2/writing-algorithms/securities/asset-classes/futures" + +[[pair]] +case_study = "crypto_perps_funding" +framework = "vectorbt_pro" +status = "unsupported" +native_contract = "no native perpetual-futures funding and margin-account model" +source = "https://vectorbt.pro/features/portfolio/" + +[[pair]] +case_study = "crypto_perps_funding" +framework = "vectorbt_oss" +status = "unsupported" +native_contract = "no native perpetual-futures funding and margin-account model" +source = "https://vectorbt.dev/api/portfolio/base/" + +[[pair]] +case_study = "crypto_perps_funding" +framework = "backtrader" +status = "unsupported" +native_contract = "no native perpetual-futures funding model" +source = "https://www.backtrader.com/docu/commission-schemes/commission-schemes/" + +[[pair]] +case_study = "crypto_perps_funding" +framework = "zipline" +status = "unsupported" +native_contract = "no crypto perpetual-futures asset and funding model" +source = "https://zipline.ml4trading.io/api-reference.html" + +[[pair]] +case_study = "crypto_perps_funding" +framework = "lean" +status = "required" +native_contract = "CryptoFuture securities with scheduled funding debits and credits" +source = "https://www.quantconnect.com/docs/v2/writing-algorithms/reality-modeling/margin-interest-rate/supported-models" diff --git a/validation/real_strategy_backtrader.py b/validation/real_strategy_backtrader.py new file mode 100644 index 00000000..2b6d3ae3 --- /dev/null +++ b/validation/real_strategy_backtrader.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python3 +"""Run a frozen real target-allocation workload with Backtrader.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import tempfile +import time +from pathlib import Path +from typing import Any + +import backtrader as bt +import pandas as pd +import polars as pl + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _target_map(targets: pl.DataFrame) -> dict[pd.Timestamp, dict[str, float]]: + result: dict[pd.Timestamp, dict[str, float]] = {} + for row in targets.sort("timestamp", "symbol").iter_rows(named=True): + result.setdefault(pd.Timestamp(row["timestamp"]), {})[str(row["symbol"])] = float( + row["weight"] + ) + return result + + +class FrozenTargetStrategy(bt.Strategy): + params = (("targets", None), ("contracts", None)) + + def __init__(self) -> None: + self.fills: list[dict[str, Any]] = [] + self.equity: list[dict[str, Any]] = [] + self.rejections: list[dict[str, Any]] = [] + + def prenext(self) -> None: + self.next() + + def nextstart(self) -> None: + self.next() + + def next(self) -> None: + timestamp = pd.Timestamp(self.datetime.datetime(0)) + self.equity.append( + {"timestamp": timestamp.to_pydatetime(), "equity": self.broker.getvalue()} + ) + requested = self.p.targets.get(timestamp) + if requested is None: + return + available = { + data._name: weight + for data in self.datas + if data._name in requested and pd.Timestamp(data.datetime.datetime(0)) == timestamp + for weight in (requested[data._name],) + } + if not available: + return + value = self.broker.getvalue() + current = { + data._name: ( + self.getposition(data).size + * float(data.close[0]) + * float(self.p.contracts.get(data._name, {}).get("multiplier", 1.0)) + / value + ) + for data in self.datas + if self.getposition(data).size != 0 + } + reductions = sorted( + symbol for symbol, weight in available.items() if weight < current.get(symbol, 0.0) + ) + omitted = sorted(symbol for symbol in current if symbol not in available) + increases = sorted(symbol for symbol in available if symbol not in reductions) + by_name = {data._name: data for data in self.datas} + for symbol in reductions: + self._submit_target(by_name[symbol], available[symbol], current, value) + for symbol in omitted: + self.order_target_size(data=by_name[symbol], target=0) + for symbol in increases: + self._submit_target(by_name[symbol], available[symbol], current, value) + + def _submit_target( + self, data, target_weight: float, current_weights: dict[str, float], value: float + ) -> None: + contract = self.p.contracts.get(data._name) + if contract is None: + self.order_target_percent(data=data, target=target_weight) + return + price = float(data.close[0]) + multiplier = float(contract["multiplier"]) + delta = int( + (target_weight - current_weights.get(data._name, 0.0)) * value / (price * multiplier) + ) + target_size = self.getposition(data).size + delta + self.order_target_size(data=data, target=target_size) + + def notify_order(self, order) -> None: + if order.status == order.Completed: + self.fills.append( + { + "timestamp": bt.num2date(order.executed.dt).replace(tzinfo=None), + "asset": order.data._name, + "side": "buy" if order.isbuy() else "sell", + "quantity": abs(float(order.executed.size)), + "price": float(order.executed.price), + "commission": abs(float(order.executed.comm)), + } + ) + elif order.status in {order.Canceled, order.Margin, order.Rejected}: + self.rejections.append( + { + "timestamp": bt.num2date(order.created.dt).replace(tzinfo=None), + "asset": order.data._name, + "status": order.getstatusname(), + "requested_quantity": abs(float(order.created.size)), + } + ) + + +def run(bundle: Path) -> tuple[dict[str, Any], pl.DataFrame, pl.DataFrame, pl.DataFrame]: + manifest = json.loads((bundle / "manifest.json").read_text(encoding="utf-8")) + spec = json.loads((bundle / "spec.json").read_text(encoding="utf-8")) + market = pl.read_parquet(bundle / "market.parquet") + targets = _target_map(pl.read_parquet(bundle / "targets.parquet")) + contracts = ( + json.loads((bundle / "contracts.json").read_text(encoding="utf-8")) + if (bundle / "contracts.json").is_file() + else {} + ) + cerebro = bt.Cerebro(stdstats=False) + initial_cash = float(spec["backtest_config"]["cash"]["initial"]) + cerebro.broker.setcash(initial_cash) + cerebro.broker.setcommission(commission=0.0) + for symbol in market["symbol"].unique().sort().to_list(): + selected = market.filter(pl.col("symbol") == symbol).select( + "timestamp", "open", "high", "low", "close", "volume" + ) + frame = pd.DataFrame(selected.to_dict(as_series=False)).set_index("timestamp") + cerebro.adddata(bt.feeds.PandasData(dataname=frame), name=symbol) + contract = contracts.get(symbol) + if contract is not None: + initial_margin, _ = contract["margin_pct"] + fixed_margin = ( + float(frame["close"].iloc[0]) + * float(contract["multiplier"]) + * float(initial_margin) + ) + cerebro.broker.addcommissioninfo( + bt.CommInfoBase( + commission=0.0, + mult=float(contract["multiplier"]), + margin=fixed_margin, + automargin=False, + commtype=bt.CommInfoBase.COMM_FIXED, + stocklike=False, + ), + name=symbol, + ) + cerebro.addstrategy(FrozenTargetStrategy, targets=targets, contracts=contracts) + started = time.perf_counter() + strategy = cerebro.run()[0] + engine_seconds = time.perf_counter() - started + fills = pl.DataFrame(strategy.fills) + equity = pl.DataFrame(strategy.equity) + evidence = { + "schema_version": 1, + "case_study": manifest["case_study"], + "framework": "backtrader", + "comparison_profile": "backtrader_strict", + "comparison_costs": "disabled", + "comparison_position_rules": "disabled", + "input_bundle_sha256": manifest["bundle_sha256"], + "engine_seconds": engine_seconds, + "final_value": float(cerebro.broker.getvalue()), + "num_fills": fills.height, + "num_rejections": len(strategy.rejections), + } + rejections = pl.DataFrame( + strategy.rejections, + schema={ + "timestamp": pl.Datetime("us"), + "asset": pl.String, + "status": pl.String, + "requested_quantity": pl.Float64, + }, + ) + return evidence, fills, equity, rejections + + +def write_evidence( + output: Path, + evidence: dict[str, Any], + fills: pl.DataFrame, + equity: pl.DataFrame, + rejections: pl.DataFrame, +) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) + try: + fills.write_parquet(staging / "fills.parquet", compression="zstd", statistics=True) + equity.write_parquet(staging / "equity.parquet", compression="zstd", statistics=True) + rejections.write_parquet( + staging / "rejected_orders.parquet", compression="zstd", statistics=True + ) + evidence["files"] = { + path.name: {"sha256": _sha256(path), "bytes": path.stat().st_size} + for path in sorted(staging.iterdir()) + } + (staging / "manifest.json").write_text( + json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if output.exists(): + raise FileExistsError(f"Evidence output already exists: {output}") + os.replace(staging, output) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + evidence, fills, equity, rejections = run(args.bundle.resolve()) + write_evidence(args.output.resolve(), evidence, fills, equity, rejections) + print( + f"{evidence['case_study']}: {evidence['num_fills']:,} fills, " + f"{evidence['engine_seconds']:.6f}s engine time" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/real_strategy_evidence.py b/validation/real_strategy_evidence.py new file mode 100644 index 00000000..b61d7754 --- /dev/null +++ b/validation/real_strategy_evidence.py @@ -0,0 +1,446 @@ +#!/usr/bin/env python3 +"""Build retained exact-comparison evidence for frozen real strategies.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import platform +import subprocess +import sys +import tempfile +import tomllib +from datetime import UTC, date, datetime +from decimal import ROUND_HALF_EVEN, Decimal +from pathlib import Path +from typing import Any + +import polars as pl + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +VALIDATION_DIR = PROJECT_ROOT / "validation" +CANONICAL_QUANTUM = Decimal("0.00000001") +PAIR_PROFILES = { + ("etfs", "vectorbt_pro"): "vectorbt_strict", + ("etfs", "vectorbt_oss"): "vectorbt_oss_strict", + ("etfs", "backtrader"): "backtrader_strict", + ("etfs", "zipline"): "zipline_strict", + ("etfs", "lean"): "lean", + ("cme_futures", "vectorbt_pro"): "vectorbt_strict", + ("cme_futures", "backtrader"): "backtrader_strict", + ("crypto_perps_funding", "lean"): "lean_crypto_future", +} + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _json_digest(value: object) -> str: + payload = json.dumps(value, sort_keys=True, separators=(",", ":"), default=str) + return hashlib.sha256(payload.encode()).hexdigest() + + +def _tree_digest(root: Path) -> str: + digest = hashlib.sha256() + for path in sorted(root.rglob("*.py")): + digest.update(path.relative_to(root).as_posix().encode()) + digest.update(b"\0") + digest.update(path.read_bytes()) + digest.update(b"\0") + return digest.hexdigest() + + +def _git_identity(root: Path) -> dict[str, object]: + commit = subprocess.run( + ["git", "rev-parse", "HEAD"], cwd=root, check=True, capture_output=True, text=True + ).stdout.strip() + status = subprocess.run( + ["git", "status", "--porcelain", "--untracked-files=no"], + cwd=root, + check=True, + capture_output=True, + text=True, + ).stdout + return {"commit": commit, "dirty": bool(status.strip())} + + +def _number_text(value: object) -> str: + return format(Decimal(str(value)), "f") + + +def _canonical_gap(framework: str, ml4t: str) -> Decimal: + return abs(Decimal(framework) - Decimal(ml4t)).quantize(CANONICAL_QUANTUM, ROUND_HALF_EVEN) + + +def _canonical_timestamp(value: object, *, intraday: bool) -> str: + if isinstance(value, datetime): + return value.isoformat(timespec="seconds") if intraday else value.date().isoformat() + if isinstance(value, date): + return value.isoformat() + parsed = datetime.fromisoformat(str(value).replace("Z", "+00:00")) + return parsed.isoformat(timespec="seconds") if intraday else parsed.date().isoformat() + + +def _fill_records(frame: pl.DataFrame, *, intraday: bool) -> list[dict[str, str]]: + records = [ + { + "timestamp": _canonical_timestamp(row["timestamp"], intraday=intraday), + "asset": str(row["asset"]), + "side": str(row["side"]).lower(), + "quantity": _number_text(row["quantity"]), + "price": _number_text(row["price"]), + "commission": _number_text(row["commission"]), + } + for row in frame.iter_rows(named=True) + ] + return sorted( + records, + key=lambda row: ( + row["timestamp"], + row["asset"], + row["side"], + row["quantity"], + row["price"], + row["commission"], + ), + ) + + +def _value_records(frame: pl.DataFrame, *, field: str, intraday: bool) -> list[dict[str, str]]: + records = [ + { + "timestamp": _canonical_timestamp(row["timestamp"], intraday=intraday), + field: _number_text(row[field]), + } + for row in frame.select("timestamp", field).iter_rows(named=True) + ] + return sorted(records, key=lambda row: row["timestamp"]) + + +def _first_divergence( + framework_records: list[dict[str, str]], + ml4t_records: list[dict[str, str]], + *, + numeric_fields: tuple[str, ...], +) -> dict[str, object] | None: + if len(framework_records) != len(ml4t_records): + return { + "kind": "record_count", + "framework": len(framework_records), + "ml4t": len(ml4t_records), + } + for index, (framework, ml4t) in enumerate(zip(framework_records, ml4t_records, strict=True)): + fields = sorted(set(framework) | set(ml4t)) + for field in fields: + framework_value = framework.get(field) + ml4t_value = ml4t.get(field) + if field in numeric_fields and framework_value is not None and ml4t_value is not None: + differs = _canonical_gap(framework_value, ml4t_value) != 0 + else: + differs = framework_value != ml4t_value + if differs: + return { + "kind": "record", + "index": index, + "field": field, + "framework": framework, + "ml4t": ml4t, + "canonical_gap": ( + format(_canonical_gap(framework_value, ml4t_value), "f") + if field in numeric_fields + and framework_value is not None + and ml4t_value is not None + else None + ), + } + return None + + +def compare_records( + framework_records: list[dict[str, str]], + ml4t_records: list[dict[str, str]], + *, + numeric_fields: tuple[str, ...] = (), +) -> dict[str, object]: + """Compare complete canonical streams and retain the first divergence.""" + divergence = _first_divergence(framework_records, ml4t_records, numeric_fields=numeric_fields) + return { + "passed": divergence is None, + "framework_records": len(framework_records), + "ml4t_records": len(ml4t_records), + "framework_sha256": _json_digest(framework_records), + "ml4t_sha256": _json_digest(ml4t_records), + "first_divergence": divergence, + } + + +def _max_difference( + framework_records: list[dict[str, str]], + ml4t_records: list[dict[str, str]], + *, + fields: tuple[str, ...], +) -> str | None: + if len(framework_records) != len(ml4t_records): + return None + differences: list[Decimal] = [] + for framework, ml4t in zip(framework_records, ml4t_records, strict=True): + for field in fields: + if field in framework and field in ml4t: + differences.append(abs(Decimal(framework[field]) - Decimal(ml4t[field]))) + maximum = max(differences, default=Decimal(0)) + return format(maximum.quantize(CANONICAL_QUANTUM, ROUND_HALF_EVEN), "f") + + +def _align_shared_values( + framework_records: list[dict[str, str]], ml4t_records: list[dict[str, str]] +) -> tuple[list[dict[str, str]], list[dict[str, str]], dict[str, int]]: + framework_by_time = {record["timestamp"]: record for record in framework_records} + ml4t_by_time = {record["timestamp"]: record for record in ml4t_records} + shared = sorted(framework_by_time.keys() & ml4t_by_time.keys()) + return ( + [framework_by_time[timestamp] for timestamp in shared], + [ml4t_by_time[timestamp] for timestamp in shared], + { + "shared_timestamps": len(shared), + "framework_only_timestamps": len(framework_by_time.keys() - ml4t_by_time.keys()), + "ml4t_only_timestamps": len(ml4t_by_time.keys() - framework_by_time.keys()), + }, + ) + + +def _load_evidence(path: Path) -> tuple[dict[str, Any], dict[str, pl.DataFrame]]: + manifest = json.loads((path / "manifest.json").read_text(encoding="utf-8")) + frames: dict[str, pl.DataFrame] = {} + for name, identity in manifest["files"].items(): + artifact = path / name + if not artifact.is_file() or _sha256(artifact) != identity["sha256"]: + raise ValueError(f"Evidence identity mismatch: {artifact}") + if artifact.suffix == ".parquet": + frames[artifact.stem] = pl.read_parquet(artifact) + return manifest, frames + + +def _surface( + framework_records: list[dict[str, str]], + ml4t_records: list[dict[str, str]], + *, + numeric_fields: tuple[str, ...], +) -> dict[str, object]: + result = compare_records(framework_records, ml4t_records, numeric_fields=numeric_fields) + result["max_canonical_difference"] = _max_difference( + framework_records, ml4t_records, fields=numeric_fields + ) + return result + + +def _comparison_record( + *, case_study: str, framework: str, evidence_root: Path +) -> dict[str, object]: + external_path = evidence_root / case_study / framework + ml4t_path = evidence_root / case_study / f"ml4t_{framework}" + external, external_frames = _load_evidence(external_path) + ml4t, ml4t_frames = _load_evidence(ml4t_path) + expected_profile = PAIR_PROFILES[(case_study, framework)] + if external["input_bundle_sha256"] != ml4t["input_bundle_sha256"]: + raise ValueError(f"Input bundle differs for {case_study}/{framework}") + if external["comparison_profile"] != expected_profile: + raise ValueError(f"External profile differs for {case_study}/{framework}") + if ml4t["comparison_profile"] != expected_profile: + raise ValueError(f"ML4T profile differs for {case_study}/{framework}") + + intraday = case_study == "crypto_perps_funding" + external_fills = _fill_records(external_frames["fills"], intraday=intraday) + ml4t_fills = _fill_records(ml4t_frames["fills"], intraday=intraday) + external_equity = _value_records(external_frames["equity"], field="equity", intraday=intraday) + ml4t_equity = _value_records(ml4t_frames["equity"], field="equity", intraday=intraday) + external_equity, ml4t_equity, equity_coverage = _align_shared_values( + external_equity, ml4t_equity + ) + if not external_equity: + raise ValueError(f"No shared equity timestamps for {case_study}/{framework}") + terminal_external = [{"final_value": external_equity[-1]["equity"]}] + terminal_ml4t = [{"final_value": ml4t_equity[-1]["equity"]}] + surfaces: dict[str, dict[str, object]] = { + "fills": _surface( + external_fills, + ml4t_fills, + numeric_fields=("quantity", "price", "commission"), + ), + "equity": _surface(external_equity, ml4t_equity, numeric_fields=("equity",)), + "terminal": _surface(terminal_external, terminal_ml4t, numeric_fields=("final_value",)), + } + surfaces["equity"]["coverage"] = equity_coverage + if "num_rejections" in external and "num_rejections" in ml4t: + rejection_external = [{"count": str(external["num_rejections"])}] + rejection_ml4t = [{"count": str(ml4t["num_rejections"])}] + surfaces["rejection_count"] = _surface( + rejection_external, rejection_ml4t, numeric_fields=("count",) + ) + if case_study == "etfs" and framework == "lean": + external_cash = _value_records(external_frames["equity"], field="cash", intraday=intraday) + ml4t_cash = _value_records(ml4t_frames["portfolio_state"], field="cash", intraday=intraday) + external_cash, ml4t_cash, cash_coverage = _align_shared_values(external_cash, ml4t_cash) + surfaces["cash"] = _surface(external_cash, ml4t_cash, numeric_fields=("cash",)) + surfaces["cash"]["coverage"] = cash_coverage + + surface_values = list(surfaces.values()) + passed = all(bool(value["passed"]) for value in surface_values) + negative_control = [dict(record) for record in ml4t_fills] + if not negative_control: + raise ValueError(f"Negative control requires fills for {case_study}/{framework}") + negative_control[0]["price"] = format( + Decimal(negative_control[0]["price"]) + CANONICAL_QUANTUM, "f" + ) + detected = not compare_records( + external_fills, + negative_control, + numeric_fields=("quantity", "price", "commission"), + )["passed"] + if not detected: + raise RuntimeError(f"Negative control was not detected for {case_study}/{framework}") + return { + "case_study": case_study, + "framework": framework, + "status": "pass" if passed else "fail", + "input_bundle_sha256": external["input_bundle_sha256"], + "profile": expected_profile, + "engine_seconds": { + "framework": external["engine_seconds"], + "ml4t": ml4t["engine_seconds"], + "single_run_diagnostic_only": True, + }, + "surfaces": surfaces, + "negative_control": {"mutation": "first fill price + 0.00000001", "detected": detected}, + "excluded_surfaces": { + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "accepted_unfilled_orders": "not exposed by every native runner", + "positions": "not exposed in a common native record schema by every runner", + "closed_trades": "not a common native framework concept", + "cash": ( + "compared separately for LEAN equities" + if case_study == "etfs" and framework == "lean" + else "not exposed with common accounting semantics" + ), + }, + "evidence": { + "framework_manifest_sha256": _sha256(external_path / "manifest.json"), + "ml4t_manifest_sha256": _sha256(ml4t_path / "manifest.json"), + }, + } + + +def build_report(evidence_root: Path) -> dict[str, Any]: + """Build the complete required and unsupported real-strategy matrix.""" + applicability_path = VALIDATION_DIR / "real_strategy_applicability.toml" + applicability = tomllib.loads(applicability_path.read_text(encoding="utf-8")) + targets = tomllib.loads((VALIDATION_DIR / "framework_targets.toml").read_text()) + records: list[dict[str, object]] = [] + for pair in applicability["pair"]: + if pair["status"] == "required": + records.append( + _comparison_record( + case_study=pair["case_study"], + framework=pair["framework"], + evidence_root=evidence_root, + ) + ) + else: + records.append( + { + "case_study": pair["case_study"], + "framework": pair["framework"], + "status": "unsupported", + "reason": pair["native_contract"], + "source": pair["source"], + } + ) + required = [record for record in records if record["status"] != "unsupported"] + return { + "schema_version": 1, + "generated_at": datetime.now(UTC).isoformat(), + "scope": { + "case_studies": applicability["metadata"]["case_studies"], + "frameworks": applicability["metadata"]["frameworks"], + "required_pairs": len(required), + "unsupported_pairs": len(records) - len(required), + "real_strategy_equivalence_gate_passed": all( + record["status"] == "pass" for record in required + ), + }, + "comparison_policy": { + "canonical_quantum": format(CANONICAL_QUANTUM, "f"), + "rounding": "ROUND_HALF_EVEN", + "meaning": "zero numeric gap after canonical quantization, not bit identity", + "fill_order": "canonical timestamp, asset, side, quantity, price, commission", + "timestamp_domain": { + "etfs": "session date", + "cme_futures": "session date", + "crypto_perps_funding": "exact UTC event timestamp", + }, + }, + "provenance": { + "ml4t": { + **_git_identity(PROJECT_ROOT), + "engine_source_sha256": _tree_digest(PROJECT_ROOT / "src/ml4t/backtest"), + }, + "python": sys.version.split()[0], + "platform": platform.platform(), + "machine": platform.machine(), + "cpu_count": os.cpu_count(), + "applicability_sha256": _sha256(applicability_path), + "adapters": { + framework: _sha256(VALIDATION_DIR / f"real_strategy_{adapter}.py") + for framework, adapter in { + "vectorbt_pro": "vectorbt", + "vectorbt_oss": "vectorbt", + "backtrader": "backtrader", + "zipline": "zipline", + "lean_equity": "lean", + "lean_crypto": "lean_crypto", + "ml4t": "runner", + }.items() + }, + "frameworks": { + framework: targets["framework"][framework] + for framework in applicability["metadata"]["frameworks"] + }, + }, + "records": records, + } + + +def write_report(report: dict[str, Any], output: Path) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + descriptor, temporary_name = tempfile.mkstemp(prefix=f".{output.name}.", dir=output.parent) + temporary = Path(temporary_name) + try: + with os.fdopen(descriptor, "w", encoding="utf-8") as stream: + json.dump(report, stream, indent=2, sort_keys=True) + stream.write("\n") + os.replace(temporary, output) + finally: + temporary.unlink(missing_ok=True) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--evidence-root", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + report = build_report(args.evidence_root.resolve()) + write_report(report, args.output.resolve()) + required = [record for record in report["records"] if record["status"] != "unsupported"] + passed = sum(record["status"] == "pass" for record in required) + print(f"Real-strategy parity: {passed}/{len(required)} required pairs pass") + return 0 if passed == len(required) else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/real_strategy_lean.py b/validation/real_strategy_lean.py new file mode 100644 index 00000000..c11989e0 --- /dev/null +++ b/validation/real_strategy_lean.py @@ -0,0 +1,281 @@ +#!/usr/bin/env python3 +"""Run the frozen real ETF target-allocation workload with LEAN.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import os +import tempfile +import time +import tomllib +from datetime import datetime, timedelta +from pathlib import Path +from typing import Any, cast + +import pandas as pd +import polars as pl + +from ml4t.backtest._validation.lean_runner import ( + build_hashed_ticker_map, + copy_lean_artifacts, + export_lean_daily_data, + load_lean_artifacts, + make_lean_env, + resolve_lean_command, + run_lean_backtest, +) + +PROJECT_ROOT = Path(__file__).resolve().parents[1] + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _prepare_project(bundle: Path) -> tuple[Path, dict[str, Any]]: + manifest = json.loads((bundle / "manifest.json").read_text(encoding="utf-8")) + if manifest["case_study"] != "etfs": + raise ValueError("The LEAN adapter currently accepts the ETF comparison workload") + spec = json.loads((bundle / "spec.json").read_text(encoding="utf-8")) + market = pl.read_parquet(bundle / "market.parquet") + targets = pl.read_parquet(bundle / "targets.parquet") + symbols = market["symbol"].unique().sort().to_list() + asset_to_ticker = build_hashed_ticker_map("real_etfs", symbols) + ticker_to_asset = {ticker: asset for asset, ticker in asset_to_ticker.items()} + + workspace = PROJECT_ROOT / "validation" / "lean" / "workspace" + project = workspace / "real_strategy_etfs" + project.mkdir(parents=True, exist_ok=True) + (project / "backtests").mkdir(exist_ok=True) + for name in ("ml4t_daily_equity.csv", "ml4t_order_events.csv", "ml4t_runtime.json"): + path = project / name + if path.exists(): + path.unlink() + + (project / "config.json").write_text( + json.dumps( + { + "algorithm-language": "Python", + "parameters": {}, + "description": "Frozen ML4T ETF real-strategy parity workload", + }, + indent=2, + ) + + "\n", + encoding="utf-8", + ) + (project / "ml4t_symbol_map.json").write_text( + json.dumps(ticker_to_asset, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + (project / "symbols.csv").write_text( + "\n".join(asset_to_ticker[symbol] for symbol in symbols) + "\n", encoding="utf-8" + ) + target_rows = targets.with_columns( + pl.col("symbol").replace_strict(asset_to_ticker).alias("ticker"), + pl.col("timestamp").dt.strftime("%Y-%m-%d"), + ).select("timestamp", "ticker", "weight") + target_rows.write_csv(project / "targets.csv") + + prices_by_asset: dict[str, pd.DataFrame] = {} + for symbol in symbols: + selected = market.filter(pl.col("symbol") == symbol).select( + "timestamp", "open", "high", "low", "close", "volume" + ) + prices_by_asset[symbol] = pd.DataFrame(selected.to_dict(as_series=False)).set_index( + "timestamp" + ) + data_root = workspace / "data" / "equity" / "usa" + export_lean_daily_data( + data_root=data_root, + prices_by_asset=prices_by_asset, + asset_to_ticker=asset_to_ticker, + manifest_path=data_root / "real_strategy_etfs_manifest.json", + signature_payload={ + "bundle_sha256": manifest["bundle_sha256"], + "price_decimals": 4, + }, + ) + + first = pd.Timestamp(cast(datetime, market["timestamp"].min())).date() + last = pd.Timestamp(cast(datetime, market["timestamp"].max())).date() + timedelta(days=7) + initial_cash = float(spec["backtest_config"]["cash"]["initial"]) + main_code = f"""from AlgorithmImports import * + +import csv +import json +import math +import time +from pathlib import Path + + +class RealStrategyEtfs(QCAlgorithm): + def initialize(self): + self.set_start_date({first.year}, {first.month}, {first.day}) + self.set_end_date({last.year}, {last.month}, {last.day}) + self.set_cash({initial_cash}) + self.set_brokerage_model(BrokerageName.DEFAULT, AccountType.MARGIN) + base = Path(__file__).resolve().parent + self._equity_path = base / "ml4t_daily_equity.csv" + self._events_path = base / "ml4t_order_events.csv" + self._runtime_path = base / "ml4t_runtime.json" + self._targets = {{}} + with (base / "targets.csv").open(newline="") as stream: + for row in csv.DictReader(stream): + self._targets.setdefault(row["timestamp"], {{}})[row["ticker"]] = float(row["weight"]) + self._symbols = {{}} + for ticker in (base / "symbols.csv").read_text().splitlines(): + if not ticker: + continue + security = self.add_equity(ticker, Resolution.DAILY) + security.set_fee_model(ConstantFeeModel(0)) + security.set_slippage_model(ConstantSlippageModel(0)) + self._symbols[ticker] = security.symbol + with self._equity_path.open("w", newline="") as stream: + csv.writer(stream).writerow(["timestamp", "equity", "cash", "holdings_value"]) + with self._events_path.open("w", newline="") as stream: + csv.writer(stream).writerow(["timestamp", "symbol", "status", "direction", "fill_quantity", "fill_price", "fee", "message", "order_id"]) + self._started = time.perf_counter() + + def on_data(self, data: Slice): + key = self.time.strftime("%Y-%m-%d") + requested = self._targets.get(key) + if requested is not None: + active = set(requested) + active.update(ticker for ticker, symbol in self._symbols.items() if self.portfolio[symbol].quantity != 0) + value = float(self.portfolio.total_portfolio_value) + current = {{ticker: float(self.portfolio[symbol].quantity) * float(self.securities[symbol].price) / value for ticker, symbol in self._symbols.items() if self.portfolio[symbol].quantity != 0}} + reductions = sorted(ticker for ticker in active if requested.get(ticker, 0.0) < current.get(ticker, 0.0)) + increases = sorted(active - set(reductions)) + for ticker in reductions + increases: + symbol = self._symbols[ticker] + if symbol not in data.bars: + continue + price = float(data.bars[symbol].close) + raw = (requested.get(ticker, 0.0) - current.get(ticker, 0.0)) * value / price + delta = int(math.copysign(math.floor(abs(raw) + 0.5), raw)) + if delta: + self.market_on_open_order(symbol, delta) + with self._equity_path.open("a", newline="") as stream: + csv.writer(stream).writerow([key, float(self.portfolio.total_portfolio_value), float(self.portfolio.cash), float(self.portfolio.total_holdings_value)]) + + def on_order_event(self, event: OrderEvent): + fee = float(event.order_fee.value.amount) if event.order_fee and event.order_fee.value else 0.0 + with self._events_path.open("a", newline="") as stream: + csv.writer(stream).writerow([self.time.strftime("%Y-%m-%d %H:%M:%S"), event.symbol.value if event.symbol else "", str(event.status), str(event.direction), float(event.fill_quantity), float(event.fill_price), fee, str(event.message or "").replace("\\n", " "), int(event.order_id)]) + + def on_end_of_algorithm(self): + self._runtime_path.write_text(json.dumps({{"engine_seconds": time.perf_counter() - self._started}})) +""" + (project / "main.py").write_text(main_code, encoding="utf-8") + return project, { + "manifest": manifest, + "spec": spec, + "ticker_to_asset": ticker_to_asset, + } + + +def run(bundle: Path) -> tuple[dict[str, Any], pl.DataFrame, pl.DataFrame, pl.DataFrame]: + project, inputs = _prepare_project(bundle) + targets = tomllib.loads((PROJECT_ROOT / "validation/framework_targets.toml").read_text()) + image = targets["framework"]["lean"]["artifact"] + output_dir = project / "backtests" / str(time.time_ns()) + run_lean_backtest( + lean_cmd=resolve_lean_command(), + cwd=PROJECT_ROOT, + project_dir=project, + lean_config=PROJECT_ROOT / "validation/lean/workspace/lean.json", + output_dir=output_dir, + image=image, + env=make_lean_env(), + ) + names = [ + "ml4t_daily_equity.csv", + "ml4t_order_events.csv", + "ml4t_runtime.json", + "ml4t_symbol_map.json", + ] + copy_lean_artifacts(project, output_dir, names) + _, final_value, fills_pd, equity_pd, events_pd = load_lean_artifacts(output_dir) + if fills_pd is None or equity_pd is None or events_pd is None: + raise RuntimeError("LEAN did not produce the required comparison surfaces") + fills_pd = fills_pd.rename(columns={"fill_price": "price", "fee": "commission"}) + fills = pl.from_pandas( + fills_pd[["timestamp", "asset", "side", "quantity", "price", "commission"]] + ) + equity = pl.from_pandas(equity_pd[["timestamp", "equity", "cash", "holdings_value"]]) + runtime = json.loads((output_dir / "ml4t_runtime.json").read_text(encoding="utf-8")) + rejected = events_pd[events_pd["status"].astype(str).str.lower().isin({"invalid", "canceled"})] + evidence = { + "schema_version": 1, + "case_study": inputs["manifest"]["case_study"], + "framework": "lean", + "comparison_profile": "lean", + "comparison_costs": "disabled", + "comparison_position_rules": "disabled", + "input_bundle_sha256": inputs["manifest"]["bundle_sha256"], + "engine_seconds": float(runtime["engine_seconds"]), + "orchestration_seconds_excluded": None, + "final_value": final_value, + "num_fills": fills.height, + "num_rejections": len(rejected), + } + rejected_frame = pl.from_pandas( + rejected[["timestamp", "asset", "fill_quantity", "message", "order_id"]] + ) + return evidence, fills, equity, rejected_frame + + +def write_evidence( + output: Path, + evidence: dict[str, Any], + fills: pl.DataFrame, + equity: pl.DataFrame, + rejections: pl.DataFrame, +) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) + try: + fills.write_parquet(staging / "fills.parquet", compression="zstd", statistics=True) + equity.write_parquet(staging / "equity.parquet", compression="zstd", statistics=True) + rejections.write_parquet( + staging / "rejected_orders.parquet", compression="zstd", statistics=True + ) + evidence["files"] = { + path.name: {"sha256": _sha256(path), "bytes": path.stat().st_size} + for path in sorted(staging.iterdir()) + } + (staging / "manifest.json").write_text( + json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if output.exists(): + raise FileExistsError(f"Evidence output already exists: {output}") + os.replace(staging, output) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + evidence, fills, equity, rejections = run(args.bundle.resolve()) + write_evidence(args.output.resolve(), evidence, fills, equity, rejections) + print( + f"{evidence['case_study']}: {evidence['num_fills']:,} fills, " + f"{evidence['engine_seconds']:.6f}s engine time" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/real_strategy_lean_crypto.py b/validation/real_strategy_lean_crypto.py new file mode 100644 index 00000000..3176227d --- /dev/null +++ b/validation/real_strategy_lean_crypto.py @@ -0,0 +1,328 @@ +#!/usr/bin/env python3 +"""Run the frozen crypto-perpetual strategy with LEAN's Binance futures model.""" + +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import os +import tempfile +import time +import tomllib +import zipfile +from datetime import datetime, timedelta +from pathlib import Path +from typing import Any, cast + +import pandas as pd +import polars as pl + +from ml4t.backtest._validation.lean_runner import ( + copy_lean_artifacts, + load_lean_artifacts, + make_lean_env, + resolve_lean_command, + run_lean_backtest, +) + +PROJECT_ROOT = Path(__file__).resolve().parents[1] + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _symbol_properties(data_root: Path, symbols: list[str]) -> dict[str, dict[str, float]]: + path = data_root / "symbol-properties" / "symbol-properties-database.csv" + wanted = set(symbols) + found: dict[str, dict[str, float]] = {} + with path.open(newline="", encoding="utf-8-sig") as stream: + rows = csv.DictReader(line for line in stream if not line.startswith("#")) + for row in rows: + symbol = row["symbol"] + if row["market"] == "binance" and row["type"] == "cryptofuture" and symbol in wanted: + found[symbol] = { + "contract_multiplier": float(row["contract_multiplier"]), + "lot_size": float(row["lot_size"]), + "tick_size": float(row["minimum_price_variation"]), + } + missing = sorted(wanted - found.keys()) + if missing: + raise ValueError(f"LEAN symbol properties are missing: {missing}") + return found + + +def _export_data(bundle: Path, data_root: Path, symbols: list[str]) -> None: + market = pl.read_parquet(bundle / "market.parquet") + funding = pl.read_parquet(bundle / "funding.parquet") + hourly = data_root / "cryptofuture" / "binance" / "hour" + margin = data_root / "cryptofuture" / "binance" / "margin_interest" + hourly.mkdir(parents=True, exist_ok=True) + margin.mkdir(parents=True, exist_ok=True) + for symbol in symbols: + rows = market.filter(pl.col("symbol") == symbol).sort("timestamp").iter_rows(named=True) + trade_lines: list[str] = [] + quote_lines: list[str] = [] + for row in rows: + start = pd.Timestamp(row["timestamp"]) - timedelta(hours=1) + stamp = start.strftime("%Y%m%d %H:%M") + values = [float(row[name]) for name in ("open", "high", "low", "close")] + volume = max(1.0, float(row["volume"])) + o, h, low, close = values + trade_lines.append(f"{stamp},{o},{h},{low},{close},{volume}") + quote_lines.append( + f"{stamp},{o},{h},{low},{close},{volume},{o},{h},{low},{close},{volume}" + ) + ticker = symbol.lower() + for kind, lines in (("trade", trade_lines), ("quote", quote_lines)): + with zipfile.ZipFile( + hourly / f"{ticker}_{kind}.zip", "w", compression=zipfile.ZIP_DEFLATED + ) as archive: + archive.writestr(f"{ticker}.csv", "\n".join(lines)) + funding_rows = funding.filter(pl.col("symbol") == symbol).sort("timestamp") + margin_lines = [ + f"{pd.Timestamp(row['timestamp']).strftime('%Y%m%d %H:%M:%S')},{float(row['funding_rate']):.12f}" + for row in funding_rows.iter_rows(named=True) + ] + (margin / f"{ticker}.csv").write_text("\n".join(margin_lines) + "\n", encoding="utf-8") + + +def _prepare_project(bundle: Path) -> tuple[Path, dict[str, Any]]: + manifest = json.loads((bundle / "manifest.json").read_text(encoding="utf-8")) + if manifest["case_study"] != "crypto_perps_funding": + raise ValueError("This adapter accepts the crypto perpetual-funding workload") + spec = json.loads((bundle / "spec.json").read_text(encoding="utf-8")) + market = pl.read_parquet(bundle / "market.parquet") + targets = pl.read_parquet(bundle / "targets.parquet") + symbols = market["symbol"].unique().sort().to_list() + workspace = PROJECT_ROOT / "validation" / "lean" / "workspace" + project = workspace / "real_strategy_crypto_perps_funding" + project.mkdir(parents=True, exist_ok=True) + (project / "backtests").mkdir(exist_ok=True) + for name in ( + "ml4t_daily_equity.csv", + "ml4t_funding_observed.csv", + "ml4t_order_events.csv", + "ml4t_runtime.json", + ): + path = project / name + if path.exists(): + path.unlink() + (project / "config.json").write_text( + json.dumps( + { + "algorithm-language": "Python", + "parameters": {}, + "description": "Frozen ML4T crypto-perpetual real-strategy parity workload", + }, + indent=2, + ) + + "\n", + encoding="utf-8", + ) + (project / "symbols.csv").write_text("\n".join(symbols) + "\n", encoding="utf-8") + (project / "ml4t_symbol_map.json").write_text( + json.dumps({symbol: symbol for symbol in symbols}, indent=2, sort_keys=True) + "\n", + encoding="utf-8", + ) + targets.with_columns(pl.col("timestamp").dt.strftime("%Y-%m-%d %H:%M:%S")).write_csv( + project / "targets.csv" + ) + _export_data(bundle, workspace / "data", symbols) + properties = _symbol_properties(workspace / "data", symbols) + (project / "symbol_properties.json").write_text( + json.dumps(properties, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + + first = pd.Timestamp(cast(datetime, market["timestamp"].min())).date() + last = pd.Timestamp(cast(datetime, market["timestamp"].max())).date() + timedelta(days=1) + initial_cash = float(spec["backtest_config"]["cash"]["initial"]) + main_code = f"""from AlgorithmImports import * + +import csv +import json +import math +import time +from pathlib import Path + + +class RealStrategyCryptoPerpsFunding(QCAlgorithm): + def initialize(self): + self.set_start_date({first.year}, {first.month}, {first.day}) + self.set_end_date({last.year}, {last.month}, {last.day}) + self.set_time_zone(TimeZones.UTC) + self.set_brokerage_model(BrokerageName.BINANCE_FUTURES, AccountType.MARGIN) + self.set_account_currency("USDT", {initial_cash}) + base = Path(__file__).resolve().parent + self._equity_path = base / "ml4t_daily_equity.csv" + self._funding_path = base / "ml4t_funding_observed.csv" + self._events_path = base / "ml4t_order_events.csv" + self._runtime_path = base / "ml4t_runtime.json" + self._targets = {{}} + with (base / "targets.csv").open(newline="") as stream: + for row in csv.DictReader(stream): + self._targets.setdefault(row["timestamp"], {{}})[row["symbol"]] = float(row["weight"]) + self._properties = json.loads((base / "symbol_properties.json").read_text()) + self._symbols = {{}} + for ticker in (base / "symbols.csv").read_text().splitlines(): + if not ticker: + continue + security = self.add_crypto_future(ticker, Resolution.HOUR, fill_forward=False, market=Market.BINANCE) + security.set_fee_model(ConstantFeeModel(0)) + security.set_slippage_model(ConstantSlippageModel(0)) + self._symbols[ticker] = security.symbol + with self._equity_path.open("w", newline="") as stream: + csv.writer(stream).writerow(["timestamp", "equity", "cash", "holdings_value"]) + with self._events_path.open("w", newline="") as stream: + csv.writer(stream).writerow(["timestamp", "symbol", "status", "direction", "fill_quantity", "fill_price", "fee", "message", "order_id"]) + with self._funding_path.open("w", newline="") as stream: + csv.writer(stream).writerow(["timestamp", "symbol", "funding_rate"]) + self._started = time.perf_counter() + + def on_data(self, data: Slice): + key = self.time.strftime("%Y-%m-%d %H:%M:%S") + with self._funding_path.open("a", newline="") as stream: + writer = csv.writer(stream) + for symbol, rate in data.margin_interest_rates.items(): + writer.writerow([key, symbol.value, float(rate.interest_rate)]) + requested = self._targets.get(key) + if requested is not None: + active = set(requested) + active.update(ticker for ticker, symbol in self._symbols.items() if self.portfolio[symbol].quantity != 0) + value = float(self.portfolio.total_portfolio_value) + current = {{ticker: float(self.portfolio[symbol].quantity) * float(self.securities[symbol].price) / value for ticker, symbol in self._symbols.items() if self.portfolio[symbol].quantity != 0}} + reductions = sorted(ticker for ticker in active if requested.get(ticker, 0.0) < current.get(ticker, 0.0)) + increases = sorted(active - set(reductions)) + for ticker in reductions + increases: + symbol = self._symbols[ticker] + if symbol not in data.bars: + continue + price = float(data.bars[symbol].close) + lot = float(self._properties[ticker]["lot_size"]) + raw = (requested.get(ticker, 0.0) - current.get(ticker, 0.0)) * value / price + delta = math.copysign(math.floor(abs(raw) / lot + 0.5) * lot, raw) + if abs(delta) >= lot: + self.market_order(symbol, delta) + with self._equity_path.open("a", newline="") as stream: + csv.writer(stream).writerow([key, float(self.portfolio.total_portfolio_value), float(self.portfolio.cash_book["USDT"].amount), float(self.portfolio.total_holdings_value)]) + + def on_order_event(self, event: OrderEvent): + fee = float(event.order_fee.value.amount) if event.order_fee and event.order_fee.value else 0.0 + with self._events_path.open("a", newline="") as stream: + csv.writer(stream).writerow([self.time.strftime("%Y-%m-%d %H:%M:%S"), event.symbol.value if event.symbol else "", str(event.status), str(event.direction), float(event.fill_quantity), float(event.fill_price), fee, str(event.message or "").replace("\\n", " "), int(event.order_id)]) + + def on_end_of_algorithm(self): + self._runtime_path.write_text(json.dumps({{"engine_seconds": time.perf_counter() - self._started}})) +""" + (project / "main.py").write_text(main_code, encoding="utf-8") + return project, {"manifest": manifest, "properties": properties} + + +def run(bundle: Path) -> tuple[dict[str, Any], pl.DataFrame, pl.DataFrame, pl.DataFrame]: + project, inputs = _prepare_project(bundle) + targets = tomllib.loads((PROJECT_ROOT / "validation/framework_targets.toml").read_text()) + output_dir = project / "backtests" / str(time.time_ns()) + run_lean_backtest( + lean_cmd=resolve_lean_command(), + cwd=PROJECT_ROOT, + project_dir=project, + lean_config=PROJECT_ROOT / "validation/lean/workspace/lean.json", + output_dir=output_dir, + image=targets["framework"]["lean"]["artifact"], + env=make_lean_env(), + ) + copy_lean_artifacts( + project, + output_dir, + [ + "ml4t_daily_equity.csv", + "ml4t_funding_observed.csv", + "ml4t_order_events.csv", + "ml4t_runtime.json", + "ml4t_symbol_map.json", + ], + ) + _, final_value, fills_pd, equity_pd, events_pd = load_lean_artifacts(output_dir) + if fills_pd is None or equity_pd is None or events_pd is None: + raise RuntimeError("LEAN did not produce the required comparison surfaces") + fills_pd = fills_pd.rename(columns={"fill_price": "price", "fee": "commission"}) + fills = pl.from_pandas( + fills_pd[["timestamp", "asset", "side", "quantity", "price", "commission"]] + ) + equity = pl.from_pandas(equity_pd[["timestamp", "equity", "cash", "holdings_value"]]) + runtime = json.loads((output_dir / "ml4t_runtime.json").read_text(encoding="utf-8")) + rejected = events_pd[events_pd["status"].astype(str).str.lower().isin({"invalid", "canceled"})] + evidence = { + "schema_version": 1, + "case_study": inputs["manifest"]["case_study"], + "framework": "lean", + "comparison_profile": "lean_crypto_future", + "comparison_costs": "disabled_except_native_funding", + "comparison_position_rules": "disabled", + "input_bundle_sha256": inputs["manifest"]["bundle_sha256"], + "symbol_properties_sha256": _sha256(project / "symbol_properties.json"), + "engine_seconds": float(runtime["engine_seconds"]), + "final_value": final_value, + "num_fills": fills.height, + "num_rejections": len(rejected), + } + rejected_frame = pl.from_pandas( + rejected[["timestamp", "asset", "fill_quantity", "message", "order_id"]] + ) + return evidence, fills, equity, rejected_frame + + +def write_evidence( + output: Path, + evidence: dict[str, Any], + fills: pl.DataFrame, + equity: pl.DataFrame, + rejections: pl.DataFrame, +) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) + try: + fills.write_parquet(staging / "fills.parquet", compression="zstd", statistics=True) + equity.write_parquet(staging / "equity.parquet", compression="zstd", statistics=True) + rejections.write_parquet( + staging / "rejected_orders.parquet", compression="zstd", statistics=True + ) + evidence["files"] = { + path.name: {"sha256": _sha256(path), "bytes": path.stat().st_size} + for path in sorted(staging.iterdir()) + } + (staging / "manifest.json").write_text( + json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if output.exists(): + raise FileExistsError(f"Evidence output already exists: {output}") + os.replace(staging, output) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + evidence, fills, equity, rejections = run(args.bundle.resolve()) + write_evidence(args.output.resolve(), evidence, fills, equity, rejections) + print( + f"{evidence['case_study']}: {evidence['num_fills']:,} fills, " + f"{evidence['engine_seconds']:.6f}s engine time" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/real_strategy_runner.py b/validation/real_strategy_runner.py index 877eb626..784ed760 100644 --- a/validation/real_strategy_runner.py +++ b/validation/real_strategy_runner.py @@ -4,6 +4,7 @@ from __future__ import annotations import argparse +import copy import hashlib import json import math @@ -11,7 +12,7 @@ import tempfile import time from collections.abc import Mapping -from datetime import UTC, datetime +from datetime import UTC, datetime, timedelta from functools import wraps from pathlib import Path from typing import Any @@ -28,6 +29,7 @@ Strategy, TargetWeightExecutor, ) +from ml4t.backtest.profiles import get_profile_config from ml4t.backtest.risk import RuleChain, StopLoss, TimeExit, TrailingStop SCHEMA_VERSION = 1 @@ -48,7 +50,7 @@ def _as_utc(value: datetime) -> datetime: class FundingSettlementLedger: """Apply frozen perpetual-futures funding during engine mark updates.""" - def __init__(self, funding: pl.DataFrame) -> None: + def __init__(self, funding: pl.DataFrame, *, skip_first_after_entry: bool = False) -> None: required = {"symbol", "timestamp", "funding_rate"} missing = required - set(funding.columns) if missing: @@ -66,7 +68,10 @@ def __init__(self, funding: pl.DataFrame) -> None: timestamp = _as_utc(row["timestamp"]) self._rates.setdefault(timestamp, {})[str(row["symbol"])] = rate self._rate_count = selected.height + self._symbols = sorted(selected["symbol"].unique().to_list()) self._settled_timestamps: set[datetime] = set() + self._skip_first_after_entry = skip_first_after_entry + self._next_application: dict[str, datetime | None] = {} self.funding_pnl = 0.0 self.funding_events = 0 self.funding_settlements = 0 @@ -84,18 +89,30 @@ def update_time_with_funding(timestamp, *args, **kwargs): def settle(self, timestamp: datetime, broker: Any) -> None: normalized = _as_utc(timestamp) - if normalized in self._settled_timestamps: - return rates = self._rates.get(normalized) - if rates is None: - return - self._settled_timestamps.add(normalized) - self.funding_settlements += len(rates) + if rates is not None and normalized not in self._settled_timestamps: + self._settled_timestamps.add(normalized) + self.funding_settlements += len(rates) event_cash = 0.0 - for symbol, rate in rates.items(): + symbols = self._symbols if self._skip_first_after_entry else list(rates or ()) + for symbol in symbols: position = broker.positions.get(symbol) if position is None or float(position.quantity) == 0.0: + self._next_application[symbol] = None continue + if self._skip_first_after_entry and self._next_application.get(symbol) is None: + self._next_application[symbol] = self._next_funding_time(normalized) + continue + if rates is None or symbol not in rates: + continue + if self._skip_first_after_entry: + next_application = self._next_application[symbol] + if next_application is None or normalized < next_application: + continue + while next_application <= normalized: + next_application += timedelta(hours=8) + self._next_application[symbol] = next_application + rate = rates[symbol] mark = broker.get_mark_price(symbol, quantity=position.quantity) if mark is None: raise RuntimeError(f"Funding settlement lacks a mark for {symbol!r}") @@ -110,6 +127,14 @@ def settle(self, timestamp: datetime, broker: Any) -> None: self.funding_pnl += event_cash self.funding_events += 1 + @staticmethod + def _next_funding_time(current: datetime) -> datetime: + if current.hour >= 16: + return (current + timedelta(days=1)).replace(hour=0, minute=0, second=0, microsecond=0) + if current.hour >= 8: + return current.replace(hour=16, minute=0, second=0, microsecond=0) + return current.replace(hour=8, minute=0, second=0, microsecond=0) + def metrics(self) -> dict[str, int | float]: if self.funding_settlements != self._rate_count: raise RuntimeError( @@ -194,26 +219,91 @@ def load_bundle(bundle: Path) -> dict[str, Any]: } -def execute_bundle(inputs: Mapping[str, Any]) -> tuple[Any, float, dict[str, int | float]]: +def _comparison_config(spec: Mapping[str, Any], profile: str) -> BacktestConfig: + source = spec["backtest_config"] + profile_data = ( + copy.deepcopy(source) if profile == "lean_crypto_future" else get_profile_config(profile) + ) + profile_data["account"]["allow_short_selling"] = source["account"]["allow_short_selling"] + if profile not in {"lean", "lean_crypto_future"}: + profile_data["account"]["allow_leverage"] = source["account"]["allow_leverage"] + else: + profile_data["account"]["allow_leverage"] = True + if profile == "lean_crypto_future": + profile_data["account"]["initial_margin"] = 0.04 + profile_data["account"]["long_maintenance_margin"] = 0.02 + profile_data["account"]["short_maintenance_margin"] = 0.02 + profile_data["cash"]["initial"] = source["cash"]["initial"] + profile_data["calendar"] = source["calendar"] + profile_data["feed"] = source["feed"] + profile_data["commission"] = { + "model": "none", + "rate": 0.0, + "per_share": 0.0, + "per_trade": 0.0, + "minimum": 0.0, + } + profile_data["slippage"] = {"model": "none", "rate": 0.0} + profile_data["orders"]["rebalance_headroom_pct"] = 1.0 + profile_data["metadata"] = { + **source.get("metadata", {}), + "comparison_profile": profile, + "comparison_costs": "disabled", + "comparison_position_rules": "disabled", + } + return BacktestConfig.from_dict(profile_data, preset_name=profile) + + +def execute_bundle( + inputs: Mapping[str, Any], + *, + comparison_profile: str | None = None, + price_decimals: int | None = None, + execution_specs: Mapping[str, Mapping[str, float]] | None = None, +) -> tuple[Any, float, dict[str, int | float]]: """Run the engine once and return its native result and engine-only runtime.""" spec = inputs["spec"] - config = BacktestConfig.from_dict(spec["backtest_config"]) + config = ( + _comparison_config(spec, comparison_profile) + if comparison_profile is not None + else BacktestConfig.from_dict(spec["backtest_config"]) + ) targets = _target_map(inputs["targets"]) rebalance = spec["strategy"]["rebalance"] - rules = _position_rules(spec["strategy"].get("risk", {})) + rules = ( + None + if comparison_profile is not None + else _position_rules(spec["strategy"].get("risk", {})) + ) funding = inputs["funding"] - funding_ledger = FundingSettlementLedger(funding) if funding is not None else None + funding_ledger = ( + FundingSettlementLedger( + funding, + skip_first_after_entry=comparison_profile == "lean_crypto_future", + ) + if funding is not None + else None + ) class FrozenTargetStrategy(Strategy): def __init__(self) -> None: self._rules_set = False self._executor = TargetWeightExecutor( RebalanceConfig( - min_trade_value=float(rebalance["min_trade_value"]), - min_weight_change=float(rebalance["min_weight_change"]), + min_trade_value=( + 0.0 + if comparison_profile is not None + else float(rebalance["min_trade_value"]) + ), + min_weight_change=( + 0.0 + if comparison_profile is not None + else float(rebalance["min_weight_change"]) + ), allow_fractional=None, allow_short=bool(config.allow_short_selling), rebalance_mode=config.rebalance_mode, + share_rounding=config.share_rounding, ) ) @@ -230,9 +320,49 @@ def on_data(self, timestamp, data, context, broker) -> None: if target is not None: available = {symbol: weight for symbol, weight in target.items() if symbol in data} if available: - self._executor.execute(available, data, broker) - - feed = DataFeed(prices_df=inputs["market"], feed_spec=config.feed_spec) + if execution_specs is None: + self._executor.execute(available, data, broker) + else: + value = broker.equity() + current = { + symbol: ( + float(position.quantity) * float(data[symbol]["close"]) / value + ) + for symbol, position in broker.positions.items() + if symbol in data and float(position.quantity) != 0.0 + } + active = set(available) | set(current) + reductions = sorted( + symbol + for symbol in active + if available.get(symbol, 0.0) < current.get(symbol, 0.0) + ) + increases = sorted(active - set(reductions)) + for symbol in reductions + increases: + if symbol not in data: + continue + price = float(data[symbol]["close"]) + lot = float(execution_specs[symbol]["lot_size"]) + raw = ( + (available.get(symbol, 0.0) - current.get(symbol, 0.0)) + * value + / price + ) + quantity = math.copysign( + math.floor(abs(raw) / lot + 0.5) * lot, + raw, + ) + if abs(quantity) >= lot: + broker.submit_order(symbol, quantity) + + market = inputs["market"] + if price_decimals is not None: + market = market.with_columns( + pl.col(column).round(price_decimals) + for column in ("open", "high", "low", "close") + if column in market.columns + ) + feed = DataFeed(prices_df=market, feed_spec=config.feed_spec) engine = Engine.from_config( feed, FrozenTargetStrategy(), @@ -253,12 +383,16 @@ def _write_evidence( result: Any, engine_seconds: float, funding_metrics: Mapping[str, int | float], + comparison_profile: str | None, + price_decimals: int | None, + execution_specs_sha256: str | None, ) -> None: output.parent.mkdir(parents=True, exist_ok=True) staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) try: frames = { "fills.parquet": result.to_fills_dataframe(), + "rejected_orders.parquet": result.to_rejected_orders_dataframe(), "trades.parquet": result.to_trades_dataframe(), "equity.parquet": result.to_equity_dataframe(), "portfolio_state.parquet": result.to_portfolio_state_dataframe(), @@ -269,10 +403,14 @@ def _write_evidence( "schema_version": SCHEMA_VERSION, "case_study": inputs["manifest"]["case_study"], "framework": "ml4t_backtest", + "comparison_profile": comparison_profile, + "price_decimals": price_decimals, + "execution_specs_sha256": execution_specs_sha256, "input_bundle_sha256": inputs["manifest"]["bundle_sha256"], "engine_seconds": engine_seconds, "final_value": float(result.metrics["final_value"]), "num_fills": len(result.fills), + "num_rejections": len(result.rejected_orders), "num_trades": len(result.trades), "funding": dict(funding_metrics), "files": {}, @@ -298,15 +436,33 @@ def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--bundle", type=Path, required=True) parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--comparison-profile") + parser.add_argument("--price-decimals", type=int) + parser.add_argument("--execution-specs", type=Path) args = parser.parse_args() inputs = load_bundle(args.bundle.resolve()) - result, engine_seconds, funding_metrics = execute_bundle(inputs) + execution_specs = ( + json.loads(args.execution_specs.read_text(encoding="utf-8")) + if args.execution_specs is not None + else None + ) + result, engine_seconds, funding_metrics = execute_bundle( + inputs, + comparison_profile=args.comparison_profile, + price_decimals=args.price_decimals, + execution_specs=execution_specs, + ) _write_evidence( output=args.output.resolve(), inputs=inputs, result=result, engine_seconds=engine_seconds, funding_metrics=funding_metrics, + comparison_profile=args.comparison_profile, + price_decimals=args.price_decimals, + execution_specs_sha256=( + _sha256(args.execution_specs) if args.execution_specs is not None else None + ), ) print( f"{inputs['manifest']['case_study']}: {len(result.fills):,} fills, " diff --git a/validation/real_strategy_vectorbt.py b/validation/real_strategy_vectorbt.py new file mode 100644 index 00000000..89eb5056 --- /dev/null +++ b/validation/real_strategy_vectorbt.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Run a frozen real target-allocation workload with VectorBT.""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib +import json +import os +import tempfile +import time +from pathlib import Path +from typing import Any + +import numpy as np +import pandas as pd +import polars as pl + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _wide(frame: pl.DataFrame, value: str) -> pd.DataFrame: + pivoted = frame.select("timestamp", "symbol", value).pivot( + on="symbol", index="timestamp", values=value + ) + result = pd.DataFrame(pivoted.sort("timestamp").to_dict(as_series=False)).set_index("timestamp") + result.index = pd.DatetimeIndex(result.index) + return result + + +def run(bundle: Path, framework: str) -> tuple[dict[str, Any], pl.DataFrame, pl.DataFrame]: + package = "vectorbtpro" if framework == "vectorbt_pro" else "vectorbt" + vbt = importlib.import_module(package) + manifest = json.loads((bundle / "manifest.json").read_text(encoding="utf-8")) + case_study = manifest["case_study"] + if case_study == "cme_futures" and framework != "vectorbt_pro": + raise ValueError("VectorBT OSS lacks the contract multiplier used by this workload") + if case_study not in {"etfs", "cme_futures"}: + raise ValueError("This adapter accepts the ETF and CME futures workloads") + spec = json.loads((bundle / "spec.json").read_text(encoding="utf-8")) + close = _wide(pl.read_parquet(bundle / "market.parquet"), "close") + weights = _wide(pl.read_parquet(bundle / "targets.parquet"), "weight").reindex( + index=close.index, columns=close.columns + ) + rebalance_rows = weights.notna().any(axis=1) + weights.loc[rebalance_rows] = weights.loc[rebalance_rows].fillna(0.0) + kwargs: dict[str, Any] = { + "close": close, + "size": weights, + "size_type": "targetpercent", + "init_cash": float(spec["backtest_config"]["cash"]["initial"]), + "fees": 0.0, + "slippage": 0.0, + "cash_sharing": True, + "call_seq": "auto", + } + if framework == "vectorbt_oss": + kwargs["lock_cash"] = True + elif case_study == "cme_futures": + contracts = json.loads((bundle / "contracts.json").read_text(encoding="utf-8")) + kwargs["multiplier"] = np.asarray( + [float(contracts[symbol]["multiplier"]) for symbol in close.columns] + ) + kwargs["leverage"] = 100.0 + kwargs["leverage_mode"] = "eager" + started = time.perf_counter() + portfolio = vbt.Portfolio.from_orders(**kwargs) + engine_seconds = time.perf_counter() - started + + orders = portfolio.orders.records_readable + fill_rows = [ + { + "timestamp": row.get("Timestamp", row.get("Index")), + "asset": row.get("Column"), + "side": "buy" if row.get("Side") == "Buy" else "sell", + "quantity": abs(float(row.get("Size", 0.0))), + "price": float(row.get("Price", 0.0)), + "commission": float(row.get("Fees", 0.0)), + } + for _, row in orders.iterrows() + ] + value_attr = portfolio.value + value = value_attr() if callable(value_attr) else value_attr + if isinstance(value, pd.DataFrame): + value = value.iloc[:, 0] if value.shape[1] == 1 else value.sum(axis=1) + equity = pl.DataFrame( + { + "timestamp": pl.Series( + pd.DatetimeIndex(value.index).to_pydatetime().tolist(), dtype=pl.Datetime("us") + ), + "equity": value.to_numpy(), + } + ) + fills = pl.DataFrame(fill_rows) + evidence = { + "schema_version": 1, + "case_study": manifest["case_study"], + "framework": framework, + "comparison_profile": ( + "vectorbt_strict" if framework == "vectorbt_pro" else "vectorbt_oss_strict" + ), + "comparison_costs": "disabled", + "comparison_position_rules": "disabled", + "input_bundle_sha256": manifest["bundle_sha256"], + "engine_seconds": engine_seconds, + "final_value": float(value.iloc[-1]), + "num_fills": fills.height, + } + return evidence, fills, equity + + +def write_evidence( + output: Path, evidence: dict[str, Any], fills: pl.DataFrame, equity: pl.DataFrame +) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) + try: + fills.write_parquet(staging / "fills.parquet", compression="zstd", statistics=True) + equity.write_parquet(staging / "equity.parquet", compression="zstd", statistics=True) + evidence["files"] = { + path.name: {"sha256": _sha256(path), "bytes": path.stat().st_size} + for path in sorted(staging.iterdir()) + } + (staging / "manifest.json").write_text( + json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if output.exists(): + raise FileExistsError(f"Evidence output already exists: {output}") + os.replace(staging, output) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle", type=Path, required=True) + parser.add_argument("--framework", choices=("vectorbt_pro", "vectorbt_oss"), required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + evidence, fills, equity = run(args.bundle.resolve(), args.framework) + write_evidence(args.output.resolve(), evidence, fills, equity) + print( + f"{evidence['case_study']}: {evidence['num_fills']:,} fills, " + f"{evidence['engine_seconds']:.6f}s engine time" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/real_strategy_zipline.py b/validation/real_strategy_zipline.py new file mode 100644 index 00000000..c7de42e0 --- /dev/null +++ b/validation/real_strategy_zipline.py @@ -0,0 +1,292 @@ +#!/usr/bin/env python3 +"""Run a frozen real target-allocation workload with Zipline Reloaded.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import math +import os +import tempfile +import time +from pathlib import Path +from typing import Any + +import pandas as pd +import polars as pl +from zipline import run_algorithm +from zipline.api import ( + get_datetime, + order, + order_target, + set_commission, + set_slippage, + sid, +) +from zipline.data.bundles import ingest, register +from zipline.finance.commission import NoCommission +from zipline.finance.slippage import SlippageModel +from zipline.utils.calendar_utils import get_calendar + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as stream: + for chunk in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _targets(frame: pl.DataFrame) -> dict[pd.Timestamp, dict[str, float]]: + result: dict[pd.Timestamp, dict[str, float]] = {} + for row in frame.sort("timestamp", "symbol").iter_rows(named=True): + timestamp = pd.Timestamp(row["timestamp"]).normalize() + result.setdefault(timestamp, {})[str(row["symbol"])] = float(row["weight"]) + return result + + +def _flatten(results: pd.DataFrame, column: str) -> pd.DataFrame: + records: list[dict[str, Any]] = [] + if column not in results.columns: + return pd.DataFrame() + for timestamp, payload in results[column].items(): + if not isinstance(payload, list): + continue + for item in payload: + record = dict(item) if isinstance(item, dict) else item.to_dict() + record["timestamp"] = timestamp + records.append(record) + return pd.DataFrame(records) + + +def run(bundle: Path) -> tuple[dict[str, Any], pl.DataFrame, pl.DataFrame]: + manifest = json.loads((bundle / "manifest.json").read_text(encoding="utf-8")) + if manifest["case_study"] != "etfs": + raise ValueError("This adapter accepts the ETF equity workload") + spec = json.loads((bundle / "spec.json").read_text(encoding="utf-8")) + market = pl.read_parquet(bundle / "market.parquet").with_columns( + pl.col(column).round(3) for column in ("open", "high", "low", "close") + ) + target_lookup = _targets(pl.read_parquet(bundle / "targets.parquet")) + symbols = market["symbol"].unique().sort().to_list() + calendar_name = "XNYS" + calendar = get_calendar(calendar_name) + first_date = pd.Timestamp(market["timestamp"].min()).normalize() + last_date = pd.Timestamp(market["timestamp"].max()).normalize() + sessions = pd.DatetimeIndex(calendar.sessions_in_range(first_date, last_date)).tz_localize(None) + bundle_name = f"real_etfs_v2_{manifest['bundle_sha256'][:16]}" + + def ingest_bundle( + _environ, + asset_db_writer, + _minute_bar_writer, + daily_bar_writer, + adjustment_writer, + _calendar, + _start_session, + _end_session, + _cache, + show_progress, + _output_dir, + ) -> None: + metadata_rows = [] + bar_data = [] + for asset_sid, symbol in enumerate(symbols): + selected = market.filter(pl.col("symbol") == symbol).select( + "timestamp", "open", "high", "low", "close", "volume" + ) + frame = pd.DataFrame(selected.to_dict(as_series=False)).set_index("timestamp") + frame.index = pd.DatetimeIndex(frame.index).tz_localize(None) + asset_sessions = sessions[ + (sessions >= frame.index.min()) & (sessions <= frame.index.max()) + ] + observed_sessions = frame.index + frame = frame.reindex(asset_sessions).ffill() + frame.loc[~frame.index.isin(observed_sessions), "volume"] = 0 + metadata_rows.append( + { + "sid": asset_sid, + "symbol": symbol, + "asset_name": symbol, + "start_date": frame.index.min(), + "end_date": frame.index.max(), + "first_traded": frame.index.min(), + "exchange": "NYSE", + } + ) + bar_data.append((asset_sid, frame)) + metadata = pd.DataFrame(metadata_rows).set_index("sid") + asset_db_writer.write(equities=metadata) + daily_bar_writer.write(bar_data, show_progress=show_progress) + adjustment_writer.write() + + zipline_root = Path(os.environ.get("ZIPLINE_ROOT", Path.home() / ".zipline")) + bundle_dir = zipline_root / "data" / bundle_name + register( + bundle_name, + ingest_bundle, + calendar_name=calendar_name, + start_session=calendar.sessions_in_range(first_date, last_date)[0], + end_session=calendar.sessions_in_range(first_date, last_date)[-1], + ) + setup_seconds = 0.0 + if not bundle_dir.exists() or not any(bundle_dir.iterdir()): + started = time.perf_counter() + ingest(bundle_name, show_progress=False) + setup_seconds = time.perf_counter() - started + + class OpenPriceSlippage(SlippageModel): + @staticmethod + def process_order(data, pending_order): + return float(data.current(pending_order.asset, "open")), pending_order.amount + + state = {"targets": target_lookup, "symbols": symbols} + + def initialize(context) -> None: + context.state = state + context.assets = {symbol: sid(index) for index, symbol in enumerate(symbols)} + context.names = {asset: symbol for symbol, asset in context.assets.items()} + set_commission(us_equities=NoCommission()) + set_slippage(us_equities=OpenPriceSlippage()) + + def handle_data(context, data) -> None: + timestamp = get_datetime() + timestamp = ( + timestamp.tz_convert(None).normalize() if timestamp.tz else timestamp.normalize() + ) + requested = context.state["targets"].get(timestamp) + if requested is None: + return + available = { + symbol: weight + for symbol, weight in requested.items() + if data.can_trade(context.assets[symbol]) + } + if not available: + return + value = float(context.portfolio.portfolio_value) + current = { + context.names[asset]: float(position.amount) + * float(data.current(asset, "price")) + / value + for asset, position in context.portfolio.positions.items() + if position.amount != 0 and data.can_trade(asset) + } + reductions = sorted( + symbol for symbol, weight in available.items() if weight < current.get(symbol, 0.0) + ) + omitted = sorted(symbol for symbol in current if symbol not in available) + increases = sorted(symbol for symbol in available if symbol not in reductions) + for symbol in reductions: + asset = context.assets[symbol] + price = float(data.current(asset, "price")) + raw = (available[symbol] - current.get(symbol, 0.0)) * value / price + amount = int(math.copysign(math.floor(abs(raw) + 0.5), raw)) + if amount: + order(asset, amount) + for symbol in omitted: + order_target(context.assets[symbol], 0) + for symbol in increases: + asset = context.assets[symbol] + price = float(data.current(asset, "price")) + raw = (available[symbol] - current.get(symbol, 0.0)) * value / price + amount = int(math.copysign(math.floor(abs(raw) + 0.5), raw)) + if amount: + order(asset, amount) + + started = time.perf_counter() + results = run_algorithm( + start=calendar.sessions_in_range(first_date, last_date)[0], + end=calendar.sessions_in_range(first_date, last_date)[-1], + initialize=initialize, + handle_data=handle_data, + capital_base=float(spec["backtest_config"]["cash"]["initial"]), + bundle=bundle_name, + data_frequency="daily", + trading_calendar=calendar, + ) + engine_seconds = time.perf_counter() - started + transactions = _flatten(results, "transactions") + fill_rows = [] + for _, row in transactions.iterrows(): + asset = row["sid"] + amount = float(row["amount"]) + fill_rows.append( + { + "timestamp": pd.Timestamp(row["timestamp"]).tz_localize(None), + "asset": asset.symbol, + "side": "buy" if amount > 0 else "sell", + "quantity": abs(amount), + "price": float(row["price"]), + "commission": 0.0, + } + ) + fills = pl.DataFrame(fill_rows) + equity = pl.DataFrame( + { + "timestamp": pl.Series( + pd.DatetimeIndex(results.index).tz_localize(None).to_pydatetime().tolist(), + dtype=pl.Datetime("us"), + ), + "equity": results["portfolio_value"].to_numpy(), + } + ) + evidence = { + "schema_version": 1, + "case_study": manifest["case_study"], + "framework": "zipline", + "comparison_profile": "zipline_strict", + "comparison_costs": "disabled", + "comparison_position_rules": "disabled", + "price_decimals": 3, + "input_bundle_sha256": manifest["bundle_sha256"], + "setup_seconds": setup_seconds, + "engine_seconds": engine_seconds, + "final_value": float(results["portfolio_value"].iloc[-1]), + "num_fills": fills.height, + } + return evidence, fills, equity + + +def write_evidence( + output: Path, evidence: dict[str, Any], fills: pl.DataFrame, equity: pl.DataFrame +) -> None: + output.parent.mkdir(parents=True, exist_ok=True) + staging = Path(tempfile.mkdtemp(prefix=f".{output.name}.", dir=output.parent)) + try: + fills.write_parquet(staging / "fills.parquet", compression="zstd", statistics=True) + equity.write_parquet(staging / "equity.parquet", compression="zstd", statistics=True) + evidence["files"] = { + path.name: {"sha256": _sha256(path), "bytes": path.stat().st_size} + for path in sorted(staging.iterdir()) + } + (staging / "manifest.json").write_text( + json.dumps(evidence, indent=2, sort_keys=True) + "\n", encoding="utf-8" + ) + if output.exists(): + raise FileExistsError(f"Evidence output already exists: {output}") + os.replace(staging, output) + finally: + if staging.exists(): + for path in staging.iterdir(): + path.unlink() + staging.rmdir() + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--bundle", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + args = parser.parse_args() + evidence, fills, equity = run(args.bundle.resolve()) + write_evidence(args.output.resolve(), evidence, fills, equity) + print( + f"{evidence['case_study']}: {evidence['num_fills']:,} fills, " + f"{evidence['engine_seconds']:.6f}s engine time" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 7cfa55e6..9b525587 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -21,7 +21,10 @@ validation/common/ml4t_runner.py validation/common/provenance.py validation/large_scale_evidence.py validation/real_strategy_corpus.py +validation/real_strategy_evidence.py validation/real_strategy_runner.py +validation/real_strategy_lean.py +validation/real_strategy_lean_crypto.py validation/common/types.py validation/native/vectorbt_behavior.py validation/native/backtrader_behavior.py From f903c479f803aac072dbb4539252c862ff3fbcdf Mon Sep 17 00:00:00 2001 From: Stefan Jansen Date: Fri, 14 Aug 2026 18:11:26 -0400 Subject: [PATCH 44/44] docs(validation): report real strategy audit --- README.md | 14 +- docs/index.md | 10 +- docs/user-guide/configuration.md | 1 + docs/user-guide/profiles.md | 18 +- .../contracts/test_parity_claim_generation.py | 13 +- tests/contracts/test_real_strategy_runner.py | 20 + validation/METHODOLOGY.md | 46 +- validation/README.md | 29 +- validation/REAL_STRATEGY_PERFORMANCE.json | 474 +++++++++++ validation/REAL_STRATEGY_RESULTS.json | 783 ++++++++++++++++++ validation/claim_inventory.toml | 24 +- validation/generate_parity_claims.py | 94 ++- validation/real_strategy_benchmark.py | 280 +++++++ validation/release_checks.txt | 1 + 14 files changed, 1772 insertions(+), 35 deletions(-) create mode 100644 validation/REAL_STRATEGY_PERFORMANCE.json create mode 100644 validation/REAL_STRATEGY_RESULTS.json create mode 100644 validation/real_strategy_benchmark.py diff --git a/README.md b/README.md index c79d29e4..cd2c075d 100644 --- a/README.md +++ b/README.md @@ -276,8 +276,13 @@ opt-in. ## Cross-Framework Validation -Profiles configure framework-specific execution behavior. The generated table below reports only -claims supported by retained accepted evidence. +The primary audit uses frozen data and targets from ETF allocation, CME futures, and crypto +perpetual-funding case studies. Profiles configure framework-specific execution behavior, and only +genuinely supported framework and asset combinations are required. The broad real-strategy gate +currently passes 6 of 8 required pairs; the generated table reports the exact remaining gaps. + +The scenario matrix and 250-asset workload remain useful synthetic diagnostic and stress tests. +They do not establish realistic strategy equivalence. @@ -342,6 +347,11 @@ artifact contains raw samples, whole-process wall time, process-tree peak RSS, d bootstrap intervals, output checksums, framework identities, and semantic disclosures for the idiomatic view. The results remain audit evidence pending a separate publication decision. +The real-strategy performance artifact times only engine execution for correctness-passing pairs. +Inputs, model inference, target construction, adapter preparation, extraction, and reporting are +excluded. See `validation/REAL_STRATEGY_PERFORMANCE.json`; its ratios are dated audit measurements, +not stable framework claims. + ## Documentation - [Getting Started](docs/getting-started/quickstart.md) — your first backtest diff --git a/docs/index.md b/docs/index.md index e80b889d..8cd806fe 100644 --- a/docs/index.md +++ b/docs/index.md @@ -82,9 +82,9 @@ which pinned framework scenarios currently match exactly. **Quote-aware when you need it.** The feed can cache bid, ask, midpoint, and quote sizes additively. Market execution and position marking can use `price`, `bid`, `ask`, `quote_mid`, or `quote_side`. -**Validated at scale.** One reconstructable 250-asset, 5,040-session workload has retained exact -canonical output evidence for current VectorBT Pro, VectorBT OSS, Backtrader, Zipline Reloaded, -and LEAN targets. +**Retained validation evidence.** The primary audit uses three real case studies with frozen +inputs. Separate synthetic scenario and 250-asset stress suites isolate conventions and exercise +high event counts. | Feature | Description | |---------|-------------| @@ -98,8 +98,8 @@ and LEAN targets. ## Parity Validation -Scenario comparisons run equivalent inputs and check framework-specific outcomes. Large-scale -claims additionally require a retained workload with canonical record hashes and terminal values. +Real-strategy comparisons run frozen market data and model-derived targets through each supported +engine pair. The synthetic scenario and stress suites provide narrower conformance evidence. diff --git a/docs/user-guide/configuration.md b/docs/user-guide/configuration.md index 9e5b76dc..6fd09fe0 100644 --- a/docs/user-guide/configuration.md +++ b/docs/user-guide/configuration.md @@ -210,6 +210,7 @@ friction: | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `share_type` | ShareType | INTEGER | FRACTIONAL or INTEGER | +| `share_rounding` | ShareRounding | NEAREST | NEAREST or TRUNCATE for integer quantities | ### Result evidence diff --git a/docs/user-guide/profiles.md b/docs/user-guide/profiles.md index 33b599d2..771cc95d 100644 --- a/docs/user-guide/profiles.md +++ b/docs/user-guide/profiles.md @@ -141,13 +141,18 @@ claim stop-order parity. Framework profiles are validated on the workloads each retained artifact declares: -1. **Scenario-level**: Exact ordered trade and fill matching on the required synthetic matrix for +1. **Real strategies**: Complete canonical fill streams, every shared equity timestamp, and + terminal values for supported pairs drawn from ETF allocation, CME futures, and crypto + perpetual-funding case studies. Frozen model-derived targets are shared by both engines. + +2. **Synthetic scenarios**: Exact ordered trade and fill matching on the required matrix for VectorBT, Backtrader, and Zipline. Capability declarations identify reconstructed and unavailable result surfaces. -2. **Large-scale**: Exact target-intent, native-fill, fill-derived closed-trade, and terminal-state - comparison on a reconstructable 250-asset, 5,040-session workload. Each framework row states - the surface it exposes; the claim does not include unavailable order-lifecycle fields. +3. **Synthetic stress**: Exact target-intent, native-fill, fill-derived closed-trade, and + terminal-state comparison on a reconstructable 250-asset, 5,040-session workload. Each + framework row states the surface it exposes; the claim does not include unavailable + order-lifecycle fields. LEAN has separate native-behavior and Chapter 16 case-study evidence. The frozen engine produced 47,652 fills across three case studies; ML4T matched every canonical fill and each terminal value @@ -185,6 +190,11 @@ uses one warm-up and ten process-isolated measurements per runner, with raw samp intervals, process-tree peak RSS, exact output checksums, and an idiomatic view that makes no equivalence claim. +`validation/REAL_STRATEGY_PERFORMANCE.json` separately retains engine-only timings for the six +real-strategy pairs that passed correctness. It excludes data loading, inference, target +construction, adapter preparation, extraction, and reporting. The results apply only to the named +versions, bundles, and machine. + ## Listing Profiles ```python diff --git a/tests/contracts/test_parity_claim_generation.py b/tests/contracts/test_parity_claim_generation.py index 0a1f07f2..cf6a7018 100644 --- a/tests/contracts/test_parity_claim_generation.py +++ b/tests/contracts/test_parity_claim_generation.py @@ -20,10 +20,11 @@ def test_legacy_accepted_evidence_cannot_generate_current_claims() -> None: generate_parity_claims._load_json(generate_parity_claims.CORRECTNESS_EVIDENCE) ) large_scale = generate_parity_claims._load_json(generate_parity_claims.LARGE_SCALE_EVIDENCE) + real_strategy = generate_parity_claims._load_json(generate_parity_claims.REAL_STRATEGY_EVIDENCE) correctness["schema_version"] = 1 with pytest.raises(ValueError, match="Unsupported correctness schema: 1"): - generate_parity_claims._validate_evidence(correctness, large_scale) + generate_parity_claims._validate_evidence(correctness, large_scale, real_strategy) def test_generated_claims_are_current() -> None: @@ -60,17 +61,19 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( added["status"] = "pass" correctness["records"].append(added) large_scale = generate_parity_claims._load_json(generate_parity_claims.LARGE_SCALE_EVIDENCE) + real_strategy = generate_parity_claims._load_json(generate_parity_claims.REAL_STRATEGY_EVIDENCE) monkeypatch.setattr(generate_parity_claims, "correctness_report_failures", lambda _: []) monkeypatch.setattr(generate_parity_claims, "large_scale_report_failures", lambda _: []) - claims = generate_parity_claims.render_claims(correctness, large_scale) + claims = generate_parity_claims.render_claims(correctness, large_scale, real_strategy) for pin in correctness["frameworks"].values(): assert pin["version"] in claims assert pin["source"] in claims assert f"`{pin['profile']}`" in claims assert "16/16 exact" in claims - assert "250 assets and 5,040 daily sessions (1,260,000 bars)" in claims + assert "synthetic stress workload contains 250 assets" in claims + assert "6/8 supported pairs pass" in claims for record in large_scale["frameworks"]: target = record["target"] checks = generate_parity_claims._comparison_checks(record) @@ -88,5 +91,7 @@ def test_claims_pin_every_advertised_framework_and_expose_failures( if record["framework"] == "zipline" and record["scenario_id"] == "15" ) failed_record["status"] = "comparison_failure" - failed_claims = generate_parity_claims.render_claims(failed_correctness, large_scale) + failed_claims = generate_parity_claims.render_claims( + failed_correctness, large_scale, real_strategy + ) assert "15/16 pass; blocked by scenario 15" in failed_claims diff --git a/tests/contracts/test_real_strategy_runner.py b/tests/contracts/test_real_strategy_runner.py index 053a9726..80d439ba 100644 --- a/tests/contracts/test_real_strategy_runner.py +++ b/tests/contracts/test_real_strategy_runner.py @@ -28,6 +28,15 @@ def _load_evidence(): return module +def _load_benchmark(): + path = Path(__file__).parents[2] / "validation" / "real_strategy_benchmark.py" + spec = importlib.util.spec_from_file_location("ml4t_real_strategy_benchmark", path) + assert spec is not None and spec.loader is not None + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + class _Broker: def __init__(self) -> None: self.cash = 1_000.0 @@ -128,3 +137,14 @@ def test_real_strategy_comparator_detects_one_quantum_mutation() -> None: "ml4t": mutated[0], "canonical_gap": "0.00000001", } + + +def test_real_strategy_benchmark_interval_is_deterministic() -> None: + benchmark = _load_benchmark() + values = [float(value) for value in range(1, 11)] + + first = benchmark.bootstrap_median_interval(values, draws=1_000, seed=7) + second = benchmark.bootstrap_median_interval(values, draws=1_000, seed=7) + + assert first == second + assert first[0] <= 5.5 <= first[1] diff --git a/validation/METHODOLOGY.md b/validation/METHODOLOGY.md index e29f658d..f38b99a2 100644 --- a/validation/METHODOLOGY.md +++ b/validation/METHODOLOGY.md @@ -1,6 +1,6 @@ # Validation Methodology -*Last updated: 2026-08-13* +*Last updated: 2026-08-14* ## Core Principle @@ -12,6 +12,17 @@ configurable knob is missing or misconfigured. The gap must be driven to zero. ## How It Works +### Evidence scope + +The primary cross-framework audit uses frozen inputs from three production case studies: ETF +allocation, CME futures, and crypto perpetual futures with funding. It compares only combinations +that the framework and frozen data carrier genuinely support. Model inference and target +construction happen before either engine runs, so both sides receive the same targets. + +The 17 synthetic scenarios test isolated execution conventions. The 250-asset synthetic workload +tests high event counts and broad state transitions. These two suites are diagnostic and stress +evidence, not evidence that a realistic strategy is equivalent. + ### 1. Configurable Code Paths Every behavioral choice that differs between backtesting frameworks is expressed as a configurable @@ -293,6 +304,7 @@ brokerage models can select different requirements. | Knob | ml4t Default | VectorBT | VBT evidence | Backtrader | Zipline protocol | LEAN | |------|-------------|----------|--------------|------------|---------|------| | `share_type` | integer | fractional | VBT-O | integer (BT-S) | integer (ZL-S) | integer (LN-S) | +| `share_rounding` | nearest | nearest | VBT-O | truncate (BT-S) | nearest (ZL-S) | nearest (LN-S) | | repeated entry | check position | ignore unless accumulation is enabled | VBT-O | adapter checks position | adapter checks position | adapter submits target delta | | `commission_model` | none | none | VBT-F | none (BT-C) | none (ZL-P) | `InteractiveBrokersFeeModel` (LN-M) | | `commission_rate` | 0% | 0% | VBT-F | 0% (BT-C) | -- | -- | @@ -311,13 +323,14 @@ percentage slippage overrides. controlled `Portfolio.from_orders` protocol. The retained native check verifies that short-sale cash is reported in the cash series but cannot fund new exposure. `backtrader` uses the measured framework defaults for costs, leverage, target headroom, missing bars, and late feeds. -`backtrader_strict` adds submission-time cash checks to reproduce Backtrader's enabled -`checksubmit` path. `zipline_strict` resolves to the same settings as `zipline`; both represent the +`backtrader_strict` adds submission-time cash checks and truncates target quantities to reproduce +Backtrader's enabled `checksubmit` and native integer-sizing paths. `zipline_strict` resolves to +the same settings as `zipline`; both represent the explicit comparison protocol described above. The native Zipline defaults remain separate. The `lean` profile represents only the named daily US-equity protocol above. Its stop settings are not part of the retained LEAN equivalence claim. -Large-scale evidence compares native ordered fills first, then reconstructs closed trades from the +Synthetic scale evidence compares native ordered fills first, then reconstructs closed trades from the canonical 1e-8 fill records for both engines. This prevents sub-quantum differences in a framework's post-hoc trade-table arithmetic from changing a trade derived from equivalent fills. The scenario suite separately compares each framework's native trade records. @@ -353,9 +366,9 @@ The controlled scale workload contains 250 assets and 5,040 daily sessions (1,26 ## Validation Harness -### Scenario Tests (17 scenarios x 4 frameworks) +### Synthetic Scenario Tests (17 scenarios x 4 frameworks) -The validation suite tests 17 scenarios against 4 external frameworks: +The validation suite tests 17 isolated conformance scenarios against 4 external frameworks: | ID | Scenario | What It Tests | |----|----------|---------------| @@ -377,11 +390,11 @@ The validation suite tests 17 scenarios against 4 external frameworks: | 16 | Regime Path Coverage | 1500 bars, 9 market regimes and sparse entries | | 17 | High Event Count | 1800 bars, up to 600 completed round trips | -### Large-Scale Validation (250 assets x 20 years) +### Synthetic Stress Validation (250 assets x 20 years) -Beyond scenario tests, the benchmark suite runs a full ranking strategy on 250 US equities -from 1998-2018. This produces 200K+ trades that are compared trade-by-trade between frameworks. -See `benchmark_suite.py` for the implementation. +The benchmark suite runs a generated ranking workload on 250 US equities from 1998-2018. It +produces more than 200,000 trades for record-volume and state-transition testing. See +`benchmark_suite.py` for the implementation. It is not a production case study. ### Running the Suite @@ -397,6 +410,16 @@ python validation/run_scenario.py --all # Large-scale benchmark python validation/benchmark_suite.py --profile backtrader_strict --framework backtrader + +# Compare retained real-strategy outputs +uv run python validation/real_strategy_evidence.py \ + --evidence-root PATH/TO/REAL_STRATEGY_OUTPUTS \ + --output validation/candidates/REAL_STRATEGY_RESULTS.candidate.json + +# Repeat engine-only timings for correctness-passing real-strategy pairs +uv run python validation/real_strategy_benchmark.py \ + --bundle-root PATH/TO/CONTENT_ADDRESSED_BUNDLES \ + --samples 10 ``` --- @@ -411,3 +434,6 @@ python validation/benchmark_suite.py --profile backtrader_strict --framework bac | Framework drivers | `validation/frameworks/` | | Benchmark suite | `validation/benchmark_suite.py` | | Scenario runner | `validation/run_scenario.py` | +| Real-strategy applicability | `validation/real_strategy_applicability.toml` | +| Real-strategy correctness evidence | `validation/REAL_STRATEGY_RESULTS.json` | +| Real-strategy performance evidence | `validation/REAL_STRATEGY_PERFORMANCE.json` | diff --git a/validation/README.md b/validation/README.md index 2aec745f..86a8a9a0 100644 --- a/validation/README.md +++ b/validation/README.md @@ -16,6 +16,9 @@ Validation is performed per-framework in isolated, locked environments. VectorBT requires pandas 3 while Zipline Reloaded 3.1.1 requires pandas below 3, so a shared comparison environment cannot reproduce the current target set. +The primary audit uses frozen market data and model-derived targets from three production case +studies. The scenario matrix and 250-asset workload are synthetic diagnostic and stress suites. + ## Retained Parity Claims @@ -86,7 +89,26 @@ runtime identity, input digests, adapter identity, and source provenance. Compar unavailable environments, adapter failures, subprocess failures, timeouts, skips, malformed records, missing pairs, duplicates, and incorrect required or unsupported counts fail the gate. -### Retained large-scale and performance evidence +### Retained real-strategy evidence + +```bash +# Compare previously generated native and ML4T outputs +uv run python validation/real_strategy_evidence.py \ + --evidence-root PATH/TO/REAL_STRATEGY_OUTPUTS \ + --output validation/candidates/REAL_STRATEGY_RESULTS.candidate.json + +# Repeat engine-only timings for correctness-passing pairs +uv run python validation/real_strategy_benchmark.py \ + --bundle-root PATH/TO/CONTENT_ADDRESSED_BUNDLES \ + --samples 10 +``` + +The content-addressed input bundles are materialized before engine execution. Each pair receives +the same frozen targets. Timing excludes input loading, inference, target construction, adapter +preparation, result extraction, serialization, and reporting. The performance runner refuses to +time a pair that did not pass the retained correctness comparison. + +### Retained synthetic scale and performance evidence ```bash # Validate retained reconstructable scale evidence @@ -144,6 +166,11 @@ validation/ ├── frameworks/ # Parameterized framework drivers (4 modules) ├── run_scenario.py # Unified CLI runner ├── run_all_correctness.py # Isolated release-gate correctness runner +├── real_strategy_applicability.toml # Supported case-study/framework pairs +├── real_strategy_comparison.py # Exact real-strategy comparator +├── real_strategy_benchmark.py # Repeated engine-only timings +├── REAL_STRATEGY_RESULTS.json # Retained correctness evidence +├── REAL_STRATEGY_PERFORMANCE.json # Retained engine timing evidence ├── large_scale_evidence.py # Reconstructable exact scale matrix ├── cross_framework_performance.py # Repeated controlled and idiomatic evidence ├── run_all_benchmarks.py # Compatibility route to the retained performance runner diff --git a/validation/REAL_STRATEGY_PERFORMANCE.json b/validation/REAL_STRATEGY_PERFORMANCE.json new file mode 100644 index 00000000..7803f449 --- /dev/null +++ b/validation/REAL_STRATEGY_PERFORMANCE.json @@ -0,0 +1,474 @@ +{ + "correctness_evidence_generated_at": "2026-08-14T21:50:26.236995+00:00", + "environment": { + "cpu_count": 24, + "frameworks": { + "backtrader": { + "access": "public", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "environment": ".venv-backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "python_env_var": "ML4T_BACKTRADER_PYTHON", + "required_scenarios": 17, + "scenario_matrix": true, + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "unsupported_scenarios": 0, + "version": "1.9.78.123" + }, + "lean": { + "access": "public", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "display_name": "LEAN", + "environment": ".venv-lean", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "python_env_var": "ML4T_LEAN_PYTHON", + "required_scenarios": 0, + "scenario_matrix": false, + "source": "https://github.com/QuantConnect/Lean", + "source_commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "unsupported_scenarios": 0, + "version": "18001" + }, + "vectorbt_oss": { + "access": "public", + "artifact": "vectorbt-1.1.0.tar.gz", + "display_name": "VectorBT OSS", + "environment": ".venv-vectorbt-oss", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "python_env_var": "ML4T_VECTORBT_OSS_PYTHON", + "required_scenarios": 16, + "scenario_matrix": true, + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "source_commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "unsupported_scenarios": 1, + "version": "1.1.0" + }, + "vectorbt_pro": { + "access": "licensed", + "display_name": "VectorBT Pro", + "environment": ".venv-vectorbt-pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "python_env_var": "ML4T_VECTORBT_PRO_PYTHON", + "required_scenarios": 17, + "scenario_matrix": true, + "source": "https://github.com/polakowo/vectorbt.pro", + "source_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "unsupported_scenarios": 0, + "version": "2026.6.27" + }, + "zipline": { + "access": "public", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "display_name": "Zipline Reloaded", + "environment": ".venv-zipline", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "python_env_var": "ML4T_ZIPLINE_PYTHON", + "required_scenarios": 16, + "scenario_matrix": true, + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "source_commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "unsupported_scenarios": 1, + "version": "3.1.1" + } + }, + "machine": "x86_64", + "platform": "Linux-6.8.0-136-generic-x86_64-with-glibc2.39", + "processor": "x86_64" + }, + "generated_at": "2026-08-14T22:02:59.708731+00:00", + "records": [ + { + "case_study": "etfs", + "correctness_status": "pass", + "framework": "vectorbt_pro", + "framework_engine": { + "ci_95_seconds": [ + 0.2877248858567327, + 0.3143139739986509 + ], + "maximum_seconds": 0.321378983091563, + "median_seconds": 0.30129249359015375, + "minimum_seconds": 0.2838830230757594, + "output_identity": { + "equity.parquet": "9bef5099c36b4a61b32670d19340ebb9f4adba07c63359a5c31a345ad51d1cd6", + "fills.parquet": "698baf228da467fcce287f6f7da4903b3421d2649b181e3905a3681905251ffd" + }, + "samples_seconds": [ + 0.3078031288459897, + 0.2877248858567327, + 0.31535538914613426, + 0.28730017109774053, + 0.29972767806611955, + 0.296694670105353, + 0.2838830230757594, + 0.30285730911418796, + 0.321378983091563, + 0.3143139739986509 + ] + }, + "framework_to_ml4t_median_ratio": 0.63734406854925, + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "ml4t_engine": { + "ci_95_seconds": [ + 0.46813473547808826, + 0.48135182401165366 + ], + "maximum_seconds": 0.5062140279915184, + "median_seconds": 0.4727313055191189, + "minimum_seconds": 0.4654777019750327, + "output_identity": { + "equity.parquet": "2b3109fecdfbc3beb73440b2cb7b622fea0eadfc420c789e8df0c12a910f204a", + "fills.parquet": "c5bc939502eb338df0b625c08d452519ec98613fdf7fcf67a1834e0ca03f0bc1", + "rejected_orders.parquet": "043204927e46137ca25cc0fa23883f4868af2b57f48c50d034fd56e113da12e8" + }, + "samples_seconds": [ + 0.46608604094944894, + 0.4712033399846405, + 0.4654777019750327, + 0.47425927105359733, + 0.5062140279915184, + 0.4701834300067276, + 0.46974061895161867, + 0.4876708099618554, + 0.4750328380614519, + 0.47705927421338856 + ] + } + }, + { + "case_study": "etfs", + "correctness_status": "pass", + "framework": "vectorbt_oss", + "framework_engine": { + "ci_95_seconds": [ + 0.17306407110299915, + 0.18181957793422043 + ], + "maximum_seconds": 0.21566205006092787, + "median_seconds": 0.17451222008094192, + "minimum_seconds": 0.1721026541199535, + "output_identity": { + "equity.parquet": "9bef5099c36b4a61b32670d19340ebb9f4adba07c63359a5c31a345ad51d1cd6", + "fills.parquet": "a563dc47e59cc8d1ecf49a490f1e83842e5c4ca67a6a56adb411a58eb0842646" + }, + "samples_seconds": [ + 0.17271609115414321, + 0.1734120510518551, + 0.1837726249359548, + 0.17510798503644764, + 0.17646493786014616, + 0.17332790791988373, + 0.18181957793422043, + 0.1721026541199535, + 0.21566205006092787, + 0.1739164551254362 + ] + }, + "framework_to_ml4t_median_ratio": 0.36925871041104746, + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "ml4t_engine": { + "ci_95_seconds": [ + 0.4680275656282902, + 0.4801189919235185 + ], + "maximum_seconds": 0.5001788369845599, + "median_seconds": 0.47260149905923754, + "minimum_seconds": 0.4633619370870292, + "output_identity": { + "equity.parquet": "2b3109fecdfbc3beb73440b2cb7b622fea0eadfc420c789e8df0c12a910f204a", + "fills.parquet": "c5bc939502eb338df0b625c08d452519ec98613fdf7fcf67a1834e0ca03f0bc1", + "rejected_orders.parquet": "043204927e46137ca25cc0fa23883f4868af2b57f48c50d034fd56e113da12e8" + }, + "samples_seconds": [ + 0.5001788369845599, + 0.48318234691396356, + 0.4722748331259936, + 0.47093891398981214, + 0.4633619370870292, + 0.48009940097108483, + 0.46378029813058674, + 0.4770556369330734, + 0.46870339196175337, + 0.47292816499248147 + ] + } + }, + { + "case_study": "etfs", + "correctness_status": "pass", + "framework": "backtrader", + "framework_engine": { + "ci_95_seconds": [ + 9.667390221497044, + 13.843348437454551 + ], + "maximum_seconds": 15.390819479012862, + "median_seconds": 10.112870517419651, + "minimum_seconds": 9.50694501097314, + "output_identity": { + "equity.parquet": "194818b08af3ceac17f2ff8b143d76184b63f95a92ab2db1ee4a13b903843d92", + "fills.parquet": "8fbc351395431fcaf3d986c1d72011520394fa202db5b25ea2a79f49f4c013ab", + "rejected_orders.parquet": "29756624602e47c7f667e995e892fd158828381420d570a8a8a65d23d84d617b" + }, + "samples_seconds": [ + 10.426955967908725, + 9.50694501097314, + 9.725007123081014, + 15.390819479012862, + 13.655269084963948, + 9.798785066930577, + 13.02946886094287, + 14.657228013966233, + 9.702260518912226, + 9.609773319913074 + ] + }, + "framework_to_ml4t_median_ratio": 23.220408605374217, + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "ml4t_engine": { + "ci_95_seconds": [ + 0.430571055971086, + 0.46572351013310254 + ], + "maximum_seconds": 0.48355723288841546, + "median_seconds": 0.43551647558342665, + "minimum_seconds": 0.429133758880198, + "output_identity": { + "equity.parquet": "c0d9b87df7d1d490134679c571414ee3f5d5dc96cba2fd81e18c24c920ee9b60", + "fills.parquet": "11fee07c68fa9550b8c9bfa8590940e33a0247db7640c280043b6eddcaf7fa12", + "rejected_orders.parquet": "12abf1f224c27116ad669c98592fc527880414b152e921de2fb362eb8c3815d3" + }, + "samples_seconds": [ + 0.43825321504846215, + 0.4314290499314666, + 0.429133758880198, + 0.4683438939973712, + 0.48355723288841546, + 0.43277973611839116, + 0.46572351013310254, + 0.4302571520674974, + 0.430571055971086, + 0.444610444130376 + ] + } + }, + { + "case_study": "etfs", + "correctness_status": "pass", + "framework": "zipline", + "framework_engine": { + "ci_95_seconds": [ + 3.956691594561562, + 4.069972718833014 + ], + "maximum_seconds": 4.293457298073918, + "median_seconds": 3.994884098530747, + "minimum_seconds": 3.940686154179275, + "output_identity": { + "equity.parquet": "e67ccdf71043cd216a9d8ea6f96f6cc0eba564907919ef1b867bce4726e36b31", + "fills.parquet": "611b2ca3adc8a24484dcee08d5fba4c9219c0c0c6f4b27d701db51ea98390572" + }, + "samples_seconds": [ + 4.018492441158742, + 4.079541471088305, + 4.023147796047851, + 3.9627670240588486, + 3.9712757559027523, + 3.940686154179275, + 3.9475881590042263, + 4.293457298073918, + 4.069972718833014, + 3.9657950301188976 + ] + }, + "framework_to_ml4t_median_ratio": 9.266386817235245, + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "ml4t_engine": { + "ci_95_seconds": [ + 0.4164497200399637, + 0.4516012701205909 + ], + "maximum_seconds": 0.5047315200790763, + "median_seconds": 0.4311156200710684, + "minimum_seconds": 0.41364461509510875, + "output_identity": { + "equity.parquet": "578498185c7abd3b869578c8492937a09ce6cf8904ea64650375587fd397952a", + "fills.parquet": "b068c42a1d63409086e4cc638aec586818f9025f661897e7bdd34e5e4d8f9c6f", + "rejected_orders.parquet": "043204927e46137ca25cc0fa23883f4868af2b57f48c50d034fd56e113da12e8" + }, + "samples_seconds": [ + 0.41557857510633767, + 0.4229783359915018, + 0.5047315200790763, + 0.43745689396746457, + 0.42477434617467225, + 0.4551242580637336, + 0.437978943111375, + 0.4516012701205909, + 0.4164497200399637, + 0.41364461509510875 + ] + } + }, + { + "case_study": "etfs", + "correctness_status": "pass", + "framework": "lean", + "framework_engine": { + "ci_95_seconds": [ + 2.887489428045228, + 3.3646027559880167 + ], + "maximum_seconds": 6.0475188188720495, + "median_seconds": 3.0153015080140904, + "minimum_seconds": 2.720208310056478, + "output_identity": { + "equity.parquet": "ce1426438d739bc4f923d852fa9972446ef3acb5906ac70a8a66678495ad7a4f", + "fills.parquet": "f987de663e3459a6a9e78c117d93807d2181fb261c375bb3f4d212072f5764cd", + "rejected_orders.parquet": "9e7aedba072cbcd23432976f03fb6edef656da961cd2e73dbd75188842b29c36" + }, + "samples_seconds": [ + 2.9472668361850083, + 6.0475188188720495, + 3.1162031220737845, + 2.720208310056478, + 2.832029588986188, + 2.887489428045228, + 3.015350027009845, + 3.3646027559880167, + 3.015252989018336, + 3.454807749018073 + ] + }, + "framework_to_ml4t_median_ratio": 5.202119620681108, + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "ml4t_engine": { + "ci_95_seconds": [ + 0.5633496295195073, + 0.6195018270518631 + ], + "maximum_seconds": 0.6607448949944228, + "median_seconds": 0.579629406449385, + "minimum_seconds": 0.5530728748999536, + "output_identity": { + "equity.parquet": "9d2ae671c05691680de1a947edc07b5805d3d17c4fffdb0d9cb002908d5d9189", + "fills.parquet": "6dabab0285fe7d1d41c6008f9db1910fd0eb5117ce132cda2eac13fa47581b18", + "rejected_orders.parquet": "043204927e46137ca25cc0fa23883f4868af2b57f48c50d034fd56e113da12e8" + }, + "samples_seconds": [ + 0.5560325291007757, + 0.5686522379983217, + 0.5780714668799192, + 0.5811873460188508, + 0.5530728748999536, + 0.62224833201617, + 0.5947634829208255, + 0.5706667299382389, + 0.6607448949944228, + 0.6195018270518631 + ] + } + }, + { + "case_study": "crypto_perps_funding", + "correctness_status": "pass", + "framework": "lean", + "framework_engine": { + "ci_95_seconds": [ + 2.879764577955939, + 3.7526830200804397 + ], + "maximum_seconds": 5.715309476945549, + "median_seconds": 2.941230505006388, + "minimum_seconds": 2.794232564046979, + "output_identity": { + "equity.parquet": "9fb5d72364e039e75a28a1dcb77c06082418d698cac2467de8dc0c84371d2762", + "fills.parquet": "93ca6c8936e944e5f077e5b9b272a5467bac5ae828650029fc198dacd33ef46b", + "rejected_orders.parquet": "9e7aedba072cbcd23432976f03fb6edef656da961cd2e73dbd75188842b29c36" + }, + "samples_seconds": [ + 2.9528271581511945, + 2.906595162814483, + 4.5487695201300085, + 2.794232564046979, + 2.90836218604818, + 3.0265224468894303, + 2.956596520030871, + 2.851166969863698, + 5.715309476945549, + 2.929633851861581 + ] + }, + "framework_to_ml4t_median_ratio": 4.377674960680803, + "input_bundle_sha256": "2acee3c8542043266e6f9c0dfc9434c95b4469ef6fcaf0556efc569fc9721cdd", + "ml4t_engine": { + "ci_95_seconds": [ + 0.662905823905021, + 0.6844377170782536 + ], + "maximum_seconds": 0.6992742058355361, + "median_seconds": 0.671870463527739, + "minimum_seconds": 0.6581363650038838, + "output_identity": { + "equity.parquet": "0b98b8b65e7cc6885a27f9ffff6268d6d15a82b613ab06e4e57bbf96805ef1c9", + "fills.parquet": "b19ec75bb792f9109356b3127ea8580935932b00a9fb9dae92a970f643d74705", + "rejected_orders.parquet": "043204927e46137ca25cc0fa23883f4868af2b57f48c50d034fd56e113da12e8" + }, + "samples_seconds": [ + 0.6621688180603087, + 0.6836541260126978, + 0.6924467631615698, + 0.662905823905021, + 0.6581363650038838, + 0.6674405999947339, + 0.6681335410103202, + 0.6764286709949374, + 0.6992742058355361, + 0.6756073860451579 + ] + } + } + ], + "schema_version": 1, + "timing_policy": { + "boundary": "engine call only", + "excluded": [ + "input loading", + "model inference", + "target construction", + "adapter preparation", + "result extraction", + "serialization", + "reporting" + ], + "interval": "10,000-draw percentile bootstrap of the sample median", + "measured_processes": 10, + "process_isolation": true, + "publication_scope": "only correctness-passing case-study/framework pairs", + "warmup_processes": 1 + } +} diff --git a/validation/REAL_STRATEGY_RESULTS.json b/validation/REAL_STRATEGY_RESULTS.json new file mode 100644 index 00000000..74e9c606 --- /dev/null +++ b/validation/REAL_STRATEGY_RESULTS.json @@ -0,0 +1,783 @@ +{ + "comparison_policy": { + "canonical_quantum": "0.00000001", + "fill_order": "canonical timestamp, asset, side, quantity, price, commission", + "meaning": "zero numeric gap after canonical quantization, not bit identity", + "rounding": "ROUND_HALF_EVEN", + "timestamp_domain": { + "cme_futures": "session date", + "crypto_perps_funding": "exact UTC event timestamp", + "etfs": "session date" + } + }, + "generated_at": "2026-08-14T21:50:26.236995+00:00", + "provenance": { + "adapters": { + "backtrader": "b71c5faab1aceb6bab1a766c0b5759092f1addda4b36ac92e43d8dd3d3f8eb69", + "lean_crypto": "82f1fbb6054fba25d74a4eabbc9ad4eae808caf89c00f560edefa63304da0dc4", + "lean_equity": "facb2ad161253472ef8f54bf7482cf403b7afadc0fd17cd8c145b16921561ca4", + "ml4t": "77fc95575ecbf298eb386967cb5c49629a51efd7269dbdcdaec3c214de04ad8d", + "vectorbt_oss": "7c2c296ed741bf4bfba0777861fddfc59ae75367a0305dbb36f6b4bb0f4ffcbe", + "vectorbt_pro": "7c2c296ed741bf4bfba0777861fddfc59ae75367a0305dbb36f6b4bb0f4ffcbe", + "zipline": "73d98aa4403132353cfbef3b178a35a7a8b349921ff1c82b13c6b0508dcc7fba" + }, + "applicability_sha256": "9449052970c6b76f75775d0b72075b412bf6fd9d0ef24d4af30c34fdf0857a3b", + "cpu_count": 24, + "frameworks": { + "backtrader": { + "access": "public", + "artifact": "backtrader-1.9.78.123-py2.py3-none-any.whl", + "display_name": "Backtrader", + "environment": ".venv-backtrader", + "immutable_id": "sha256:9a07a516b0de9155539a35c56e9404d8711dd7020b3d37b30495e83e1b9d5dfd", + "license": "GPL-3.0-or-later", + "package": "backtrader", + "profile": "backtrader_strict", + "python": "3.12 audit interpreter; upstream package metadata does not declare a range", + "python_env_var": "ML4T_BACKTRADER_PYTHON", + "required_scenarios": 17, + "scenario_matrix": true, + "source": "https://pypi.org/project/backtrader/1.9.78.123/", + "unsupported_scenarios": 0, + "version": "1.9.78.123" + }, + "lean": { + "access": "public", + "artifact": "quantconnect/lean@sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "cli_immutable_id": "sha256:eaa4c08f16295b76f005e429d9ca0d0453784dc1a40c1f5cbe5e50c02a05bd7c", + "cli_version": "1.0.228", + "display_name": "LEAN", + "environment": ".venv-lean", + "immutable_id": "sha256:ecd62b0e418d40d1d7c0cd95e90a94e397642a21d2c8810614830c8a4e9a8f70", + "license": "Apache-2.0", + "package": "lean", + "platform_artifact": "linux/amd64@sha256:cbe3f26b3f16c57be836b2cf913253d434f58e010c84ed038360d26b9df88307", + "profile": "lean", + "python": "3.11", + "python_env_var": "ML4T_LEAN_PYTHON", + "required_scenarios": 0, + "scenario_matrix": false, + "source": "https://github.com/QuantConnect/Lean", + "source_commit": "278fcb3d1b815b63ccadba68d7ae54422e34b792", + "unsupported_scenarios": 0, + "version": "18001" + }, + "vectorbt_oss": { + "access": "public", + "artifact": "vectorbt-1.1.0.tar.gz", + "display_name": "VectorBT OSS", + "environment": ".venv-vectorbt-oss", + "immutable_id": "sha256:67a3b41466234485af70c18d201da105f1ebb2c1d1fac079db20059e45ddc73b", + "license": "Apache-2.0 WITH Commons-Clause", + "package": "vectorbt", + "profile": "vectorbt_oss_strict", + "python": ">=3.11,<3.15", + "python_env_var": "ML4T_VECTORBT_OSS_PYTHON", + "required_scenarios": 16, + "scenario_matrix": true, + "source": "https://pypi.org/project/vectorbt/1.1.0/", + "source_commit": "259d2d89fe2e7638baf3ca76c394937cd32b656d", + "unsupported_scenarios": 1, + "version": "1.1.0" + }, + "vectorbt_pro": { + "access": "licensed", + "display_name": "VectorBT Pro", + "environment": ".venv-vectorbt-pro", + "immutable_id": "git:6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "license": "Proprietary", + "package": "vectorbtpro", + "profile": "vectorbt_strict", + "python": ">=3.11", + "python_env_var": "ML4T_VECTORBT_PRO_PYTHON", + "required_scenarios": 17, + "scenario_matrix": true, + "source": "https://github.com/polakowo/vectorbt.pro", + "source_commit": "6e18cf0aa37849cfc20848f40f1d26ecfdc771b4", + "unsupported_scenarios": 0, + "version": "2026.6.27" + }, + "zipline": { + "access": "public", + "artifact": "zipline_reloaded-3.1.1.tar.gz", + "display_name": "Zipline Reloaded", + "environment": ".venv-zipline", + "immutable_id": "sha256:4a305524616f7aad836f929e5a2ba5afc7db0e238757f47eb49487d9e2457a6f", + "license": "Apache-2.0", + "package": "zipline-reloaded", + "profile": "zipline_strict", + "python": ">=3.10", + "python_env_var": "ML4T_ZIPLINE_PYTHON", + "required_scenarios": 16, + "scenario_matrix": true, + "source": "https://pypi.org/project/zipline-reloaded/3.1.1/", + "source_commit": "09885a2ebc7567d40942c891b3879dc03c745070", + "unsupported_scenarios": 1, + "version": "3.1.1" + } + }, + "machine": "x86_64", + "ml4t": { + "commit": "ae6eadfb3de3b5cd00425ae8598c839bb2eddcec", + "dirty": false, + "engine_source_sha256": "d0e58bd4d73e7d942a16c9e162b273a7e123cda55ecc8a262ef0cc5c1169aebe" + }, + "platform": "Linux-6.8.0-136-generic-x86_64-with-glibc2.39", + "python": "3.12.11" + }, + "records": [ + { + "case_study": "etfs", + "engine_seconds": { + "framework": 0.4040620180312544, + "ml4t": 0.629301629960537, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "537c660c711d2a1fd21aa69b4f8532f7fdeeca5b6dcef7ee9511051ce12fdff7", + "ml4t_manifest_sha256": "7dea74cbf3c9b8285effdbad1571c03dd50c9fe195f0910ba9abf5090233b6f9" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "vectorbt_pro", + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "vectorbt_strict", + "status": "pass", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 0, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1995 + }, + "first_divergence": null, + "framework_records": 1995, + "framework_sha256": "2a90d6fb0aba61ab170d077e3c648f46bd719a3fd286625e393827b9bd40aef5", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1995, + "ml4t_sha256": "35b169e25c0face2b5e714bcef7f8a871eb1202ef26dca0a8e363dde0b9c35f4", + "passed": true + }, + "fills": { + "first_divergence": null, + "framework_records": 2466, + "framework_sha256": "4fd8e258ca5d6c1b682bbdfc5c36676ab0ba7a50c4b825be460ce628852e5639", + "max_canonical_difference": "0.00000000", + "ml4t_records": 2466, + "ml4t_sha256": "8e7fa6334fe7e70a236ecf5b326cca611cca899a2e578157b4616782b9766a9e", + "passed": true + }, + "terminal": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "11db1c456d36b30c4d6fe19414e21296ed1ea78289f54c50e82b6034b7f8c883", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "57b2a04fa64b67afab474dfd60eb02467ce8f45f4b1a6334192432ff1620eba7", + "passed": true + } + } + }, + { + "case_study": "etfs", + "engine_seconds": { + "framework": 0.3250391921028495, + "ml4t": 0.5358219449408352, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "42955db895abf309fcacdd0b285d3760b40c1ce56f4d2ccaa379c6e20dc9668c", + "ml4t_manifest_sha256": "2f9ba57e88936b70d97c18e0544939dde5129698950df565be350476ad3f69e1" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "vectorbt_oss", + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "vectorbt_oss_strict", + "status": "pass", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 0, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1995 + }, + "first_divergence": null, + "framework_records": 1995, + "framework_sha256": "2a90d6fb0aba61ab170d077e3c648f46bd719a3fd286625e393827b9bd40aef5", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1995, + "ml4t_sha256": "35b169e25c0face2b5e714bcef7f8a871eb1202ef26dca0a8e363dde0b9c35f4", + "passed": true + }, + "fills": { + "first_divergence": null, + "framework_records": 2466, + "framework_sha256": "4fd8e258ca5d6c1b682bbdfc5c36676ab0ba7a50c4b825be460ce628852e5639", + "max_canonical_difference": "0.00000000", + "ml4t_records": 2466, + "ml4t_sha256": "8e7fa6334fe7e70a236ecf5b326cca611cca899a2e578157b4616782b9766a9e", + "passed": true + }, + "terminal": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "11db1c456d36b30c4d6fe19414e21296ed1ea78289f54c50e82b6034b7f8c883", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "57b2a04fa64b67afab474dfd60eb02467ce8f45f4b1a6334192432ff1620eba7", + "passed": true + } + } + }, + { + "case_study": "etfs", + "engine_seconds": { + "framework": 10.37365989596583, + "ml4t": 0.494711043080315, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "06c7afb82b6f1197105a9262620101d9e497e458e21dfba4981e597ace112389", + "ml4t_manifest_sha256": "99085680175eaa147282e4c5cdf588c56890937e4069151e92574f2c3987bbcc" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "backtrader", + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "backtrader_strict", + "status": "pass", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 0, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1995 + }, + "first_divergence": null, + "framework_records": 1995, + "framework_sha256": "e24fb0355c02e8e6fd24c3a050d058244d48d900682f1242e41938482a45affb", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1995, + "ml4t_sha256": "2f657ea8deecd915e43d5f207661f1907358bc3172eca4e7f56cfc4b105fbd8f", + "passed": true + }, + "fills": { + "first_divergence": null, + "framework_records": 2433, + "framework_sha256": "0efdc5bd3df5c4ee32d9e7601a0a0f205ca338c61217271432830cc5728767ea", + "max_canonical_difference": "0.00000000", + "ml4t_records": 2433, + "ml4t_sha256": "3535fd059ff949dafefd38383f3883a273073b0d982f8d19ba682137e5c3e629", + "passed": true + }, + "rejection_count": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "cc5553d35594bb9f739671460ea2ddfbc7151b631d07ad81792942dd32c22cf9", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "cc5553d35594bb9f739671460ea2ddfbc7151b631d07ad81792942dd32c22cf9", + "passed": true + }, + "terminal": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "bab10acfe67a203e84aa8ee135c37a84462af6281afc20dc288ccc96a6af1f1a", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "e00b039f6819ab12344af27396c8915f76913726e723c079d6f2c80edb0df0f6", + "passed": true + } + } + }, + { + "case_study": "etfs", + "engine_seconds": { + "framework": 5.272912076907232, + "ml4t": 0.46331586595624685, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "7d0010410e06ed7a611343cbf39d2f35fe55c4f97d47e7c53aa7ff8daf0a894a", + "ml4t_manifest_sha256": "60b202562c59b89c1a8c3b9cb1cbae27ede358d66370fa3b8eed88c4f1442e2a" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "zipline", + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "zipline_strict", + "status": "pass", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 0, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1995 + }, + "first_divergence": null, + "framework_records": 1995, + "framework_sha256": "a5face19b441f6cf41b92e81c4458eff3428a7835cd4465c468c4e3d75ff311d", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1995, + "ml4t_sha256": "8bafee4ab985e6e89429cdaa327caabe06d92af700c03587e5d9e6459e499e25", + "passed": true + }, + "fills": { + "first_divergence": null, + "framework_records": 2458, + "framework_sha256": "e7845f778289a093b7b13703938ac1aff36060e55841c658fa3c4cfaf7d66e80", + "max_canonical_difference": "0.00000000", + "ml4t_records": 2458, + "ml4t_sha256": "c78d44621cdcd2f4b2e1797ba6b0a50a76555f210597189a73ab57ec5f8ea672", + "passed": true + }, + "terminal": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "def79e34efb8b45e3f792ede075b8cdc2bb7e409b26d6e2584f5c5d7f9486726", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "4e87bd8a979d23c1189bde4d37dcbf51f9a32462a653e436223e7cf29dc494b8", + "passed": true + } + } + }, + { + "case_study": "etfs", + "engine_seconds": { + "framework": 4.122711522039026, + "ml4t": 0.5797442020848393, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "250cf56114937129fb657a4749e9beb026f4e077d356a7a1d7e8cf51c50e2fc2", + "ml4t_manifest_sha256": "61b1a6aa4240235b89e4b1b8e3c481081da43047f4a8f5d2fbe5ff67d9cc20ba" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "compared separately for LEAN equities", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "lean", + "input_bundle_sha256": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "lean", + "status": "pass", + "surfaces": { + "cash": { + "coverage": { + "framework_only_timestamps": 5, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1995 + }, + "first_divergence": null, + "framework_records": 1995, + "framework_sha256": "16f270b64f43ed22739d234d1b7abe1611c253828a5964411aae8fa3955b9730", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1995, + "ml4t_sha256": "30beda4a3a1167d861ee2c16622ef00c00ded113c1acf6dea0b8eaf0b78fd76e", + "passed": true + }, + "equity": { + "coverage": { + "framework_only_timestamps": 5, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1995 + }, + "first_divergence": null, + "framework_records": 1995, + "framework_sha256": "7959271a1f6e2dc65ee85a40114db98334a8852941a2fea28948bdf9eaeff5d1", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1995, + "ml4t_sha256": "90912934200276e9da497a2ac61e5b459b660815f3b63f43c971e4c4f553b092", + "passed": true + }, + "fills": { + "first_divergence": null, + "framework_records": 2457, + "framework_sha256": "bb7685c44f3439854f69c28ed45f00cf6590c41fb4186e008bfc5ec8854c8f34", + "max_canonical_difference": "0.00000000", + "ml4t_records": 2457, + "ml4t_sha256": "bb7685c44f3439854f69c28ed45f00cf6590c41fb4186e008bfc5ec8854c8f34", + "passed": true + }, + "rejection_count": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "59fbab4bac7cb12eee5b33c7df3f95e89686eb8f430c84695e63c7557c702414", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "59fbab4bac7cb12eee5b33c7df3f95e89686eb8f430c84695e63c7557c702414", + "passed": true + }, + "terminal": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "dcdf690e7ea4a122b3ca6a083112a518058dc72bdba2bb120334d4b9636f47fc", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "4e9b140ade6e038a406e3a9332649f239d317a7666468785ce8a1c7f89318bff", + "passed": true + } + } + }, + { + "case_study": "cme_futures", + "engine_seconds": { + "framework": 0.4237614271696657, + "ml4t": 0.5547289319802076, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "781c018b31759e5eaf2297f7dcf13b36494c3430a334f4fa2e1df5adbfed7b2b", + "ml4t_manifest_sha256": "c142a3136033d6f7caf2e40a2603d784d7e858d6eb754829ea328a0a084dc5ca" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "vectorbt_pro", + "input_bundle_sha256": "c7191027f550ef1be0c9528dac08e7c2bf6a76c86d935f593efeb1ad8b628c39", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "vectorbt_strict", + "status": "fail", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 1, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1595 + }, + "first_divergence": { + "canonical_gap": "0.00000001", + "field": "equity", + "framework": { + "equity": "10000000.0", + "timestamp": "2019-01-04" + }, + "index": 310, + "kind": "record", + "ml4t": { + "equity": "9999999.999999993", + "timestamp": "2019-01-04" + } + }, + "framework_records": 1595, + "framework_sha256": "b1b40cf1cbcbc671db8670a19066dfaa77b497e6d03b06d83f087ad0a8aefc2c", + "max_canonical_difference": "0.00000010", + "ml4t_records": 1595, + "ml4t_sha256": "b3d629a19f386d6688964e89188f3ba27c95d34be5e96e22a1c9c8b83427a98b", + "passed": false + }, + "fills": { + "first_divergence": null, + "framework_records": 3545, + "framework_sha256": "33a8c1d5aac88de6255f5a23742619e68dcf77804f5158f02a910df265d5c154", + "max_canonical_difference": "0.00000000", + "ml4t_records": 3545, + "ml4t_sha256": "7588d63e48658ce630d22b814df79345ae7a8fdf53be1f133858f44b9f375971", + "passed": true + }, + "terminal": { + "first_divergence": { + "canonical_gap": "0.00000007", + "field": "final_value", + "framework": { + "final_value": "21780101.163148317" + }, + "index": 0, + "kind": "record", + "ml4t": { + "final_value": "21780101.16314839" + } + }, + "framework_records": 1, + "framework_sha256": "f0c1745e2a779c7b4127d81f854e355c791224c93f190167be7207250d8fe271", + "max_canonical_difference": "0.00000007", + "ml4t_records": 1, + "ml4t_sha256": "9f2c5af308ff360b1b6987eb84facaeeb98a44d08471480f4eeccb85ef11fc46", + "passed": false + } + } + }, + { + "case_study": "cme_futures", + "framework": "vectorbt_oss", + "reason": "no native futures contract multiplier and margin-account model", + "source": "https://vectorbt.dev/api/portfolio/base/", + "status": "unsupported" + }, + { + "case_study": "cme_futures", + "engine_seconds": { + "framework": 2.906314143911004, + "ml4t": 0.5458641869481653, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "ac82009ee99eecfe9436f521c40ff00414dadd623259e1ea2ab29b307f93151a", + "ml4t_manifest_sha256": "bb4c7129768bd4eb6a735d32eb0f57b06188f39961c89c4c3270faa2dd7acf37" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "backtrader", + "input_bundle_sha256": "c7191027f550ef1be0c9528dac08e7c2bf6a76c86d935f593efeb1ad8b628c39", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "backtrader_strict", + "status": "fail", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 1, + "ml4t_only_timestamps": 0, + "shared_timestamps": 1595 + }, + "first_divergence": { + "canonical_gap": "0.00000001", + "field": "equity", + "framework": { + "equity": "8260040.797423724", + "timestamp": "2019-02-01" + }, + "index": 330, + "kind": "record", + "ml4t": { + "equity": "8260040.7974237185", + "timestamp": "2019-02-01" + } + }, + "framework_records": 1595, + "framework_sha256": "420284821eb233db8012d42b32f4df081744545df7c98df38e974ef87b8d8d1c", + "max_canonical_difference": "0.00000015", + "ml4t_records": 1595, + "ml4t_sha256": "89ba33c5e41e25db2aec0cb23ce625fbe8b2ff7ff1109f4d461dc9956105b7f1", + "passed": false + }, + "fills": { + "first_divergence": null, + "framework_records": 3376, + "framework_sha256": "079faf95a56575dca51207bf0587d0d792fe66dff32021f19d85114d8b3dfcb0", + "max_canonical_difference": "0.00000000", + "ml4t_records": 3376, + "ml4t_sha256": "4e8fc7f1acdbf85567d0c8148f2b1532dee362b1f4913058851d29a5e20896ee", + "passed": true + }, + "rejection_count": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "59fbab4bac7cb12eee5b33c7df3f95e89686eb8f430c84695e63c7557c702414", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "59fbab4bac7cb12eee5b33c7df3f95e89686eb8f430c84695e63c7557c702414", + "passed": true + }, + "terminal": { + "first_divergence": { + "canonical_gap": "0.00000015", + "field": "final_value", + "framework": { + "final_value": "37957959.26743194" + }, + "index": 0, + "kind": "record", + "ml4t": { + "final_value": "37957959.26743179" + } + }, + "framework_records": 1, + "framework_sha256": "6ba61c2f2bdff3890ecbfac82425f15f4c2efaec002753bc6c31b52636106e10", + "max_canonical_difference": "0.00000015", + "ml4t_records": 1, + "ml4t_sha256": "66cdabf91ff8007a7010c0f36cf05e84eb4d4944a3bb85d8b296463ebdfe908a", + "passed": false + } + } + }, + { + "case_study": "cme_futures", + "framework": "zipline", + "reason": "the frozen workload has continuous root series but no dated contract chain or roll map", + "source": "https://zipline.ml4trading.io/api-reference.html", + "status": "unsupported" + }, + { + "case_study": "cme_futures", + "framework": "lean", + "reason": "the frozen workload has continuous root series but no dated contract chain or roll map", + "source": "https://www.quantconnect.com/docs/v2/writing-algorithms/securities/asset-classes/futures", + "status": "unsupported" + }, + { + "case_study": "crypto_perps_funding", + "framework": "vectorbt_pro", + "reason": "no native perpetual-futures funding and margin-account model", + "source": "https://vectorbt.pro/features/portfolio/", + "status": "unsupported" + }, + { + "case_study": "crypto_perps_funding", + "framework": "vectorbt_oss", + "reason": "no native perpetual-futures funding and margin-account model", + "source": "https://vectorbt.dev/api/portfolio/base/", + "status": "unsupported" + }, + { + "case_study": "crypto_perps_funding", + "framework": "backtrader", + "reason": "no native perpetual-futures funding model", + "source": "https://www.backtrader.com/docu/commission-schemes/commission-schemes/", + "status": "unsupported" + }, + { + "case_study": "crypto_perps_funding", + "framework": "zipline", + "reason": "no crypto perpetual-futures asset and funding model", + "source": "https://zipline.ml4trading.io/api-reference.html", + "status": "unsupported" + }, + { + "case_study": "crypto_perps_funding", + "engine_seconds": { + "framework": 4.180981411831453, + "ml4t": 0.7640254779253155, + "single_run_diagnostic_only": true + }, + "evidence": { + "framework_manifest_sha256": "a20e2e83439deeecc0e1ab9e1be959a31957dd8393bd15bd1f7e36d3a3c85e7a", + "ml4t_manifest_sha256": "65751e1fd35a5ab468c81c07a986193e377e547b8e0a44328f6aed687eaa3043" + }, + "excluded_surfaces": { + "accepted_unfilled_orders": "not exposed by every native runner", + "cash": "not exposed with common accounting semantics", + "closed_trades": "not a common native framework concept", + "intents": "shared frozen target input is identified, but engines do not expose a common native intent log", + "positions": "not exposed in a common native record schema by every runner" + }, + "framework": "lean", + "input_bundle_sha256": "2acee3c8542043266e6f9c0dfc9434c95b4469ef6fcaf0556efc569fc9721cdd", + "negative_control": { + "detected": true, + "mutation": "first fill price + 0.00000001" + }, + "profile": "lean_crypto_future", + "status": "pass", + "surfaces": { + "equity": { + "coverage": { + "framework_only_timestamps": 0, + "ml4t_only_timestamps": 0, + "shared_timestamps": 2426 + }, + "first_divergence": null, + "framework_records": 2426, + "framework_sha256": "e6dd17ae20dd049dc63534d4f83ddd2f663d036811e3aa588644a8a753dc6f22", + "max_canonical_difference": "0.00000000", + "ml4t_records": 2426, + "ml4t_sha256": "6bcc1f4bec12a1bf8cdc8ea800aae99f742295686e2529c5572c7590d863baf7", + "passed": true + }, + "fills": { + "first_divergence": null, + "framework_records": 8408, + "framework_sha256": "724263fa265d59ef7d650a7f168a35aa056af6db81b7934519a87bbebf281cf0", + "max_canonical_difference": "0.00000000", + "ml4t_records": 8408, + "ml4t_sha256": "b3e3877d7eded50fa0f5d168086fcfb9f1e18856a3506479f2312e48186d234f", + "passed": true + }, + "rejection_count": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "59fbab4bac7cb12eee5b33c7df3f95e89686eb8f430c84695e63c7557c702414", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "59fbab4bac7cb12eee5b33c7df3f95e89686eb8f430c84695e63c7557c702414", + "passed": true + }, + "terminal": { + "first_divergence": null, + "framework_records": 1, + "framework_sha256": "59a1167e8efd652cf03b0ce0b34c9612fdd03c2e653c0e282a007ca950140635", + "max_canonical_difference": "0.00000000", + "ml4t_records": 1, + "ml4t_sha256": "66c05a1c0dbc0b8b194846e4f2709cb7c887955f3d86049f6336a992c3967e6b", + "passed": true + } + } + } + ], + "schema_version": 1, + "scope": { + "case_studies": [ + "etfs", + "cme_futures", + "crypto_perps_funding" + ], + "frameworks": [ + "vectorbt_pro", + "vectorbt_oss", + "backtrader", + "zipline", + "lean" + ], + "real_strategy_equivalence_gate_passed": false, + "required_pairs": 8, + "unsupported_pairs": 7 + } +} diff --git a/validation/claim_inventory.toml b/validation/claim_inventory.toml index cd07aa66..6e7fd32d 100644 --- a/validation/claim_inventory.toml +++ b/validation/claim_inventory.toml @@ -3,7 +3,7 @@ schema_version = 1 audit_date = "2026-08-13" [[claim]] -id = "library-scenario-equivalence" +id = "library-synthetic-scenario-conformance" repository = "ml4t/backtest" paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/CORRECTNESS_RESULTS.json"] type = "correctness" @@ -12,6 +12,16 @@ required_evidence = ["executed_matrix", "canonical_trade_log", "canonical_fill_l status = "verified" issue = "ml4t/backtest-dev#3" +[[claim]] +id = "library-real-strategy-equivalence" +repository = "ml4t/backtest" +paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/REAL_STRATEGY_RESULTS.json", "validation/real_strategy_applicability.toml"] +type = "correctness" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["frozen_real_strategy_inputs", "complete_canonical_fill_log", "equity_curve", "terminal_value", "negative_control", "environment_identity"] +status = "failed" +issue = "ml4t/backtest-dev#3" + [[claim]] id = "library-vectorbt-behavior" repository = "ml4t/backtest" @@ -53,7 +63,7 @@ status = "verified" issue = "ml4t/backtest-dev#8" [[claim]] -id = "library-large-scale-equivalence" +id = "library-synthetic-scale-conformance" repository = "ml4t/backtest" paths = ["README.md", "docs/index.md", "docs/user-guide/profiles.md", "validation/README.md", "validation/METHODOLOGY.md", "validation/LARGE_SCALE_RESULTS.json"] type = "correctness" @@ -72,6 +82,16 @@ required_evidence = ["controlled_workload", "warmup_policy", "repetitions", "mac status = "verified" issue = "ml4t/backtest-dev#11" +[[claim]] +id = "library-real-strategy-performance" +repository = "ml4t/backtest" +paths = ["validation/real_strategy_benchmark.py", "validation/REAL_STRATEGY_PERFORMANCE.json", "validation/REAL_STRATEGY_RESULTS.json"] +type = "performance" +frameworks = ["vectorbt_pro", "vectorbt_oss", "backtrader", "zipline", "lean"] +required_evidence = ["correctness_passing_workload", "engine_only_timer", "warmup_policy", "repetitions", "machine_identity", "raw_timings", "output_identity"] +status = "verified" +issue = "ml4t/backtest-dev#11" + [[claim]] id = "library-idiomatic-performance" repository = "ml4t/backtest" diff --git a/validation/generate_parity_claims.py b/validation/generate_parity_claims.py index ac059cd2..5008d48a 100644 --- a/validation/generate_parity_claims.py +++ b/validation/generate_parity_claims.py @@ -16,6 +16,7 @@ PROJECT_ROOT = Path(__file__).parent.parent CORRECTNESS_EVIDENCE = PROJECT_ROOT / "validation" / "CORRECTNESS_RESULTS.json" LARGE_SCALE_EVIDENCE = PROJECT_ROOT / "validation" / "LARGE_SCALE_RESULTS.json" +REAL_STRATEGY_EVIDENCE = PROJECT_ROOT / "validation" / "REAL_STRATEGY_RESULTS.json" TARGETS = ( PROJECT_ROOT / "README.md", PROJECT_ROOT / "docs" / "index.md", @@ -36,7 +37,11 @@ def _load_json(path: Path) -> dict[str, Any]: return payload -def _validate_evidence(correctness: dict[str, Any], large_scale: dict[str, Any]) -> None: +def _validate_evidence( + correctness: dict[str, Any], + large_scale: dict[str, Any], + real_strategy: dict[str, Any], +) -> None: failures = correctness_report_failures(correctness) if failures: raise ValueError("Accepted correctness evidence is invalid: " + "; ".join(failures)) @@ -54,6 +59,21 @@ def _validate_evidence(correctness: dict[str, Any], large_scale: dict[str, Any]) scale_failures = large_scale_report_failures(large_scale) if scale_failures: raise ValueError("Accepted large-scale evidence is invalid: " + "; ".join(scale_failures)) + scope = real_strategy.get("scope") + real_records = real_strategy.get("records") + if ( + real_strategy.get("schema_version") != 1 + or not isinstance(scope, dict) + or not isinstance(real_records, list) + ): + raise ValueError("Real-strategy evidence is malformed") + if scope.get("required_pairs") != 8 or scope.get("unsupported_pairs") != 7: + raise ValueError("Real-strategy evidence does not cover the declared applicability matrix") + required = [record for record in real_records if record.get("status") != "unsupported"] + if len(required) != 8: + raise ValueError("Real-strategy evidence lacks required pair records") + if not all(record.get("negative_control", {}).get("detected") is True for record in required): + raise ValueError("Real-strategy evidence lacks a passing negative control") def _comparison_checks(record: dict[str, Any]) -> dict[str, dict[str, Any]]: @@ -67,13 +87,19 @@ def _comparison_checks(record: dict[str, Any]) -> dict[str, dict[str, Any]]: } -def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> str: +def render_claims( + correctness: dict[str, Any], + large_scale: dict[str, Any], + real_strategy: dict[str, Any], +) -> str: """Render the canonical documentation block.""" - _validate_evidence(correctness, large_scale) + _validate_evidence(correctness, large_scale, real_strategy) frameworks = correctness["frameworks"] records = correctness["records"] correctness_url = f"{GITHUB_EVIDENCE_ROOT}/CORRECTNESS_RESULTS.json" large_scale_url = f"{GITHUB_EVIDENCE_ROOT}/LARGE_SCALE_RESULTS.json" + real_strategy_url = f"{GITHUB_EVIDENCE_ROOT}/REAL_STRATEGY_RESULTS.json" + real_performance_url = f"{GITHUB_EVIDENCE_ROOT}/REAL_STRATEGY_PERFORMANCE.json" rows = [] for framework in SCENARIO_FRAMEWORKS: @@ -110,22 +136,72 @@ def render_claims(correctness: dict[str, Any], large_scale: dict[str, Any]) -> s workload = large_scale["workload"] recipe = workload["recipe"] + real_rows = [] + required_real = [ + record for record in real_strategy["records"] if record["status"] != "unsupported" + ] + passed_real = sum(record["status"] == "pass" for record in required_real) + real_targets = real_strategy["provenance"]["frameworks"] + case_labels = { + "etfs": "ETF allocation", + "cme_futures": "CME futures", + "crypto_perps_funding": "Crypto perpetual funding", + } + for record in required_real: + target = real_targets[record["framework"]] + pinned_framework = f"[{target['display_name']} {target['version']}]({target['source']})" + fills = record["surfaces"]["fills"] + equity = record["surfaces"]["equity"] + terminal = record["surfaces"]["terminal"] + if record["status"] == "pass": + result = ( + f"exact: {fills['framework_records']:,} fills, " + f"{equity['coverage']['shared_timestamps']:,} valuations, terminal" + ) + else: + result = ( + f"fills exact; equity gap {equity['max_canonical_difference']}; " + f"terminal gap {terminal['max_canonical_difference']}" + ) + real_rows.append( + f"| {case_labels[record['case_study']]} | {pinned_framework} | {result} | " + f"[real-strategy evidence]({real_strategy_url}) |" + ) return "\n".join( [ START_MARKER, "", "", - 'Scenario claims use the retained accepted matrix. "Exact" means terminal values, ' + "### Real-strategy audit", + "", + f"{passed_real}/{len(required_real)} supported pairs pass. The audit uses three " + "production-selected strategies with frozen historical market data and model-derived " + "targets. A pass requires zero numeric gap after 1e-8 quantization across every " + "shared valuation timestamp, the complete canonical fill stream, and terminal value. " + "The two CME rows retain exact fills but fail the equity and terminal checks.", + "", + "| Real strategy | Pinned framework | Current result | Evidence |", + "|---|---|---|---|", + *real_rows, + "", + f"Engine-only timing samples for the six passing pairs are retained in " + f"[real-strategy performance evidence]({real_performance_url}). These measurements " + "support only the named strategy, framework version, input bundle, and machine.", + "", + "### Synthetic diagnostic scenarios", + "", + 'The scenario matrix contains synthetic conformance tests. "Exact" means terminal values, ' "ordered closed trades, and ordered fills match after 1e-8 quantization. Each record " "declares whether a surface is native, reconstructed, aggregate-only, input-only, or " - "unavailable; the claim does not extend to unavailable order-lifecycle fields.", + "unavailable. These results test isolated conventions, not realistic strategy " + "equivalence.", "", "| Profile | Pinned framework | Required scenarios | Evidence |", "|---|---|---:|---|", *rows, "", - f"The controlled scale workload contains {recipe['assets']:,} assets and " + f"The synthetic stress workload contains {recipe['assets']:,} assets and " f"{recipe['bars']:,} daily sessions ({workload['data_points']:,} bars). Every row " "has zero canonical gap for target intents, native fills, closed trades reconstructed " "from those fills, and terminal state reconstructed from the fill ledger and final " @@ -150,7 +226,11 @@ def replace_claims(document: str, claims: str, *, path: Path) -> str: def synchronize(*, check: bool) -> list[Path]: """Write generated blocks or return documents that differ from evidence.""" - claims = render_claims(_load_json(CORRECTNESS_EVIDENCE), _load_json(LARGE_SCALE_EVIDENCE)) + claims = render_claims( + _load_json(CORRECTNESS_EVIDENCE), + _load_json(LARGE_SCALE_EVIDENCE), + _load_json(REAL_STRATEGY_EVIDENCE), + ) changed: list[Path] = [] for path in TARGETS: current = path.read_text(encoding="utf-8") diff --git a/validation/real_strategy_benchmark.py b/validation/real_strategy_benchmark.py new file mode 100644 index 00000000..db3183c4 --- /dev/null +++ b/validation/real_strategy_benchmark.py @@ -0,0 +1,280 @@ +#!/usr/bin/env python3 +"""Measure engine-only runtimes for correctness-passing real-strategy pairs.""" + +from __future__ import annotations + +import argparse +import json +import os +import platform +import random +import statistics +import subprocess +import tempfile +import tomllib +from datetime import UTC, datetime +from pathlib import Path +from typing import Any + +PROJECT_ROOT = Path(__file__).resolve().parents[1] +VALIDATION_DIR = PROJECT_ROOT / "validation" +BUNDLES = { + "etfs": "01f38079ce47821a5379d3769e86f4a2170b88033108153bfc0f928698e946db", + "cme_futures": "c7191027f550ef1be0c9528dac08e7c2bf6a76c86d935f593efeb1ad8b628c39", + "crypto_perps_funding": "2acee3c8542043266e6f9c0dfc9434c95b4469ef6fcaf0556efc569fc9721cdd", +} +PYTHONS = { + "ml4t": ".venv/bin/python", + "vectorbt_pro": ".venv-vectorbt-pro/bin/python", + "vectorbt_oss": ".venv-vectorbt-oss/bin/python", + "backtrader": ".venv-backtrader/bin/python", + "zipline": ".venv-zipline/bin/python", + "lean": ".venv/bin/python", +} +PROFILES = { + ("etfs", "vectorbt_pro"): ("vectorbt_strict", []), + ("etfs", "vectorbt_oss"): ("vectorbt_oss_strict", []), + ("etfs", "backtrader"): ("backtrader_strict", []), + ("etfs", "zipline"): ("zipline_strict", ["--price-decimals", "3"]), + ("etfs", "lean"): ("lean", ["--price-decimals", "4"]), + ("cme_futures", "vectorbt_pro"): ("vectorbt_strict", []), + ("cme_futures", "backtrader"): ("backtrader_strict", []), + ( + "crypto_perps_funding", + "lean", + ): ( + "lean_crypto_future", + [ + "--execution-specs", + "validation/lean/workspace/real_strategy_crypto_perps_funding/symbol_properties.json", + ], + ), +} +ADAPTERS = { + "vectorbt_pro": ("real_strategy_vectorbt.py", ["--framework", "vectorbt_pro"]), + "vectorbt_oss": ("real_strategy_vectorbt.py", ["--framework", "vectorbt_oss"]), + "backtrader": ("real_strategy_backtrader.py", []), + "zipline": ("real_strategy_zipline.py", []), + "lean": ("real_strategy_lean.py", []), +} + + +def bootstrap_median_interval( + values: list[float], *, draws: int = 10_000, seed: int = 20260814 +) -> tuple[float, float]: + """Return the percentile bootstrap 95 percent interval for a sample median.""" + if not values: + raise ValueError("Cannot bootstrap an empty timing sample") + generator = random.Random(seed) + medians = sorted( + statistics.median(generator.choices(values, k=len(values))) for _ in range(draws) + ) + return medians[int(0.025 * draws)], medians[int(0.975 * draws)] + + +def _command( + *, side: str, case_study: str, framework: str, bundle: Path, output: Path +) -> list[str]: + python = PROJECT_ROOT / PYTHONS[framework if side == "framework" else "ml4t"] + if side == "framework": + script, extra = ADAPTERS[framework] + if case_study == "crypto_perps_funding": + script = "real_strategy_lean_crypto.py" + return [ + str(python), + str(VALIDATION_DIR / script), + "--bundle", + str(bundle), + "--output", + str(output), + *extra, + ] + profile, extra = PROFILES[(case_study, framework)] + return [ + str(python), + str(VALIDATION_DIR / "real_strategy_runner.py"), + "--bundle", + str(bundle), + "--output", + str(output), + "--comparison-profile", + profile, + *extra, + ] + + +def _output_identity(manifest: dict[str, Any]) -> dict[str, str]: + retained = {"fills.parquet", "equity.parquet", "rejected_orders.parquet"} + return { + name: identity["sha256"] for name, identity in manifest["files"].items() if name in retained + } + + +def _run_once(command: list[str], output: Path) -> tuple[float, dict[str, str]]: + completed = subprocess.run( + command, + cwd=PROJECT_ROOT, + check=False, + capture_output=True, + text=True, + timeout=600, + ) + if completed.returncode != 0: + detail = (completed.stderr or completed.stdout).strip() + raise RuntimeError(f"Benchmark subprocess failed: {detail[-1000:]}") + manifest = json.loads((output / "manifest.json").read_text(encoding="utf-8")) + return float(manifest["engine_seconds"]), _output_identity(manifest) + + +def _measure_side( + *, + side: str, + case_study: str, + framework: str, + bundle: Path, + warmups: int, + samples: int, +) -> dict[str, Any]: + timings: list[float] = [] + identity: dict[str, str] | None = None + with tempfile.TemporaryDirectory(prefix="ml4t-real-benchmark-") as temporary: + temporary_root = Path(temporary) + for index in range(warmups + samples): + output = temporary_root / f"run-{index}" + command = _command( + side=side, + case_study=case_study, + framework=framework, + bundle=bundle, + output=output, + ) + runtime, current_identity = _run_once(command, output) + if identity is None: + identity = current_identity + elif current_identity != identity: + raise RuntimeError( + f"Output changed across repetitions for {case_study}/{framework}/{side}" + ) + if index >= warmups: + timings.append(runtime) + lower, upper = bootstrap_median_interval(timings) + return { + "samples_seconds": timings, + "median_seconds": statistics.median(timings), + "ci_95_seconds": [lower, upper], + "minimum_seconds": min(timings), + "maximum_seconds": max(timings), + "output_identity": identity, + } + + +def build_report( + *, + correctness: dict[str, Any], + bundle_root: Path, + warmups: int, + samples: int, +) -> dict[str, Any]: + """Measure every pair that passed the supplied correctness evidence.""" + passing = [record for record in correctness["records"] if record["status"] == "pass"] + records: list[dict[str, object]] = [] + for index, pair in enumerate(passing, start=1): + case_study = pair["case_study"] + framework = pair["framework"] + print(f"Timing {index}/{len(passing)} {case_study}/{framework}", flush=True) + bundle = bundle_root / case_study / BUNDLES[case_study] + framework_result = _measure_side( + side="framework", + case_study=case_study, + framework=framework, + bundle=bundle, + warmups=warmups, + samples=samples, + ) + ml4t_result = _measure_side( + side="ml4t", + case_study=case_study, + framework=framework, + bundle=bundle, + warmups=warmups, + samples=samples, + ) + records.append( + { + "case_study": case_study, + "framework": framework, + "input_bundle_sha256": pair["input_bundle_sha256"], + "correctness_status": "pass", + "framework_engine": framework_result, + "ml4t_engine": ml4t_result, + "framework_to_ml4t_median_ratio": ( + framework_result["median_seconds"] / ml4t_result["median_seconds"] + ), + } + ) + targets = tomllib.loads((VALIDATION_DIR / "framework_targets.toml").read_text()) + return { + "schema_version": 1, + "generated_at": datetime.now(UTC).isoformat(), + "timing_policy": { + "boundary": "engine call only", + "excluded": [ + "input loading", + "model inference", + "target construction", + "adapter preparation", + "result extraction", + "serialization", + "reporting", + ], + "warmup_processes": warmups, + "measured_processes": samples, + "process_isolation": True, + "interval": "10,000-draw percentile bootstrap of the sample median", + "publication_scope": "only correctness-passing case-study/framework pairs", + }, + "environment": { + "platform": platform.platform(), + "machine": platform.machine(), + "processor": platform.processor(), + "cpu_count": os.cpu_count(), + "frameworks": targets["framework"], + }, + "correctness_evidence_generated_at": correctness["generated_at"], + "records": records, + } + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument( + "--correctness", + type=Path, + default=VALIDATION_DIR / "candidates/REAL_STRATEGY_RESULTS.candidate.json", + ) + parser.add_argument("--bundle-root", type=Path, required=True) + parser.add_argument( + "--output", + type=Path, + default=VALIDATION_DIR / "candidates/REAL_STRATEGY_PERFORMANCE.candidate.json", + ) + parser.add_argument("--warmups", type=int, default=1) + parser.add_argument("--samples", type=int, default=10) + args = parser.parse_args() + if args.warmups < 1 or args.samples < 10: + raise ValueError("Benchmarks require at least one warmup and ten measured processes") + correctness = json.loads(args.correctness.read_text(encoding="utf-8")) + report = build_report( + correctness=correctness, + bundle_root=args.bundle_root.resolve(), + warmups=args.warmups, + samples=args.samples, + ) + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n", encoding="utf-8") + print(f"Retained {len(report['records'])} timing comparisons: {args.output}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/validation/release_checks.txt b/validation/release_checks.txt index 9b525587..dfbea790 100644 --- a/validation/release_checks.txt +++ b/validation/release_checks.txt @@ -21,6 +21,7 @@ validation/common/ml4t_runner.py validation/common/provenance.py validation/large_scale_evidence.py validation/real_strategy_corpus.py +validation/real_strategy_benchmark.py validation/real_strategy_evidence.py validation/real_strategy_runner.py validation/real_strategy_lean.py